9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

そこそこなスペックのサーバにおけるnginxチューニングの一例

Posted at

はじめに

対象読者

  • 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

    • 画像などは既に圧縮されていることが多いので、デフォルトのままで良い

おわりに

  • それならこっちの設定の方が良いのでは? というご意見ご指摘ありましたら、コメントいただけますと嬉しいです!
9
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?