web-dev-qa-db-ja.com

NGINX:X-Accel-Expiresが設定されている場合のキャッシュ

静的コンテンツにX-Accel-Expiresヘッダーと、Last-Modifiedヘッダーを追加しました。他に何もキャッシュせずにこれらの要素をキャッシュするための正しい設定を知りたいのですが。

これは私が現在持っているものですが、何もキャッシュしません:

http {
include       /etc/nginx/mime.types;

access_log  /var/log/nginx/access.log;

sendfile        on;
client_max_body_size 2000m; 
keepalive_timeout  65;
tcp_nodelay        on;

gzip  on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

ssl_certificate /etc/nginx/chain.pem; 
ssl_certificate_key /etc/nginx/key.key;

proxy_cache_path /var/lib/nginx/cache levels=1:2 keys_zone=cache:30m max_size=1G;
proxy_temp_path /var/lib/nginx/proxy 1 2;
proxy_cache_use_stale error timeout invalid_header http_502;

server {
    listen       80;
    server_name domain;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header  X-Real-IP  $remote_addr;
        proxy_read_timeout 700;
        proxy_set_header Host $http_Host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
5
mnml

ものをキャッシュするには、最初に次のようにhttpコンテキスト内に プロキシキャッシュパス を作成する必要があります。

proxy_cache_path    /var/cache/nginx/site1    levels=1:2    keys_zone=site1:10m max_size=1G;

次に、オプションで プロキシキャッシュキー を定義することもできます。キャッシュされたエントリと同じキャッシュキーを持つリクエストは、キャッシュされた応答がある場合はそれを受け取ります。ただし、デフォルトで十分な場合もあるため、これは完全にオプションです。

次に、特定のコンテキストでキャッシュを有効にするには、次のように、使用するキャッシュを指定します。

proxy_cache    site1;

proxy cache valid ディレクティブの説明によると、nginxはすでにX-Accel-Expiresを尊重し、それに基づいて動作するため、基本的にこの時点で完了です。 X-Accel-Expiresを含まないものはキャッシュしたくないので、デフォルトの有効時間として値0を追加することをお勧めします(コンテンツ内でX-Accel-Expiresを設定すると、このデフォルト値が上書きされます) )。

proxy_cache_valid    0m;

キャッシュがないことを除けば、設定ファイルは有効であり、プロキシ自体はすでに機能していると思います。

次に、基本的に、構成を修正するために必要なのは、httpserver、またはlocationコンテキストに以下を追加することだけです。

proxy_cache    cache;
proxy_cache_valid    0m;

(もちろん、キャッシュパスが存在し、正しいアクセス許可を持っていることを確認することもできます。)


言及された habrahabr 記事/例に関しては、キャッシュキーに$http_if_modified_sinceを含めることは実際には正しくないと思います。これは、マルチキャッシュされたエントリが多数発生する可能性があるためです。 、キャッシュを効果的に浪費します。


また、nginxはX-Accel-Expiresヘッダーをプロキシしない可能性が高いことにも注意してください。内部でのみ使用され、IIRCはこのヘッダーを転送しない場合があります。このような動作を変更するには、プロキシするように明示的に要求する必要があります(nginxを介してコンテンツをデバッグし、アプリがヘッダーを設定する方法などを確認する場合)。

proxy_pass_header "X-Accel-Expires";
8
cnst

ロシアのITブログのnginxでのX-Accel-Expiresヘッダーの使用について 良いハウツー があります。あなたの場合はとても便利かもしれないと思います。

1
Max Kochubey

その理由は、キャッシュが定義されているが有効になっていないためだと思います--proxy_cache cache; 不足している。

0
sendmoreinfo