nginxコンテナの設定を変更する

# はじめに
初心者向け。nginxのコンテナの設定変更をしてみようの巻！

# 設定ファイル
参考: 【Qiita】[nginxについてまとめ(導入編)](https://qiita.com/morrr/items/929e9cb35914a7f3a652#%E8%A8%AD%E5%AE%9A)

上記参考の記事によると、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``` の中で設定されているようだ。

# 静的コンテンツをキャッシュする
[公式サイト](http://mogile.web.fc2.com/nginx/admin-guide/caching.html)を参考にしながら超粗く設定すると、以下のような感じになる。
nginxのデフォルトコンテナでは ```/data/nginx/cache``` がないので、コンテナ起動する場合はDockerfileの中で作っておこう。

```nginx:/etc/nginx/nginx.conf
http {
(中略)
    proxy_cache_path /data/nginx/cache keys_zone=cachezone:10m max_size=200m;

    include /etc/nginx/conf.d/*.conf;
(中略)
}
```

```nginx:/etc/nginx/conf.d/default.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;
(以下略)
}
```

だいたい公式サイトの通りなのだが、デフォルトでは全部キャッシュするよ、と言っておきながら、

```nginx
        proxy_cache_key $host$uri$is_args$args;
```

を設定しておかないと必ずキャッシュミスになるので注意が必要。

# キャッシュヒットしているかの確認
ログを見るのが一番手っ取り早い。

```nginx:/etc/nginx/nginx.conf
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"
```

といった感じで、内部通信のログと、キャッシュヒット有無が表示されるプロキシ機能のログが出力される。

# 性能差はどれくらいか？
## キャッシュなし
![キャッシュなし_number_of_users_1603540075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/4d163637-308c-aaf5-11c3-3e7581607f72.png)
![キャッシュなし_total_requests_per_second_1603540075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/cf89737a-df1e-90f1-3e48-b71d57fd7b0a.png)
![キャッシュなし_response_times_(ms)_1603540075.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/c1266893-81da-ed65-b82e-49101ac56c5c.png)

まだまだ余裕そうな雰囲気だが、性能ツール側を止めてしまったので一旦ここまで。

## キャッシュあり
![キャッシュあり_number_of_users_1603536854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/14c712d8-2e70-eb8a-de4a-b083c9bb9537.png)
![キャッシュあり_total_requests_per_second_1603536854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/d3710eb4-3e0d-7b82-f89e-e59905af93d0.png)
![キャッシュあり_response_times_(ms)_1603536854.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/111314/78f91acd-3b68-942c-a3d2-26235f5d43d7.png)

あれ？キャッシュなしの方が性能が良いように見える。
たぶん、今回の負荷モデルは「それほど大きくないコンテンツに集中的にアクセス」なので、そもそもOSのバッファキャッシュに乗ってしまって、かえってキャッシュありの方がオーバーヘッドになっているのではないかという気がする。
厳密に差分を確認するには、キャッシュの恩恵を得られるような「大きいコンテンツに分散アクセス」しないと分からないかもしれない。