技術と趣味となにか

ゆるくやる

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>にすればいいと分かった

参考サイト

  1. http://qiita.com/kent_ocean/items/1d8e0d6e0b853b424fcf
  2. http://vladikk.com/2013/09/12/serving-flask-with-nginx-on-ubuntu/