とりあえずなんとか動きましたって感じで... 以下Vagrant上での作業です。細かい所はあとで。
Python3.4を入れる
$ sudo rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/CentOS/6/x86_64/ius-release-1.0-11.ius.centos6.noarch.rpm $ sudo yum install python34u.x86_64 python34u.x86_64_devel
develはuWSGIを入れる時に必要です。pipとsetuptoolは自動的に入ります。
uWSGIをインストール
$ sudo pip3 install uwsgi
システム全体で同じuWSGIを使うため、virtualvenv等を利用せずグローバルに入れます。
Nginxをインストール
現時点で安定版の最新が1.6.2なので、それを入れます。
$ sudo rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm $ sudo yum install nginx
ここまではふつーです。
Flaskアプリをデプロイ
僕は/var/www/flask/以下に置いて、virtualenvを使っています。pyvenvをお使いの方は適宜置き換えて下さい。この辺はデプロイポリシーによります。
$ virtualenv venv $ source venv/bin/activate $ pip install -r requirements.txt
Nginxのバーチャルホスト設定
server { listen 80; server_name *.flask; #ホスト名とプロジェクトディレクトリ名を同じにする root /var/www/flask/$host/; location /static { alias /var/www/flask/$host/app/static/; } location / { include uwsgi_params; uwsgi_pass unix:/tmp/$host.sock; } }
$hostにアクセスされたホスト名が勝手に入ります。それに応じてFlaskのルート設定、ソケットファイルの設定、staticの設定を行っています。
ソケットファイルはアプリの数だけ必要です。試しに全部/tmp/nginx.sockとかにしたらどのホスト名にアクセスしても同じFlaskアプリが実行されちゃいました。なんでやろね。
uWSGIの設定(Emperorモードで稼働)
Emperorモードで動かす
複数のuWSGIアプリを簡単に動かすことが出来るようになります。
The uWSGI Emperor – multi-app deployment — uWSGI 2.0 documentation
各々のアプリにuWSGI用のiniファイルを用意
まずはアプリ用のuwsgi用iniファイルを作ります。666はNginx及びuWSGIの起動ユーザーが同じなら644でも。複数アプリがあっても、baseのパスだけ変えれば良い。
base = /var/www/flask/sample.flask chdir = %(base)/%n home = %(base)/%n/venv socket=/tmp/%n.sock chmod-socket = 666 wsgi = run:app #僕はrun.pyでFlask上のappを起動してる py-autoreload = 1 #reload on change python file
%(base)はプレースホルダーです。%nは拡張子を抜いたファイル名です。http://uwsgi-docs.readthedocs.org/en/latest/Configuration.html#magic-variablesに詳しい。
ファイル変更時に自動的にリロードしたい場合は、py-autoreload = 1を設定すればOKです。
Emperor用のini監視ディレクトリを作る
$ sudo mkdir -p /etc/uwsgi/vassals $ sudo ln -s </path/to/mysite.ini> /etc/uwsgi/vassals/
シンボリックリンクを張るiniは上記で作ったiniファイルを指定して下さい。複数ある場合は複数張りましょう。
Emperor用の設定ファイルを作る
/etc/uwsgi/emperor.iniで作りました。
[uwsgi] emperor = /etc/uwsgi/vassals process = 3 uid = nginx gid = nginx logto = /tmp/uwsgi.log
emperorのパスだけ間違えないようにして下さい。logをアプリごとに出したい場合は、各々のiniファイルで設定すればいいと思います。
2018.10.13 追記
今であれば、DockerでNginxをリバースプロキシを立てて、PythonとuWSGIかGuicornで動かすのが良いと思います。