Pythonで作成したWebアプリケーションをXserverで動作させる方法を説明します。XserverではCGIもしくはFastCGIで動作させます。
はじめに
XserverではWSGIではなく、CGIもしくはFaskCGIでPythonのWebアプリを動作させることができます。
ただ、Xserverにすでに導入されているPythonは追加でモジュールがインストールできない(pipが使えない)ので、新たにPythonをインストールする方法から説明します。
XserverにはSSH接続してサーバーに入って作業します。
SSH接続の方法は別の記事
で説明しているのでこちらを参照してください。
XserverにPythonをインストール
まずはXserverに入ってPythonをインストールします。
Xserverではsudoコマンドが使えないので、ユーザーとしてPythonをインストールする方法を説明します。
ここでは、minicondaをインストールします。
conda環境ですと複数のPythonをインストールしたり切り替えたり、仮想環境も作成できます。
Pythonバージョン3にはpipやvenvが標準で搭載されているので利用できますが、そのPythonをインストールするのにsudoコマンドが使えないのでaptでPythonをインストールできないです。
他のユーザー環境で使えるパッケージ管理ソフトをインストールしてから、それを使ってPythonをインストールする方法もあります。
よく目にするのが、linuxbrewをインストールしてそれを使ってPythonをインストールする方法です。
これでもよいのですが、linuxbrewがインストールできるかどうかが不安だったので、確実にPythonがインストールでき簡単に作業できるminicondaを選びました。
Anacondaだと少し容量が大きいので。。。
minicondaは直接ユーザー環境にインストールするので、パッケージ管理ソフトを使いません。
それではインストールしましょう。
Minicondaは下記サイトに行けばいろいろなパッケージを確認できます。
https://docs.conda.io/en/latest/miniconda.html
XserverはUbuntuが動作しています。
ここでは、Linux 64-bit版の最新をインストールします。
XserverにSSH接続で入って、以下のコマンドを実行してminicondaをダウンロードします。
$ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
ユーザー環境のトップにいてこのコマンドを実行すると「~/」配下にこのファイルがダウンロードされたと思います。
ダウンロードできたら以下のコマンドを実行します。
$ bash Miniconda3-latest-Linux-x86_64.sh
するとminicondaのインストールがはじまります。
途中で入力を求められたりしますが、すべてyesを入力して進めてください。
インストールが終了すると.bashrcにいろいろ記述されているので、以下のコマンドを実行して有効にします。
$ source .bashrc
condaコマンドが使えるかどうか以下のコマンドを実行して確認します。
$ conda --version
バージョン番号が出力されれば問題ありません。
また、コマンドプロンプトの左に「(base)」と表示されていればデフォルトのConda環境が動作しています。
(例)
(base) [<ユーザー名>@svxxxx ~]$
ついでにPythonの動作も確認しておきましょう。
$ python --version
Pythonのバージョン番号が出力されれば問題ありません。
これでPythonが使えるようになりました。
Conda環境を作成する
次にデフォルトのConda環境ではなく、Flaskその他のパッケージをインストールし動作させるConda環境を作成します。
ここではPythonのバージョンを3.9にしています。
以下のコマンドを実行して作成します。
$ conda create --name py39 python=3.9
ここでは”py39″という名前のConda環境を作成しています。
そして作成したConda環境を有効にします。
$ conda activate py39
するとコマンドプロンプトの左に「(py39)」と表示されます。
(例)
(py39) [<ユーザー名>@svxxxx ~]$
これで作成したConda環境のPythonが動作します。
どこにあるPythonが動作するのか確認してみましょう。
$ which python
~/miniconda3/envs/py39/bin/python
このように表示されます。
この環境にFlaskとその他必要なモジュールをインストールします。
まずはFlaskをインストールします。
$ conda install Flask
pipコマンドが使えるので以下のコマンドでもインストールできます。
$ python -m pip install Flask
どちらでもインストールして動作します。
これでWebアプリを作成する準備も整いました。
CGIで動作するWebアプリを作る
CGIで動作するPythonのWebアプリを作ります。
先程の作業の続きであればXserverに入っていると思いますが、そうでなければ再度SSH接続し、使用しているドメインのWebルートに移動します。
(例)
$ cd ~/<ドメイン>/public_html/
この記事ではテスト用にflaskフォルダを作り、そこにWebアプリを置きます。
(例)
$ mkdir flask
$ cd flask
$pwd
/home/<ユーザー名>/<ドメイン>/public_html/flask
Flaskを使ってCGIのWebアプリを作成するのに公式サイトの参考ページは以下です。
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/deploying/cgi.html
作成したflaskディレクトリ配下に作成するファイルは以下の3つです。
.
├── .htaccess
├── hello.py
└── index.cgi
index.cgiファイルは以下の内容となります。
先程作成したpy39のConda環境のPythonを動作させる例となります。
【index.cgi】パーミッション:755
#! /home/<ユーザー名>/miniconda3/envs/py39/bin/python
from wsgiref.handlers import CGIHandler
from hello import app
CGIHandler().run(app)
ここで書かれている「from hello import app」は「hello」がPythonのWebアプリのファイル名となり、「app」はここではFlaskオブジェクトを格納している変数名となります。
そのWebアプリとなるhello.pyは以下のように書きます。
【hello.py】パーミッション:600
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
そして、.htaccessファイルは以下の内容となります。
【.htaccess】パーミッション:644
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask/index.cgi/$1 [L]
</IfModule>
もし、常時SSLを使用するのであれば以下となります。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask/index.cgi/$1 [L]
</IfModule>
3つのファイルが用意できたら、ブラウザで「https://<ドメイン>/flask/」にアクセスして画面に
Hello World!
と表示されれば正しく動作しています。
FastCGIで動作するWebアプリを作る
XserverはFastCGIをサポートしています。
CGIのときの作業と同じくXserverにSSH接続して使用しているドメインのWebルートに移動します。
先程作成したflaskディレクトリへ移動し、FastCGI用のファイルを作成します。
Flaskを使ってFastCGIのWebアプリを作成するのに公式サイトの参考ページは以下です。
https://msiz07-flask-docs-ja.readthedocs.io/ja/latest/deploying/fastcgi.html
FastCGIで動作するWebアプリを作成するのに必要なファイルは以下です。
基本的にCGIと同じです。
.
├── .htaccess
├── hello.py
└── index.fcgi
FastCGIでは「.fcgi」ファイルを作成します。
ファイルを作成する前にFastCGIで動作するのに必要な「flup」モジュールをインストールしておきます。
以下のpipコマンドを実行してインストールします。
$ python -m pip install flup
index.fcgiファイルは以下の内容となります。
【index.fcgi】パーミッション:755
#! /home/<ユーザー名>/miniconda3/envs/py39/bin/python
from flup.server.fcgi import WSGIServer
from hello import app
if __name__ == '__main__':
WSGIServer(app).run()
そして、.htaccessに書いているファイル名をindex.fcgiに修正します。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ /flask/index.fcgi/$1 [L]
</IfModule>
もし、FastCGIのファイルもCGIと同じ拡張子「.cgi」を使って動作させたい場合は以下を.htaccessに追記します。
AddHandler index.cgi
これについてのXserverの参考サイトは以下です。
https://www.xserver.ne.jp/manual/man_server_php_fastcgi.php
Webアプリのhello.pyファイルはそのまま使用します。
ファイルが用意できたら、先程と同じようにブラウザで「https://<ドメイン>/flask/」にアクセスして画面に
Hello World!
と表示されれば正しく動作しています。
最後に
XserverではCGIとFastCGIは動作しますが、WSGIは動作しません。
いまのところWSGIが動作するレンタルサーバーは無いようです。
WSGIでPythonのWebアプリを動作させたい場合は、さくらのVPSのような自身でサーバーの構築ができるレンタルサーバーか、AWSやGoogle Cloud Platformのようなサーバーを利用するなどWSGIの環境を自身で構築することが必要です。