Vagrant + CentOS7 + Nginx + uWSGI + Python3 で Hello World

以前、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」が表示されたら成功です(絶対パスを指定しないと駄目でした。。)

http://192.168.33.11:9090/

さて、本番では 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」が表示されれば成功です。

http://192.168.33.11/

nginxからアクセスしていることを確認します。

sudo less /var/log/nginx/access.log

※socketを保存するディレクトリは /tmpを指定することが多いですが、CentOS7 だと /tmpディレクトリ内は定期的に削除されるようなので避けます。

次回はFlask。

参考

Flask + uWSGI + Nginx でハローワールドするまで @ さくらのVPS (CentOS 6.6)

便利で超強力なWSGIサーバー uWSGI を使ってみよう

コメント

タイトルとURLをコピーしました