WSGI アプリケーション + nginx
[履歴] [最終更新] (2015/09/02 11:11:20)

概要

WSGI (Web Server Gateway Interface) は PSGI に影響を与えた python の標準化された Web インターフェースです。

WSGI の実装としては上記二つの選択肢があります。前者は Apache に依存しており更新も活発ではないため、後者の uwsgi を利用します。

参考ドキュメント

事前準備

必須ではありませんが、今回は pyenv/virtualenv を用いて 2.7.10 をシステムインストールした状況を想定します。

インストール

$ pyenv shell 2.7.10
$ pyenv exec pip install uwsgi
$ pyenv exec pip install uwsgitop

サンプルアプリケーション

wsgi.py

#!/bin/env python
# -*- coding: utf-8 -*-
import sys

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World, python version: \n%s\n" % (sys.version)]

wsgi.ini

[uwsgi]
http = :8080
stats = 127.0.0.1:8181
wsgi-file = wsgi.py
master = true
processes = 4
threads = 2

実行

$ pyenv exec uwsgi wsgi.ini

動作検証

$ ps auxw | grep wsgi
$ pyenv exec uwsgitop localhost:8181
$ curl http://localhost:8080/

複数アプリケーションの管理

/etc/uwsgi/vassals/wsgi-001.ini

[uwsgi]
http = :8080
stats = 127.0.0.1:8181
chdir = /usr/local/uwsgi/apps
wsgi-file = wsgi-001.py
master = true
processes = 4
threads = 2
logto = /var/log/uwsgi/wsgi-001.log

/usr/local/uwsgi/apps/wsgi-001.py

#!/bin/env python
# -*- coding: utf-8 -*-
import sys

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World, python version: \n%s\n" % (sys.version)]

/etc/uwsgi/emperor.ini

[uwsgi]
emperor = /etc/uwsgi/vassals
uid = nobody
gid = nobody

起動手順

$ sudo su -l
$ chown nobody: /var/log/uwsgi
$ cd /etc/uwsgi/
$ pyenv shell 2.7.10
$ pyenv exec uwsgi emperor.ini

nginx リバースプロキシ

/etc/nginx/nginx.confuwsgi_pass するためには /etc/uwsgi/vassals/wsgi-001.ini において http ではなく socket を使用します。

/etc/nginx/nginx.conf

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    sendfile on;
    keepalive_timeout 65;
    access_log /var/log/nginx/access.log combined;
    server {
        listen 80 default_server;
        include uwsgi_params;

        location / {
            uwsgi_pass 127.0.0.1:8080;
        }
        location /001 {
            uwsgi_pass 127.0.0.1:8080;
        }
        location /002 {
            uwsgi_pass 127.0.0.1:9090;
        }
    }
}

/etc/uwsgi/vassals/wsgi-001.ini

[uwsgi]
socket = 127.0.0.1:8080
stats = 127.0.0.1:8181
chdir = /usr/local/uwsgi/apps
wsgi-file = wsgi-001.py
master = true
processes = 4
threads = 2
logto = /var/log/uwsgi/wsgi-001.log

/usr/local/uwsgi/apps/wsgi-001.py

#!/bin/env python
# -*- coding: utf-8 -*-
import sys

def application(env, start_response):
    start_response('200 OK', [('Content-Type','text/html')])
    return ["Hello World, python version: \n%s\n" % (sys.version)]

/etc/uwsgi/emperor.ini

[uwsgi]
emperor = /etc/uwsgi/vassals
uid = nobody
gid = nobody

起動手順

$ sudo su -l
$ chown nobody: /var/log/uwsgi
$ cd /etc/uwsgi/
$ pyenv shell 2.7.10
$ pyenv exec uwsgi emperor.ini

動作検証

$ ps auxw | grep wsgi
$ sudo less /var/log/uwsgi/wsgi-001.log
$ pyenv exec uwsgitop localhost:8181
$ curl http://localhost/
関連ページ
    概要 データ可視化ツールの一つ Grafana の簡単な使い方を把握します。 Grafana Documentation インストール APT APT レポジトリを追加します。 sudo vim /etc/apt/sources.list.d/grafana.list deb https://packagecloud.io/grafana/stable/debian/ stretch