CentOS + Apache環境でのFlaskの連携設定

カテゴリ:Python

以下では、CentOS 7+Apache環境でuWSGIを利用してFlaskを使用する方法を記載します。

Apacheのインストール

Apacheをインストールします。

# yum install -y httpd

PythonとPIPのインストール

PythonとPIPをインストールします。

# yum install -y epel-release
# yum install -y python3 python3-libs python3-devel python3-pip --enablerepo=epel

インストールされたPython3のバージョンは3.6.8になります。

# python3 -V
Python 3.6.8

Flaskのインストール

PIPでFlaskをインストールします。

# pip3 install flask

mod_proxy_uwsgiをインストール

以下より最新のepel-release rpmをダウンロードします。

http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/

# wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/m/mod_proxy_uwsgi-2.0.18-8.el7.x86_64.rpm

mod_proxy_uwsgiとuwsgi-plugin-python3のパッケージをインストールします。

# yum install -y mod_proxy_uwsgi uwsgi-plugin-python3

参考mod_proxy_uwsgi-2.0.18-8.el7.x86_64.rpm

Apacheの設定

/etc/httpd/conf.modules.d/00-proxy.confに以下を記述します。

LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_uwsgi_module modules/mod_proxy_uwsgi.so

リバースプロキシの設定

/etc/httpd/conf/httpd-proxy.confに以下を記述します。

Noteこの設定例では、Flaskアプリのルートは/api/とします。(http://example.com/api/にアクセスしてFlaskを実行)

<Location /api/>
    ProxyPass uwsgi://127.0.0.1:9090/
</Location>

/etc/httpd/conf/httpd.confの先頭に以下を記述します。

Include conf/httpd-proxy.conf

uWSGIの設定

この設定例では、FlaskアプリのパスとFlaskアプリファイル名を以下とします。実際のパス、ファイル名と置き換えてください。

Flaskアプリのパス/var/www/flask
Flaskアプリファイルmain.py

/var/www/flask/uwsgi.iniを作成して以下を記述します。

[uwsgi]
socket = 127.0.0.1:9090
module = main
callable = app
master = True
plugins = python3
logto = /var/log/uwsgi-flask.log

各パラメータの意味は以下となります。

socketFlaskアプリケーションがリスンするアドレスとポート番号
moduleFlaskアプリケーションのファイル名(拡張子を除く)
callableFlaskアプリケーションインスタンスを呼び出す変数名(app = Flask(__name__)であればapp)
masterソケットを閉じずに再起動する場合はTrueを指定
plugins読み込むプラグインを指定します(インストールしたuWSGIプラグイン(uwsgi-plugin-python3)のバージョンと合わせる必要があります)
logtoログの出力先

パーミッションの設定

Flaskの実行ディレクトリとファイルのパーミッションを以下のように設定します。

# chmod 640 /var/www/flask
# chmod 640 /var/www/flask/main.py
# chmod 640 /var/www/flask/uwsgi.ini
# ls -la /var/www/flask
合計 8
drw-r-----  3 root root   61  1月 14 08:21 .
drwxr-xr-x. 5 root root   46  1月 14 02:03 ..
-rw-r-----  1 root root 1645  1月 14 03:01 main.py
-rw-r-----  1 root root  113  1月 14 08:01 uwsgi.ini

/var/www配下は以下のような構成になります。

# tree -l /var/www
/var/www
├── cgi-bin
├── flask
│   ├── main.py
│   └── uwsgi.ini
└── html
     └── index.php

ApacheとuWSGIの再起動

ApacheとuWSGIを再起動します。

# apachectl restart
# uwsgi --ini /var/www/flask/uwsgi.ini

以上で完了です。http://localhost/api/にアクセスし、Flaskアプリの結果が表示されるかを確認してください。

自動起動の設定

OS起動時にuWSGIが自動起動するように、以下のサービススクリプトを作成します。

先に、uwsgiコマンドのパスを確認しておきます。

# which uwsgi
/usr/sbin/uwsgi

/etc/systemd/system/uwsgi.serviceファイルを作成し、以下を記述します。

[Unit]
Description = uWSGI
After = syslog.target

[Service]
WorkingDirectory=/var/www/flask
ExecStart = /usr/sbin/uwsgi --ini /var/www/flask/uwsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

サービスを開始します。

# systemctl start uwsgi

自動起動を有効にします。

# systemctl enable uwsgi

uwsgi.serviceのステータスがactive (running)であることが確認できます。

# systemctl status uwsgi
● uwsgi.service - uWSGI
   Loaded: loaded (/etc/systemd/system/uwsgi.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2021-01-22 07:08:48 JST; 3 days ago
 Main PID: 5988 (uwsgi)
   Status: "uWSGI is ready"
   CGroup: /system.slice/uwsgi.service
           ├─5988 /usr/local/bin/uwsgi --ini /var/www/flask/uwsgi.ini
           └─5990 /usr/local/bin/uwsgi --ini /var/www/flask/uwsgi.ini

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

注意上記のuwsgiのパスが、さっき確認したパスと違っています。その点については後述します。

設定変更後にInternal Server Errorとなる場合

一旦、Flaskのキャッシュを削除してみてください。

# rm -fr /var/www/flask/__pycache__/

uWSGIのログで「unavailable modifier requested: 0」となる場合

which uwsgiコマンドではuwsgiのパスはRPMでインストールした直後は/usr/sbin/uwsgiであったが、これでは何故かサービスは起動するものの/var/log/uwsgi-flask.logでは「unavailable modifier requested: 0」エラーとなっておりFlaskアプリが正常に動作しなかった。

一旦、以下のようにpipのuwsgiをインストール、アンインストールすると、which uwsgiコマンドの結果が/usr/local/bin/uwsgiに変わった。そして/etc/systemd/system/uwsgi.serviceのExecStartにそのuwsgiのパスを指定すると上手く行った。

# pip3 install uwsgi
# pip3 uninstall uwsgi
ExecStart = /usr/local/bin/uwsgi --ini /var/www/flask/uwsgi.ini

ちなみに検証環境(VMware)でも本番環境(VPS)でも同じ方法で解決している。(pipでインストールした/usr/local/bin/uwsgiの方がバージョンが新しい)

# /usr/sbin/uwsgi --version
2.0.18
# /usr/local/bin/uwsgi --version
2.0.19.1

つまり、バージョンと結果は以下となった。uWSGIはrpmではなくpipでインストールするようにしよう。

uwsgi 2.0.18 -> NG
uwsgi 2.0.19.1 -> OK

公開日時:2021年01月16日 09:42:39
最終更新日時:2024年03月18日 15:38:49

なお、VPS選びで迷ったらこちらの記事で主要VPSのメモリ容量ごとの月額、年額料金を比較していますので、是非参考にしてみてください。

Pythonに戻る

このページのトップに戻る