SSHが使えないレンタルサーバで、PythonのBottleを動かしてみた

SSHが使えないレンタルサーバにて、Webアプリを作る機会がありました。

SSHが使えないのでパッケージを入れることができないことから、ダウンロードすれば使えるフレームワークを探してみました。

すると、PythonのBottleというWeb frameworkが1ファイルで動作しそうなことが分かり、また同じようなレンタルサーバでも動作した実績がありました。

 
幸いにも、手元のレンタルサーバではBottleの動作条件を満たしていたことから、動かしてみることにしました。

 

環境

レンタルサーバ
  • SSHによる接続不可
  • Python 2.x系
  • Apache 2系
  • 使用できるディレクトリは以下の通り
    • 一般のhtmlとかは htdocsの下
    • CGIは専用ディレクトリの下(<your_host>/cgi/など)
  • .htaccessファイルによる設定可能

 

開発環境

   

環境調査

.htaccessの確認

FFFTPで接続したところ、

425 Unable to build data connection: Operation not permitted

というエラーになりました。

ドキュメントを見ると暗号化してはいけなさそうなので、FFFTPのHost Settingより、Host Setting > Encryption にある、Allow to connect without encryption にチェックを入れました。

 
再度FFFTPにて接続したところ、.htaccessファイルがありました。中身を確認したところ、

AddType application/x-httpd-php .php
Options -Indexes
SetEnv TZ JST-9

のような設定になっていました。

 

mod_pythonの確認

レンタルサーバ上でPythonCGImod_pythonのどちらで動作しているか分からなかったため、以下を参考に確認してみました。

 
なお、mod_pythonmod_python.cを指定すれば良さそうでした。
2.3.2 Configuring Apache - modpython.org

<IfModule mod_python.c>
  ErrorDocument 404 http://www.google.co.jp/
</IfModule>

 
その状態で存在しないURLへとアクセスしてもGoogleへは飛ばされなかったため、CGIで動作しているようでした。

 

Pythonスクリプトの動作確認

cgiディレクトリに入れた時の動作

以下を参考に、Pythonが動作するかを確認します。
Python CGIプログラミング入門 - Python CGIプログラミング入門

なお、Shebang(シバン)の内容は、レンタルサーバのドキュメントを参考に指定します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

print "Content-Type: text/plain;charset=utf-8"
print

print "test"

 
上記のファイルをレンタルサーバへとアップロードし、レンタルサーバのドキュメントを参考にパーミッションを変更します。

 
その状態で http://<your_host>/cgi/test.py へとアクセスすると、ブラウザ上にtestと表示されました。

また、test.cgiとリネーム・アップロード後、http://<your_host>/cgi/test.cgi へとアクセスした場合も、同じように動作しました。

 

htdocsディレクトリに入れた時の動作

同じようにして、htdocsディレクトリに入れ、http://<your_host>/test.pyへとアクセスしてみると、Pythonスクリプトのコードが表示され、Pythonスクリプトが動作していないようでした。

一方、http://<your_host>/test.cgiと入力したところ、Pythonスクリプトとして動作していました。

 

htdocsディレクトリでもPythonスクリプト(.py)を実行可能にする

.htaccessAddHandlerを追加します。

ただ、そのままではexample.py.htmlのようなファイルもPythonスクリプトとしてみなされてしまいます。

そのため、以下を参考に、<FilesMatch>を使って.pyファイルのみPythonスクリプトとして扱うようにしました。
ApacheのAddHandlerはセキュリティ上の懸念から使用すべきではない - Dマイナー志向

 
.htaccess全体は以下の通りになりました。

AddType application/x-httpd-php .php
Options -Indexes
SetEnv TZ JST-9

<FilesMatch \.py$>
  SetHandler cgi-script
</FilesMatch>

 

Bottleの動作確認

インストール

Bottleは1ファイルで動作するため、pipを使う必要はありません。

そのため、PyPIより現時点での最新版のbottle-0.12.8.tar.gzをダウンロードして展開します。
Index of Packages : Python Package Index

 
また、レンタルサーバのドキュメントで、文字コードutf-8、改行コードはLFと指定されていたので、bottle.pyを開いて文字コード・改行コードを変更します。

Visual Studio Codeの場合、画面右下の文字コードや改行コードの表示をクリックすれば変更することができました。

 

Bottleを使ったアプリの作成

BootleのドキュメントにあるスクリプトCGIで動くように修正します。なお、ファイル名はtest.pyとしました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)


if os.name == 'nt':
    # for local (Windows)
    run(host='0.0.0.0', port=8080, debug=True)
else:
    # for production (Linux)
    run(server='cgi')

 
その後、レンタルサーバへとアップロードし、パーミッションを変更します。なお、ディレクトリ構成は以下の通りです。

www\
├── cgi\
└── htdocs\
     ├── .htaccess
     ├── bottle.py
     └── test.py

 

動作確認

http://<your_host>/test.py/hello/worldへとアクセスしてページのソースを見ると、

<b>Hello world</b>!

となっていました。

これにより、Bottleが動作していることを確認できました。