tamuraです。 ISUCON出ました! ブログ書きました!
で終わってもあれなので、反省会と称してnginxについて次回以降で使えそうな設定内容をメモしました。
- ISUCON5に参加して惨敗した件
- ISUCON6に参加して今年も惨敗した件
そもそも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圧縮済みのものを配信するようにします。
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";
}
まとめ
他にもあったら(あるはず)追記していきます。