tamuraです。

ISUCON出ました!
ブログ書きました!

で終わってもあれなので、反省会と称してnginxについて次回以降で使えそうな設定内容をメモしました。



そもそもnginxとは

nginx(「エンジンエックス」と発音)は、フリーかつオープンソースなWebサーバである。処理性能・高い並行性・メモリ使用量の小ささに焦点を当てて開発されており、HTTP, HTTPS, SMTP, POP3, IMAPのリバースプロキシの機能や、ロードバランサ、HTTPキャッシュの機能も持つ。

Apache HTTP Serverがリクエストの処理にデフォルトでスレッドやプロセス指向のアプローチを用いている一方で、nginxは非同期のイベント駆動アプローチを用いている。イベント駆動によるアプローチは、高負荷下において、より予測可能なパフォーマンスを提供すると考えられている。

wikipediaより

なるほど。知ってました。

ワーカープロセス

イベント駆動なので、遅いクライアントがいるとそれをさばくのに時間がかかって余計遅くなります。 CPU数と同じ値にワーカーを設定します。

worker_cpu_affinityは自動設定にします。

worker_processes 8;
worker_cpu_affinity auto;

ログフォーマット

$request_timeを追加して、他に余計なログを吐かないようにします。

log_format main '[$time_local] "$request"'
                '$status $body_bytes_sent $request_time'

access_log /var/log/nginx/access.log main

gzip圧縮

静的コンテンツはgzip圧縮済みのものを配信するようにします。

(事前にgzipで圧縮しておきます)

location ~* \.(css|js|jpg|png)$ {
  gzip_static always;
}

ブラウザのキャッシュ

静的コンテンツはブラウザ側のキャッシュがあればそれを使うようにします。

location ~* \.(css|js|jpg|png)$ {
  gzip_static always;
  expires 30d;
}

memcached

コンテンツをmemcachedに乗せて、変更があった場合にアプリ側からmemcachedで書き込む、というやり方があります。 アプリ側の変更を把握している必要があることと、アプリ側の言語からmemcachedに書き込める必要があります。

upstream back {
  server 127.0.0.1:8080;
}

location \ {
  # POSTはそのまま裏に
  if ($request_method = POST) {
    proxy_pass http://back;
    break;
  }

  set $memcahced_key "$uri"
  memcached_pass 127.0.0.1:11211;
  default_type "text/html; charset=utf-8";
}

まとめ

他にもあったら(あるはず)追記していきます。