CentOS6.5、Python2.7でやります。

CentOS6.5にプリインストールされているPythonは2.6だと思うのですが、Python2.7の導入方法は書きません。 多分いろいろな環境で動いたり動かなかったりしちゃうと思うので。

僕はこの記事を参考にしました。非常に簡単かつ完璧に書かれてて助かりました。こんな記事が書けるようになりたい。

CentOS に Python2.7, Python3.3を入れたメモ - Qiita

uWSGIをインストールする

まあ当然WSGIを使います。PythonをWebアプリとして動かす際のサーバ間仕様ですね。 WSGIで使えるコンテナはWikiを見る限り幾つかあるようです。

Web Server Gateway Interface - Wikipedia

WSGIアプリケーションコンテナの例としては、uWSGI, Gunicorn, Apacheモジュール (mod_wsgi, mod_pythonなど), Microsoft IIS(isapi-wsgi, PyISAPIe, ASPゲートウェイを使用)などがある。

今回はuWSGIを使います。

uWSGI?

公式より引用。

The uWSGI project — uWSGI 2.0 documentation

The uWSGI project aims at developing a full stack for building hosting services.

Application servers (for various programming languages and protocols), proxies, process managers and monitors are all implemented using a common api and a common configuration style.

アプリケーションサーバですね。 今回はnginxの向こうにuWSGIを置いてサービスを動作させます。

インストール

pip install uwsgi

なんて簡単!

パラメータオプションでの起動

uWSGIはコマンドから起動設定も含めた起動が出来ます。 例えば、

uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi_app

これで8000ポートでwsgi_appがhttp全公開になります。 nginxと連携させる前に、一度このタイミングでアクセス出来るかを見とくと良いですね。 -wオプションはわかりづらいのですが、main.pyにアプリの起動が記述されてる場合はmainを指定するみたいですね。

パラメータは公式のこのページが参考になりそうです。 ちょっとしたロジックも書ける様子。

iniファイルでの起動

パラメータをたくさんつけるとコマンドが長くなってしまうのでiniに落とし込みました。 xmlとかその他の形式でも行けるみたいです。

[uwsgi]
chdir = /path/to/src
module = wsgi
socket = /path/to/app.sock
touch-reload = /path/to/reload.trigger
logto = /var/log/uwsgi.log
max-requests = 1000
chmod-socket = 666

uid = www-user
gid = www-group

起動はuwsgi --ini wsgi.iniみたいな感じ。 ここでも一度アクセスできるかを確認するといいですね。 chdirはカレントディレクトリの指定です。 これがないとコマンドでは動くのにupstartから起動したら動かない、なんてことになったり。

socketについてはこの記事が詳しいです。 プロダクションで使うならその他細かな設定が必要かと思います。

upstartから起動させる

別に手で起動しても問題ないと思うのですが、多分ナンセンスなので。 /etc/init/app.confを作って、

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

env UWSGI=/path/to/uwsgi
exec $UWSGI --ini /path/to/wsgi.ini

sudo start appで起動出来ます。この起動の仕方は初めて知りました。

nginxとの連携

インストールは省きます。

server {
    listen       80;
    server_name  localhost;
    charset      utf-8;

    location / {
        try_files $uri @uwsgi;
    }

    location @uwsgi {
        include uwsgi_params;
        uwsgi_pass unix:/path/to/app.sock;
    }
}

uWSGIが起動してapp.sockが配備されてる状態であればこれでアクセス出来るはず。

参考にさせていただきました