はじめに
初心者向け。nginxのコンテナの設定変更をしてみようの巻!
設定ファイル
参考: 【Qiita】nginxについてまとめ(導入編)
上記参考の記事によると、nginxの設定ファイルは、非コンテナの場合は /usr/local/etc/nginx/
にあるが、コンテナ(DockerHubの nginx:1.18
の場合)では見つからない。
こういう時は docker exec -it nginx bash
でコンテナに潜り込んで確認してみよう。
コンテナの場合は、/etc/nginx
配下に nginx.conf
があった。
server
設定については、このファイル内で include /etc/nginx/conf.d/*.conf;
が参照されていて、デフォルトでは /etc/nginx/conf.d/default.conf
の中で設定されているようだ。
静的コンテンツをキャッシュする
公式サイトを参考にしながら超粗く設定すると、以下のような感じになる。
nginxのデフォルトコンテナでは /data/nginx/cache
がないので、コンテナ起動する場合はDockerfileの中で作っておこう。
http {
(中略)
proxy_cache_path /data/nginx/cache keys_zone=cachezone:10m max_size=200m;
include /etc/nginx/conf.d/*.conf;
(中略)
}
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_cache cachezone;
proxy_pass http://127.0.0.1:8080;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 10m;
}
}
server {
listen 8080;
listen [::]:8080;
server_name localhost2;
(以下略)
}
だいたい公式サイトの通りなのだが、デフォルトでは全部キャッシュするよ、と言っておきながら、
proxy_cache_key $host$uri$is_args$args;
を設定しておかないと必ずキャッシュミスになるので注意が必要。
キャッシュヒットしているかの確認
ログを見るのが一番手っ取り早い。
http {
(中略)
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" "$upstream_cache_status" "$server_port"';
(中略)
}
な感じで、"$upstream_cache_status"
と "$server_port"
をログ出力しておくようにしよう。
キャッシュなし版では
XXX.XXX.XXX.XXX - - [24/Oct/2020:12:32:01 +0000] "GET /xxxxx/ HTTP/1.1" 200 4668 "-" "python-requests/2.24.0" "-" "-" "80"
でプロキシ機能のログが出ていないことがわかる。
一方で、キャッシュあり版では、
127.0.0.1 - - [24/Oct/2020:12:56:34 +0000] "GET / HTTP/1.0" 200 956 "-" "curl/7.61.1" "-" "-" "8080"
XXX.XXX.XXX.XXX - - [24/Oct/2020:12:56:34 +0000] "GET / HTTP/1.1" 200 956 "-" "curl/7.61.1" "-" "MISS" "80"
XXX.XXX.XXX.XXX - - [24/Oct/2020:12:56:54 +0000] "GET / HTTP/1.1" 200 956 "-" "curl/7.61.1" "-" "HIT" "80"
といった感じで、内部通信のログと、キャッシュヒット有無が表示されるプロキシ機能のログが出力される。
性能差はどれくらいか?
キャッシュなし
まだまだ余裕そうな雰囲気だが、性能ツール側を止めてしまったので一旦ここまで。
キャッシュあり
あれ?キャッシュなしの方が性能が良いように見える。
たぶん、今回の負荷モデルは「それほど大きくないコンテンツに集中的にアクセス」なので、そもそもOSのバッファキャッシュに乗ってしまって、かえってキャッシュありの方がオーバーヘッドになっているのではないかという気がする。
厳密に差分を確認するには、キャッシュの恩恵を得られるような「大きいコンテンツに分散アクセス」しないと分からないかもしれない。