Django用のwebサーバとしてnginxを導入したが、構築後、502エラーが頻発した。
nginx.conf の内容をよく調べてみたところ、問題が緩和されたため、記事にすることにした。
私の作成したnginx.confの内容とパラメータの説明を以下に記載します。
/etc/nginx/nginx.conf
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
keepalive_requests 100;
client_header_timeout 30;
client_body_timeout 30;
include /etc/nginx/conf.d/*.conf;
}
server {
listen 80;
server_name 127.0.0.1;
charset utf-8;
location /static {
alias /static;
}
設定値一覧
ディレクティブ | コンテキスト | 内容 |
---|---|---|
user | main | workerプロセスの実行ユーザを指定 |
worker_processes | main | workerプロセスの数(CPUの数)を指定 |
erro_log | main | エラーログファイルパスとログレベルを指定 |
pid | main | nginxのプロセス情報ファイルの格納先を指定 |
worker_connections | events | 1つのworkerプロセスが処理する最大コネクション数を指定 |
log_format | http | アクセスログの書式を指定 |
access_log | http | アクセスログのパスとログレベルを指定 |
sendfile | http | コンテンツのファイルの読み込みとクライアントへのレスポンスの送信にsendfile() APIを使うかを指定する。onにするとファイルの転送効率があがるが、プラットフォームやファイルシステムによっては問題が起きることがある。onまたはoffで指定。 |
tcp_nopush | http | sendfileがonのとき、LinuxのTCP_CORKソケットオプションを使うかを設定する。onにするとレスポンスヘッダとファイルの内容をまとめて送るようになり、少ないパケット数で効率良く送ることができる。onまたはoffで指定。 |
keepalive_timeout | http | HTTP通信をタイムアウトせずにいる秒数を設定する。秒数で指定。 |
keepalive_requests | http | 1つのキープアライブ接続で処理できる要求の最大数を設定する。要求が最大数となると、接続が閉じられる。秒数で指定。 |
client_header_timeout | http | クライアントのリクエストヘッダの読み込みのタイムアウトを設定する。クライアントがこの期間にヘッダ全体を転送しなかった場合、リクエストは408(Request Time-out)エラーを使用し中断する。 秒数で指定。 |
client_body_timeout | http | クライアントリクエストボディの読み込みタイムアウト時間を設定する。クライアントがこの期間に何も転送しなかった場合は、リクエストは408(Request Time-out)エラーを使用し中断する。秒数で指定。 |
gzip | server | 転送するコンテンツをgzip圧縮する。デフォルトではContent-Typeがtext/htmlであるもののみ圧縮するため、他のコンテンツを圧縮したい場合は別途gzip_typesを設定する必要がある。onまたはoffで指定。 |
gzip_types | server | gzip圧縮する対象ファイルを設定。ファイル種別を指定。 |
include | すべて | 他の設定ファイルを読み込む |
パラメータを調べた結果、gzipと gzip_typesの設定 が serverコンテキストではなく、httpコンテキストに定義されていた。それらはserverコンテキストに設定するのが正しいのでそのように修正を行った。(上記の設定ファイル例では、既に設定を修正してある)
その結果、502エラーの出力頻度が減りました。
それでもまだ、時々502エラーがでるので、原因が分かり次第また記事にしたいと思います。
-- 2021/2/11 追記 --
無事解決しました!
【nginx 502エラー】Docker-compose + nginx + uwsgiのログ解析