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
各パラメータの意味は以下となります。
socket | Flaskアプリケーションがリスンするアドレスとポート番号 |
---|---|
module | Flaskアプリケーションのファイル名(拡張子を除く) |
callable | Flaskアプリケーションインスタンスを呼び出す変数名(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