- 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 を書かれる方なら、#
の方が馴染みやすいかもしれません。
ユーザーが任意で決める変数
以下のような形式で、ユーザー定義の変数が使えるようになります。
[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)
こちらの方が直感的かもしれません。
オプションの値をファイルから読み込む
/tmp/socket ファイル内に以下を書き込んでおき、この /tmp/uwsgi.sock をsocket の値として採用したい場合があるとします。
/tmp/uwsgi.sock
その場合には、採用したいファイルパスを @() で囲います。
[uwsgi]
socket = @(/tmp/socket)
これで、/tmp/socket ファイル内の /tmp/uwsgi.sock が socket として渡せます。
uwsgi.ini で使うオプション
uwsgi.ini ではオプションが大量に用意されています。
ここではよく使うものを中心に、ジャンルに分けてご紹介します。
アプリケーション設定
オプション | 内容 | 記載例 |
---|---|---|
module | アプリの核となる python モジュール名 | config.wsgi:application |
ネットワーク関連
オプション | 内容 | 記載例 |
---|---|---|
http | http ポートとアドレス | :8000 |
https | https ポートとアドレス | :443,/cert.pem,/key.pem |
socket | UNIX ソケットのパス | /tmp/my_app.sock |
socket は記載例のようなものの他に、unix:///my_app.sock
のような形で UNIXソケットであることを明示して指定することもできます。
プロセス管理
オプション | 内容 | 記載例 |
---|---|---|
master | マスタープロセスを有効 / 無効 | true |
workers | ワーカープロセスの数 | 4 |
threads | 各ワーカーのスレッド数 | 2 |
chdir | カレントディレクトリの変更 | /dir |
home | Python 仮想環境のパスを指定 | /.venv |
processes | ワーカーのプロセス数 | 4 |
master は WSGI がマスタープロセスを起動するかを制御するものです。
マスタープロセスはワーカープロセスを管理し、リソースの効率的な使用・自動再起動・ログローテーションを行います。本番環境では、基本的に true に設定します。
セキュリティ
オプション | 内容 | 記載例 |
---|---|---|
uid | 実行ユーザの ID | www-data |
gid | 実行グループの ID | www-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 |
パフォーマンスと最適化
オプション | 内容 | 記載例 |
---|---|---|
vacuum | uWSGI の終了で全てのファイル/ソケットを削除 | true |
buffer-size | リクエストのバッファサイズ(バイト単位) | 8192 |
post-buffering | POST データのバッファサイズ(バイト単位) | 8192 |
harakiri | リクエストのタイムアウト時間 | 30 |
vacuum は基本的に true に設定するのが良いと思います。
uWSGI プロセスが終了するときに、UNIX ソケットファイルや PID (Process ID File) を自動的に削除してくれます。
harakiri では uWSGI がリクエストを受けレスポンスを返すまでの最大時間を設定できます。
この時間を超えるとワーカープロセスは強制終了( “harakiri” )されます。
アプリの要件にもよりますが、一般的には30秒から60秒が多いです。
コメント