最近PythonでDiscord Botを作って遊んでいた。カラフルボックスに設置して無事稼働している。
次はFlaskで何か作ってみたいなと思ったが、置く場所が確保できないと作る気が起きない。
というわけでこのブログを運営しているカラフルボックスに設置できないか試すことにして、試行錯誤の末に成功したのでメモを残すよ。
この記事ではFlaskアプリをカラフルボックスでCGIとして動かす方法、WSGIで動かす方法の2種類を解説する。
参考にしたサイト
pipが使えるPythonをインストールする
カラフルボックスではデフォルトでPythonが使えるのだが、デフォルトのPythonはpipが使えない。
しかしcPanelからPythonをインストールすると仮想環境が使えるようになってpipも使えるので、そちらを使ってインストールする。
スクリーンショットは少し古いが、公式による解説もある。
Pythonのインストール方法
まずcPanelにログインして「Setup Python App」をクリック。
CREATE APPLICATIONの画面で、Pythonのバージョンを選び、
- Application root
- Application URL
に適当な値を入力する。
Application URLはアクセスしたいURLがあればそこになるように設定する。なければ初期ドメインで大丈夫。
今回はどちらも「pytest」にした。他は空欄でOK。
なお画面下部でEnvironment variables(環境変数)も設定できる。これはインストール後でも随時変更可能。設定したい人はADD VARIABLEを押すと入力欄が出るので、入力が終わったらDONEを押す。
必要事項が入力できたら右上の「CREATE」を押す。
なお古いバージョンはこの記事を書いている時点ではなぜかインストールが上手くいかなかった。追記:3.9.12が動作しない件を問い合わせたら修正してもらえて、動作するようになった。
仮想環境に入る
インストールが完了するとこのような画面になる。画面上部に仮想環境に入るためのコマンドが表示されるので、クリックするとコピーされる。
今度はcPanelに戻ってTerminalに移動する。
これを使えばSSH接続しなくてもOKでお手軽。
ターミナル画面に入ったら、先程コピーしたコマンドを右クリックからペーストして、Enter。
仮想環境に入れたら、先頭に(フォルダ名:Pythonバージョン)が表示される。
この状態ではpipが使えるので、必要なものがあったら入れよう。今回はとりあえずflaskを入れた。
Pythonのインストールはここまでで完了。
カラフルボックス上でPythonの動作確認をしたい人は、ルート直下のフォルダに転送してターミナルから実行してみるのがおすすめ。インストールしたモジュールが読み込めるかなどを確認しよう。
ファイルの転送先について
Pythonをインストールすると、二つディレクトリが作られる。
ひとつはルート直下に/pytestが、もう一つは/public_html以下に/public_html/pytestが。
/pytestには自動でpassenger_wsgi.pyが作られるが、3.9.12以下でないと機能しない。サポートに問い合わせたところ3.10にはサーバープログラム(Litespeed)が未対応だそう。
そのためPythonのバージョンを3.10にしたかったらCGIとして動作させることになる。WSGIとして動作させたい場合は3.9.12以下にしよう。
CGIとして動作させる場合、ファイルの転送先は/public_html/pytestになる……んだと思う。WSGIとして動作させる場合は/pytestに転送する。
Flaskアプリを用意する
動作確認用のFlaskアプリを用意する。
今回は以下の記事で作成された「hoge.py」を若干変更したものを使用する。
具体的には最後のapp.run()の引数を全部消す。他はルーティングを試したいので全部そのまま。
if __name__ == "__main__":
app.run()
ローカルでの動作確認は各自でやっておこう。
この先はCGIとして動作させるか、WSGIとして動作させるかで分かれる。
CGIとして動作させる場合
追加で必要なファイルを用意する
CGIとして動作させる場合は追加で必要になるファイルがある。
- Flaskアプリを動作させるためのCGIファイル
- 動作に必要な.htaccessファイル
これらを用意する。
CGIファイル
CGIファイルはFlaskアプリを読み込むために使う。ファイル名はindex.cgiとしておく。
内容はFlaskのドキュメントにあるものと大差ないが、パスに注意。
#!/home/カラフルボックスユーザー名/virtualenv/pytest/3.10/bin/python3.10_bin
from wsgiref.handlers import CGIHandler
from hoge import app
CGIHandler().run(app)
カラフルボックスで仮想環境のPythonを使う実行パスが非常にわかりにくくて大変だった。正解はこの記事作成時点では上記。最後を/binで終えるのではなく/python3.10_binなのに気づくまで長かった……。
過去の記事では情報が異なっている場合があるので、また変わることがあるかもしれない。
.htaccess
.htaccessはPythonインストール時に/public_html/pytestに既に作成されているので、追記する。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ https://設置ドメイン/pytest/index.cgi/$1 [L]
#pyファイルなどへのアクセス遮断
<Files ~ ".(log|db|py)$">
deny from all
</Files>
書かれている内容の意味(上半分 RewriteEngine)
これはリダイレクトの設定。
- RewriteEngine On :リダイレクトをオンにする
- RewriteCond %{REQUEST_FILENAME} !-f :存在しないファイルにアクセスしたとき
- RewriteCond %{REQUEST_FILENAME} !-d :存在しないディレクトリにアクセスしたとき
- RewriteRule ^(.*)$ https://設置ドメイン/pytest/index.cgi/$1 [L] :このアドレスにリダイレクトする
転送するアドレスの末尾の「$1」はアクセスしたファイル名orディレクトリ名。これでFlaskのルーティングが機能するようになる。
ただしURLの表示は「index.cgi/ルーティング名」になってしまうので、スマートさはない。
リダイレクト設定について詳しく知りたい方はこの記事がおすすめ。
書かれている内容の意味(下半分 Files)
これはアクセス制御。
「<Files ~ ".(log|db|py)$">」で指定したファイルに対して「</Files>」以前までに書かれている内容を適用するというもの。
「".(log|db|py)$"」は正規表現で書かれていて、「末尾が.logまたは.dbまたは.pyで終わる」という意味。要するに拡張子。動作確認がてらアップロードするかもしれない拡張子を入れておいた。追記するならdbの隣に|で挟んで書けばOK。
「deny from all」は「ブラウザからのアクセスを全て拒否する」という意味。ファイルの存在はバレるので注意。
カラフルボックスは現在はpyファイルにアクセスするとダウンロードされてしまうので、忘れずに設定しよう。
アクセス制御について詳しく知りたい方はこの記事がおすすめ。
デフォルトで書き込まれている内容について
.htaccessファイルに最初から書き込まれていた内容は「このディレクトリにアクセスされたら/pytest/passenger_wsgi.pyを呼び出す」という内容。
WSGIで動作させるために必要なので、CGIとして動作させる場合もコメントアウトだけして残しておこう。
Flaskアプリ一式を転送する(CGIの場合)
用意したファイルをPythonインストールで作成されたディレクトリ(/public_html/pytest)へ転送する。
転送手段はお好みで。cPanelのファイルマネージャーでも送れるし、FTPソフトでもいい。おれはFileZillaだけどなぜ使い始めたかは覚えていない……。
転送したら、index.cgiのパーミッションを755にする。CGIとして動かす場合に必須の設定項目。
それが終わったらhttps://設置ドメイン/pytest/index.cgiにアクセスする。
- エラーが出ないか
- ローカルで動作確認した内容と同じになるか
- ルーティングがきちんとリダイレクトされて表示されるか
が確認のポイント。上手くいかないときはどこかの設定が間違っているので見直してみよう。
動作確認後にやること
今回の動作確認でPythonスクリプトをモジュールとして読み込んだため、設置ディレクトリの下に「__pycache__」というディレクトリができる。
この中に入っているファイルにアクセスされるのは望ましくないので、アクセス制御をする。
具体的には.htaccessファイルを「__pycache__」ディレクトリの中に入れる。内容は以下の一文だけでOK。
deny from all
追記:WSGIで動作させる場合
Pythonのバージョンが3.9.12以下でいい場合はWSGIで動作させることができる。
WSGIで動作させると、/public_html/pytest以下は空になるためセキュリティ上も好ましい。CGI方式でやったアクセス制御の数々も必要ないので楽。
Pythonのバージョンが最新でなくてもいい場合はWSGIがオススメ!
WSGIが動作しているか確かめる
WSGIの動作確認方法は簡単。まずPython App管理画面でSTART APPを押す。
インストール直後は押された状態になっていると思う。
次にもう少し下のApplication URL欄の右側の「OPEN」を押すと、ブラウザの別のウィンドウが開いて、https://設置ドメイン/pytest/にアクセスする。
WSGIが動作していれば、エラー画面にならず以下のように表示される。
エラーが出た場合は以下のことを確認しよう。
- Pythonのバージョンが合っているか(現時点では3.9.12以下でないと動作しない)
- /public_html/pytest/.htaccessを編集・削除していないか
- Pythonが正常にSTARTしているか
それでも解決しない場合は、FTPソフトで/pytest(/public_html/pytestではない)にアクセスするとエラーログ(stderr.log)が生成されているはずなので、内容を見てみよう。末尾に追記されていくので、最新のエラーは一番下。
エラーログを見て自分で解決できそうになければ、サポートに問い合わせると対応してもらえる。おれはWSGIが動作しないからと問い合わせて解決したよ!
Flaskアプリの動作確認をする
WSGIが動作するならFlaskアプリを送って動かしてみよう。
方法は一般的に言われていることと同じで、/pytest/passenger_wsgi.pyを編集する(もしくは、自分の好きなWSGIファイルを作って管理画面で指定する)。
以下の内容になればOK。追記したのは太字の部分だけ。
import os
import sys
sys.path.insert(0, os.path.dirname(__file__))
from hoge import app as application
他の部分はコメントアウトしておこう。
編集が終わったら/pytest(/public_html/pytestではない)にFlaskアプリを転送して、WSGI動作確認と同様、https://設置ドメイン/pytest/にアクセスする。ローカルと同じ表示になればOK!
エラーが出た場合は、
- PythonはSTARTしているか
- 必要なライブラリがインストールされているか
- Pythonのバージョン変更をしたら初回は入れ直しが必要なことに注意!
- passenger_wsgi.pyの内容に誤りがないか
- Flaskアプリの転送先を間違っていないか
- Flaskアプリはターミナルから起動できるか
を確認しよう。それでも解決しなければ/pytest/stderr.logを見たり、どうしてもダメならサポートに問い合わせたりしてみよう。カラフルボックスのサポートは親切だよ!
おまけ情報
cPanelのPython App管理画面でできることを2つ紹介。
Run Pip Install
インストール後の画面下部に「Run Pip Install」というボタンがある。
これは下のフォームにインストールしたいパッケージが書かれたファイル(require.txtとか)の名前を入力して「Add」を押した後に押せるようになる。
なおそのファイルはルート直下のApplication rootディレクトリに入れておく必要がある。
押すとpip installの結果が下のほうに表示される。
ターミナルでコマンド打つのがどうしても嫌な人向け。
Run Script
すぐ下にもう一つ「Execute python script」(Pythonスクリプト実行)という欄がある。
そこにルート直下のApplication rootディレクトリに入れたPythonスクリプト名を入力して「Run Script」ボタンを押すと、スクリプトをずっと実行し続けられる。
ただし、自動で止まらないスクリプトを停止させるときはターミナルからプロセスをkillする必要があるようだ。それが嫌な人はほかに止める手段を用意しておくこと。
ターミナルを抜けてもスクリプトを実行し続けるためにはnohupコマンドがあるけど、他にもこのように管理画面から簡単に実現できるのはどうやら全然知られていないっぽい。
自動で止まるスクリプトを定期的に実行したい方は以下のサイトの情報が参考になるよ。
おわりに
カラフルボックスはCLOUDLINUXというOSらしく、擬似的なVPS環境である。厳密にはVPSではないんだけど、かなり近い使い方ができる。
あくまで共用サーバーのためできることに制限はあるが、プログラミングを楽しんでいる人にはなかなかおすすめできるサーバー。
お試し期間が30日と長いのに加えて、途中で契約してもお試し期間はフルに残る点も魅力。
プログラミングやり始めて本当に思う。契約していてよかった~!!
<PR>