とほほのPython入門 - uWSGI

トップ > Python入門 > uWSGI

目次

uWSGIとは

インストール

AlmaLinux 9 に Apache と uWSGI (mod-wsgi) をインストールする例を示します。

# dnf -y install httpd gcc python3-pip python3-devel httpd-devel
# pip3 install mod-wsgi wsgi-static-middleware

実行

単独起動

下記の内容で /opt/myapp/uwsgi.py を作成します。

from wsgiref.simple_server import make_server
from wsgi_static_middleware import StaticMiddleware

def application(environ, start_response):
    headers = [("Content-Type", "text/plain")]
    start_response("200 OK", headers)
    return ["OK".encode("UTF-8")]

if __name__ == "__main__":
    static_dirs = ["/opt/myapp/static"]
    app = StaticMiddleware(application, static_root="static", static_dirs=static_dirs)
    with make_server("0.0.0.0", 80, app) as httpd:
        try:
            httpd.serve_forever()
        except KeyboardInterrupt:
            pass

上記のファイルを直接実行することで 80番ポートを待ち受ける Webサーバーとして機能します。

$ python3 -B /opt/myapp/uwsgi.py
Apacheと組み合わせる

/etc/httpd/conf.d/uwsgi.conf ファイルに下記を記述して httpd を起動します。モジュールパス名はバージョンによって変わるので適度に書き換えてください。

<VirtualHost "*:80">
    LoadModule wsgi_module /usr/local/lib64/python3.9/site-packages/mod_wsgi/server/mod_wsgi-py39.cpython-39-x86_64-linux-gnu.so
    DocumentRoot /opt/myapp
    WSGIScriptAlias / /opt/myapp/uwsgi.py
    Alias /static/ /opt/myapp/static/
    <Directory /opt/myapp>
        Require all granted
    </Directory>
</VirtualHost>

詳細は下記を参照してください。

WSGI

環境変数(environ)

Webサーバーがリクエストを受信すると application() を呼び出します。第一引数は環境変数、第二引数はレスポンスを返すための関数が渡されます。

def application(environ, start_response):
    headers = [("Content-Type", "text/plain")]
    start_response("200 OK", headers)
    return ["OK".encode("UTF-8")]

環境変数には下記などがあります。

詳細は下記を参照してください。

HTTPステータス(HTTP status)

HTTPステータスは下記の様に返します。

def application(environ, start_response):
    headers = [("Content-Type", "text/plain")]
    start_response("200 OK", headers)
    return ["OK".encode("UTF-8")]
HTTPヘッダー(HTTP headers)

レスポンスヘッダーは下記の様にして返します。

def application(environ, start_response):
    headers = [
        ("Content-Type", "text/html"),
        ("Content-Encoding", "gzip")
    ]
    start_response("200 OK", headers)
    return ["OK".encode("UTF-8")]
HTTPボディー(HTTP body)

HTTPボディーは下記の様に返します。UTF-8 でエンコードするなどバイナリデータとして返却してください。

def application(environ, start_response):
    headers = [("Content-Type", "text/plain")]
    start_response("200 OK", headers)
    return ["OK".encode("UTF-8")]

Copyright(C) 2024 杜甫々
初版:2024年9月22日、最終更新:2024年9月22日
http://www.tohoho-web.com/python/uwsgi.html