Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

CentOS6.5でPython3.4+Nginx+uWSGIでバーチャルホスト運用

とりあえずなんとか動きましたって感じで... 以下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ファイルで設定すればいいと思います。

UPStart用の起動ファイルを作る

UPStartは手軽にデーモンとして起動できる仕組みのことで、/etc/init/uwsgi.confに下記のような設定ファイルを作ります。

description "uWSGI"
start on runlevel [2345]
stop on runlevel [06]
respawn

env UWSGI=/usr/bin/uwsgi

exec $UWSGI --ini /etc/uwsgi/emperor.ini --die-on-term

簡単よね..uwsgiにiniファイル食わせるだけの設定。

uWSGIをデーモンで起動
 $sudo start uwsgi

あとはNginxを起動して、ご自分のホスト名でアクセスして、適当にHello Worldでも返して見て下さい。

2018.10.13 追記

今であれば、DockerでNginxをリバースプロキシを立てて、PythonとuWSGIかGuicornで動かすのが良いと思います。