はじめに
対象読者
- nginx 使ってる人/これから使おうとしている人
- nginx のチューニングどんな感じにしたら良いのかわからない
- 最強の nginx チューニング! ……といわれても、サーバのスペック/用途と合うものかどうかわからない
- サーバのスペック/用途に合わせた例を知りたい
今回とりあつかうサーバのスペック
- ConoHa VPS
- OS : Ubuntu 18.0.4
- CPU : 4 core
- メモリ : 4GB
今回とりあつかうサーバの用途
- リバースプロキシ用
チューニング
例
nginx.conf
user www-data;
worker_processes auto;
worker_rlimit_nofile 50000;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 4096;
use epoll;
}
http {
charset UTF-8;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 20;
client_header_timeout 20;
client_body_timeout 20;
send_timeout 20;
reset_timedout_connection on;
types_hash_max_size 2048;
server_tokens off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
gzip on;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
gzip_proxied expired no-cache no-store private auth;
gzip_min_length 1024;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
# 後略
各項目の説明
親
- worker_rlimit_nofile
- 設定のため OS 全体でのファイルディスクリプタ数を確認
- ここで表示された値の 1/8 くらい = 50,000 を割り当てておけば、バランス良さそう
cat /proc/sys/fs/file-max
> 396419
events ディレクティブ
-
worker_connections
- worker_rlimit_nofile に設定した値のさらに 1/10 くらい = キリよく 4,096 で
-
multi_accept
- そこまでカツカツにしたいわけではないので、むしろここは余裕をもって off のままにしておく
- デフォルト off なので記述しないでおけばよい
-
use
- I/O の多重化についてシステムコールとして何を使うか
- epoll が一番効率的
http ディレクティブ
-
tcp_nopush
- パケット送信の効率化
- デフォルト off なので設定する
-
server_tokens
- on だと nginx の ver. を喧伝してしまうことになる
- デフォルト on なのでセキュリティ対策として off にする
-
keepalive_timeout
- これ以下タイムアウト関連 4 つ
- さすがに 20 秒も待てば十分かな
-
client_header_timeout
- 同上
-
client_body_timeout
- 同上
-
send_timeout
- 同上
-
reset_timedout_connection
- タイムアウトしたやつはすぐ消してよい
-
ngx_http_limit_conn_module
- 同一 IP address からの同時接続制限。悩んだけれど、今回は設定しないことにした
-
ssl_protocols
- TLS 1.3 まで含めたい場合、含めておく
- TLS 1.1 以下は消してしまおう
-
gzip_vary
- on にすることで Vary: Accept-Encoding が付加される
-
gzip_disable
- MS IE の 1 - 6 までは非対象とする
- "MSIE [1-6].";
-
gzip_proxied
- キャッシュされないリクエストにのみ gzip 圧縮
- expired no-cache no-store private auth;
-
gzip_min_length
- 最小ファイルサイズ指定
- 1024 でよいかと
-
gzip_comp_level
- 圧縮率。デフォルトの 6 のままで
-
gzip_types
- 画像などは既に圧縮されていることが多いので、デフォルトのままで良い
おわりに
- それならこっちの設定の方が良いのでは? というご意見ご指摘ありましたら、コメントいただけますと嬉しいです!