Flaskアプリケーションをuwsgi + nginxで動かしてみた
やってみる理由
去年のPCK(パソコン甲子園)で作ったアプリ「ふぁみここ」でサーバー側としてFlaskアプリケーションを実装しました.
その時は, uWSGIやnginxは名前だけ知っている状態でPCK本番もFlaskのrunメソッドで動かしていました.
※Flaskのrunメソッドは開発で使うもので, 実際にサービスを提供するためのものではないそうです.
前日夜と本番中, サーバーのメモリ使用率が爆発して数十分間サーバーにアクセスできない事態が起き, 今後それを回避するため uwsgi + nginx での動かし方に挑戦してみました.
環境構築
基本環境 : VMware, Ubuntu 16.04
インストールするもの
sudo pip3 install flask uwsgi sudo apt-get install nginx
ディレクトリの作成
mkdir ~/python/flask/1/
個人的にできるだけ/ディレクトリ以下をごちゃごちゃさせたくなかったので
基本的にhomeディレクトリのしたで作業しました.
flaskアプリの作成
cd ~/python/flask/1/ vim app.py
Flaskの公式ドキュメントのものを使います.
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return 'Hello, World!' if __name__ == '__main__': app.run()
uwsgi設定ファイルの作成
flaskアプリと同じディレクトリで作業します.
vim uwsgi.ini
ここで'~‘を使って指定するとNo such file of directoryと怒られるので注意しましょう.
[uwsgi] #application's base folder base = /home/nemu/python/flask/1/ # /home/user_name/python/flask/1/ #python module to import app = app # app = app_nameを入れる module = %(app) #socket file's location socket = %(base)/uwsgi.sock #socket = /var/www/flask/tmp/uwsgi.sock #socket = /tmp/uwsgi.sock #permissions for the socket file chmod-socket = 666 #the variable that holds a flask application inside the module imported at line #6 callable = app #location of log files logto = %(base)/log.txt #logto = /var/log/uwsgi/%n.log master = true processes = 1 vacuum = true die-on-term = true
nginx設定ファイルの作成
sudo vim /etc/nginx/sites-enable/uwsgi.conf
server { listen 8080; error_log /home/nemu/python/flask/1/error.txt warn; location / { include uwsgi_params; #uwsgi_pass unix:///tmp/uwsgi.sock; #uwsgi_pass unix:///var/www/flask/tmp/uwsgi.sock; uwsgi_pass unix:///home/nemu/python/flask/1/uwsgi.sock; } }
設定の確認
sudo service nginx testconfig
[fail]とでたら間違っている場所を探しましょう.
[OK]とでたら設定を読み込ませます.
sudo service nginx reload
uwsgiを動かす
flaskアプリがある場所で作業します.
uwsgi --ini uwsgi.ini
ブラウザから127.0.0.1:8080
にアクセスしてHello, World!が表示されると成功です.
やってて困ったこと
- ‘~'を使ったディレクトリ指定で怒られた
- /home/<user_name>/ で指定した
- .confファイルでセミコロンをつけ忘れた
- /var/log/nginx/にerror.logというファイルがありそれを見て分かった
- この記事ではやってないが, 参考サイト1でnginxに権限を与えているところでユーザー指定が不正と言われた
- 参考サイト2で
nginx:nginx
の場所を<user_name>:<user_name>
にすればいいと分かった
- 参考サイト2で