DockerとNginxについてちょっとした知見が得られたのでメモしておく

はじめに

DockerとNginxを使って色々していたら知見が得られたので,メモしておこうと思います.
知っている人は知っているような事なので,特にすごい知見ではないです.

環境

  • macOS Catalina 10.15.6
  • Docker 19.03.13
  • docker-compose 1.27.4
  • Nginx 1.17.3

.dockerignore vs ホストマウント

.dockerignoreに書いたファイルをマウントすることはできるのかが分かりませんでした.結果から言うと,マウントはできました.
今回はDocker Composeを使っていたのですが,docker-compose.ymlのvolumesに書いておけば,ちゃんとマウントされました.
考えてみれば当たり前ですね..dockerignoreはDockerイメージに含めないファイルを指定するものなので,イメージのビルドに関する設定です.一方,docker-compose.ymlは実行時の話なので,ちゃんとホストマウントできて当たり前でした.

Nginxで特定のパスだけキャッシュを効かせる

Nginxをリバースプロキシとして使っているときに,バックエンドの特定のパスにだけ,キャッシュを効かせる設定です.
こんな感じの設定ファイル(抜粋)を書けばOKです.

http {
    # ===
    # 省略
    # ===

    proxy_cache_path /var/cache/nginx keys_zone=CACHE:1m max_size=1g;
    proxy_temp_path /var/cache/nginx_tmp;
    server {
        # ===
        # 省略
        # ===

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        location ~ ^/path/to/(.*)-icon$ {
            proxy_pass http://backend:8080;

            proxy_ignore_headers Cache-Control;
            proxy_cache CACHE;
            proxy_cache_valid 200 302 60m;
            proxy_cache_valid 404 10m;
            add_header X-Nginx-Cache $upstream_cache_status;
        }
        location / {
            proxy_pass http://backend:8080;

            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_read_timeout 2h;
        }
    }
}

proxy_cache_pathproxy_temp_pathはhttpディレクティブ内に書く必要があります.
この設定では,/path/to/<任意の文字列>-iconへのリクエストをキャッシュします.キャッシュにヒットしたかどうかはレスポンスヘッダのx-nginx-cacheを見れば分かります.
proxyの設定を2箇所に書かないといけないのが冗長な気がしますが,書かないとダメでした.

終わりに

DockerやNginxは使うことが多いですが,設定や仕様など,把握していないことは多いですね.
いろいろと,使いながら覚えていこうと思います.