PythonのWebアプリをXserverで動かす(Flask編)

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の環境を自身で構築することが必要です。