以前、Nginx + uWSGI上で Pythonを動かしました。
その時は訳もわからず構築してたので、復習も兼ねて今度は CentOS7 上で動かす手順をまとめます。
uWSGI概要
WSGIとは
WSGI(Web Server Gateway Interface)とは、Webアプリケーションと Webサーバを接続するための標準インターフェースの仕様です。
実際に Webアプリケーションと Webサーバ( Apache, nginx)を接続するには、WSGIサーバ( WSGIアプリケーションコンテナ)が使われます。
WSGIサーバには、uWSGIや Gunicorn, Apacheの mod_wsgiなどがあります。
全体のイメージは以下になります。
Webアプリケーションは WSGIサーバに対応してなければいけませんが、PythonのWebフレームワークなら大方対応しています。
Client <-> Webサーバ <-> WSGIサーバ <-> Webアプリケーション
WSGIの仕様は PEP 333に載っていますが英語です。
uWSGIとは
uWSGIは WSGIサーバの一種で、WSGI対応したアプリケーションを動作させる環境を提供してくれるものです。
例えば nginx という Webサーバではそのままでは WSGIアプリケーションを動かせませんが、その動かすための機能を uwsgi が提供するという形になります。
WSGIサーバの候補には gunicornもあります。gunicornは pythonで書かれているおり、 Cで書かれている uWSGIの方が速い情報があったため、今回は uWSGIを使ってみることにします。
WEBサーバと WSGIサーバ間は以下のプロトコルで通信できます。socket が速いそうなので、これを採用します。
- http
- uwsgi
- socket(早い)
まとめると、構成は以下のようになります(こちらの記事を参考にさせていただきました)。
Client <-(HTTP)-> Nginx <-(socket)-> uWSGI <–> Flask
※uWSGIという言葉は、WSGIサーバと uwsgiプロトコルの両方で使われているので注意
Vagrant + CentOS7 + pyenv-virtualenv環境構築
こちらの記事を参照。
uWSGIインストール
pyenv を root 権限でインストールしているため、pip も root 権限で実行します。
sudo pip install uwsgi
バージョンを確認します。
uwsgi --version # 以下が表示 2.0.13.1
本家サイトに載っている uwsgi 用の Python アプリケーションを作成します。
vim foobar.py
def application(env, start_response): start_response('200 OK', [('Content-Type','text/html')]) return [b"Hello World"
uwsgiを起動します。
uwsgi --http :9090 --wsgi-file /home/vagrant/work/uwsgi/foovar.py
ブラウザから 仮想環境へアクセスし、「Hello World」が表示されたら成功です(絶対パスを指定しないと駄目でした。。)
さて、本番では nginxと uwsgi を組み合わせて使うことがメジャーなため、 nginx + uwsgi で Hello Worldに挑戦します。
nginxインストール
こちらの記事参照。
nginx + uwsgi で Hello World
nginx のバーチャルサーバを設定します。
sudo vim /etc/nginx/conf.d/default.conf
server { listen 80; location / { include uwsgi_params; uwsgi_pass unix:///var/tmp/uwsgi.sock; } }
nginx を再起動します。
sudo systemctl nginx restart
uwsgi を以下の形式で起動させます。
uwsgi --socket /var/tmp/uwsgi.sock --wsgi-file foovar.py --chmod-socket=666
この状態で再度ブラウザからアクセスし、「Hello World」が表示されれば成功です。
nginxからアクセスしていることを確認します。
sudo less /var/log/nginx/access.log
※socketを保存するディレクトリは /tmpを指定することが多いですが、CentOS7 だと /tmpディレクトリ内は定期的に削除されるようなので避けます。
次回はFlask。
コメント