\ 最大7.5%ポイントアップ! /

【uWSGI 入門】uwsgi.ini ファイルの書き方

  • uWSGI の役割を知りたい
  • uwsgi.ini の書き方が知りたい

基本構成

uwsgi.ini と nginx.conf の記載例

Django プロジェクトを最小構成で組んだ場合の uwsgi.ini ファイルの内容です。

[uwsgi]
# Django settings
module = myproject.wsgi:application
chdir = /path/to/your/django/project

# uWSGI settings
master = true
processes = 4
socket = /path/to/your/uwsgi.sock
vacuum = true

nginx.conf の方は、例えば次のようになります。

server {
    listen 80;
    # ドメイン名を指定してください
    server_name example.com;

    location / {
        include uwsgi_params;
        # uWSGIのソケットへのパスを指定してください
        uwsgi_pass unix:///path/to/your/uwsgi.sock;
    }

    location /static/ {
        # 静的ファイルへのパスを指定してください
        alias /path/to/your/static/files/;
    }

    location /media/ {
        # メディアファイルへのパスを指定してください
        alias /path/to/your/media/files/;  
    }
}

なお、nginx については過去記事も参考にしてみてください。

conf ファイルの書き方はこれからご用意する予定です。

コメントの書き方

コメントはセミコロン(;)またはハッシュ(#)で始めます。

Python を書かれる方なら、# の方が馴染みやすいかもしれません。

公式ドキュメント:INI files

ユーザーが任意で決める変数

以下のような形式で、ユーザー定義の変数が使えるようになります。

[uwsgi]
socket_path = /project/somedir/some_socketfile.sock
socket = %(socket_path)

ただし、上記の場合は uWSGI であらかじめ用意されているオプションと見分けづらいです。

そこでプレースホルダーとして、明示的にカスタム変数であることを示す方法もあります。

[uwsgi]
# set-ph を使う方法
set-ph = filename=some_socketfile.sock
socket = %(filename)

# set-placeholder を使う方法
set-placeholder = basedir=/project/somedir/
socket = %(basedir)

こちらの方が直感的かもしれません。

公式ドキュメント:Placeholders

オプションの値をファイルから読み込む

/tmp/socket ファイル内に以下を書き込んでおき、この /tmp/uwsgi.sock をsocket の値として採用したい場合があるとします。

/tmp/uwsgi.sock

その場合には、採用したいファイルパスを @() で囲います。

[uwsgi]
socket = @(/tmp/socket)

これで、/tmp/socket ファイル内の /tmp/uwsgi.sock が socket として渡せます。

uwsgi.ini で使うオプション

uwsgi.ini ではオプションが大量に用意されています。

ここではよく使うものを中心に、ジャンルに分けてご紹介します。

その他のオプションは公式ドキュメントを参照ください。
» 公式:uWSGI Options

アプリケーション設定

オプション内容記載例
moduleアプリの核となる python モジュール名config.wsgi:application
アプリケーション設定

ネットワーク関連

オプション内容記載例
httphttp ポートとアドレス:8000
httpshttps ポートとアドレス:443,/cert.pem,/key.pem
socketUNIX ソケットのパス/tmp/my_app.sock
ネットワーク関連

socket は記載例のようなものの他に、unix:///my_app.sockのような形で UNIXソケットであることを明示して指定することもできます。

プロセス管理

オプション内容記載例
masterマスタープロセスを有効 / 無効true
workersワーカープロセスの数4
threads各ワーカーのスレッド数2
chdirカレントディレクトリの変更/dir
homePython 仮想環境のパスを指定/.venv
processesワーカーのプロセス数4
プロセス管理

master は WSGI がマスタープロセスを起動するかを制御するものです。
マスタープロセスはワーカープロセスを管理し、リソースの効率的な使用・自動再起動・ログローテーションを行います。本番環境では、基本的に true に設定します。

セキュリティ

オプション内容記載例
uid実行ユーザの IDwww-data
gid実行グループの IDwww-data
chmod-socketソケットのパーミッションを変更666
セキュリティ

uid (User ID) は uWSGI プロセスが実行されるユーザの ID を設定します。
通常はセキュリティ上の理由で root ユーザとしての実行は避けて、専用の非特権ユーザを作成してユーザ ID を指定します。

gid (Group ID) の方は uWSGI プロセスが実行されるグループ ID を設定します。
こちらもセキュリティ上の理由から、非特権のグループを作成してグループ ID を指定することが多いです。

ロギングとデバッグ

オプション内容記載例
logtoログファイルのパス/path/uwsgi.log
touch-logreopen指定ファイルの touch で log を再オープン/path/logreopen
touch-reload指定ファイルの touch でアプリをリロード/path/reload
log-levelログレベルを指定info
ロギングとデバッグ

パフォーマンスと最適化

オプション内容記載例
vacuumuWSGI の終了で全てのファイル/ソケットを削除true
buffer-sizeリクエストのバッファサイズ(バイト単位)8192
post-bufferingPOST データのバッファサイズ(バイト単位)8192
harakiriリクエストのタイムアウト時間30
パフォーマンスと最適化

vacuum は基本的に true に設定するのが良いと思います。
uWSGI プロセスが終了するときに、UNIX ソケットファイルや PID (Process ID File) を自動的に削除してくれます。

harakiri では uWSGI がリクエストを受けレスポンスを返すまでの最大時間を設定できます。
この時間を超えるとワーカープロセスは強制終了( “harakiri” )されます。
アプリの要件にもよりますが、一般的には30秒から60秒が多いです。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

CFXLOGのアバター CFXLOG プログラマ

メイン言語はPython。本ブログでは、実務や普段の学習で学んだことをアウトプットしています。
基本情報技術者試験合格者。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)