nginx を Web キャッシュとして使用しようとしていますが、失敗しています。
私のシステムは Ubuntu 16.04 サーバーで、nginx は gunicorn Web サーバー (Django アプリケーション) のリバース プロキシです。
virtual host
Web キャッシュを構成するために、ファイルの先頭 ( sites-available
)に次の行を追加しました。
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:10m max_size=90m;
proxy_cache_key "$scheme$request_method$host$request_uri$is_args$args";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
次に、メインserver
スコープ内に次のスニペットがあります (キャッシュ ディレクティブを挿入した部分)。
location @https_proxy_to_app {
proxy_cache static_cache;
proxy_cache_bypass $http_cache_control;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_set_header X-Forwarded-Proto https;
# additional proxy parameters
include proxy_params;
proxy_redirect off;
proxy_pass http://app_server;
}
静的アセット URI を curl しようとしても、キャッシュのヒットやミスは表示されません (これは、キャッシュが機能しているかどうかをテストする唯一の方法です)。したがって、キャッシュは機能していません。つまり、次のようになります。
試してみるとcurl -X GET -I https://example.com/static/css/my_app.css
次の結果が得られます:
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 22 Jan 2020 08:05:37 GMT
Content-Type: text/css
Content-Length: 26597
Last-Modified: Fri, 03 Jan 2020 14:23:59 GMT
Connection: keep-alive
Vary: Accept-Encoding
ETag: "5e0f4e7f-67e5"
Expires: Thu, 31 Dec 2037 23:55:55 GMT
Cache-Control: max-age=315360000
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
Accept-Ranges: bytes
X-Proxy-Cache: HIT
またはが含まれているはずなので、これは問題ですX-Proxy-Cache: MISS
。問題の診断にご協力ください。
以下は私のブロックのすべてですlocation
(出現順)。
location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$ {
root /home/ubuntu/app/myproj/;
access_log off;
error_log off;
}
# shows number of connections at https://example.com/status_nginx
location /status_nginx {
stub_status on;
allow 127.0.0.1;
deny all;
}
location / {
limit_conn conn_limit_per_ip 20;
limit_req zone=req_limit_per_ip burst=10 nodelay;
limit_req_log_level warn;
#proxy_pass_request_headers on;
proxy_buffering on;
proxy_buffers 24 4k;
proxy_buffer_size 2k;
proxy_busy_buffers_size 8k;
try_files $uri @https_proxy_to_app;
}
location @https_proxy_to_app {
proxy_cache static_cache;
proxy_cache_bypass $http_cache_control;
add_header X-Proxy-Cache $upstream_cache_status;
proxy_set_header X-Forwarded-Proto https;
# additional proxy parameters
include proxy_params;
proxy_redirect off;
proxy_pass http://app_server;
}
答え1
ファイル.css
は、構成内の次のブロックを使用して提供されます。
location ~* \.(?:ico|css|js|gif|jpg|jpeg|png|svg|woff|ttf|eot)$
root /home/ubuntu/app/myproj/;
access_log off;
error_log off;
}
これは、nginx がリクエストを処理するために上流サーバーを使用せずにファイルを直接送信していることを意味します。つまり、キャッシュは実行されません。
.css
リストから拡張子を削除し、root
この CSS ファイルが見つかるディレクトリを指していない場合、リクエストはproxy_pass
アップストリーム サーバー経由で送信されます。
その後、アップストリーム サーバーが適切な HTTP キャッシュ ヘッダーを設定すると、応答がキャッシュされます。