
Nginx を使用して静的ファイルをキャッシュしたいのですが、どうもうまく動作しません。
これは私のnginx.conf
:
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
#multi_accept on;
}
http {
#GZIP
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types application/javascript application/json application/ld+json application/xml font/eot font/otf font/ttf text/css text/javascript text/plain text/xml;
# SERVERS
server {
listen 80;
server_name example.com;
if ($http_host ~* ^www\.(.*)$ )
{
return 301 https://$1$request_uri;
}
return 301 https://$http_host$request_uri;
}
server {
listen 443 ssl;
if ($http_host ~* ^www\.(.*)$ )
{
return 301 $scheme://$1$request_uri;
}
#SSL
ssl_certificate /root/.acme.sh/example.com/fullchain.cer;
ssl_certificate_key /root/.acme.sh/example.com/example.com.key;
server_name example.com;
# Pass all traffic to my webapplication
location / {
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
}
#Browser caching
location ~* \.(js|css)$ {
expires 180d;
add_header Pragma "public";
add_header Cache-Control "public";
}
location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
expires 365d;
add_header Pragma "public";
add_header Cache-Control "public";
}
}
}
問題は「ブラウザ キャッシュ」の部分にあります。このコード ブロックを有効にすると、サイトは読み込まれますが、すべての CSS ファイル、JavaScript ファイル、および画像が 404 を返します。これらのファイルが私の を無視しているようですlocation /
。
コピー&ペーストでこの問題を解決できました
proxy_set_header Host $host;
proxy_pass http://localhost:8080;
すべてのlocation
-blocks に を使用していますが、これはあまりエレガントではなく、実際にはサイトの動作がかなり遅く感じられました...
location
また、ブロック内のブラウザ キャッシュ用の2 つの -block を移動してlocation \
、後者が「親」として機能するようにしてみました。しかし、これによって 404 を返す画像などの動作は変わりませんでした。
Nginx で静的ファイルのキャッシュを構成するにはどうすればよいですか?
編集:
私は -block に次の内容を追加しましたhttp
:
map $uri $cache_control {
~/Website/assets/media/images "public, no-transform";
}
map $uri $expire {
~/Website/assets/media/images 365d;
}
以下をserver
-block に追加しました:
expires $expire;
add_header Cache-Control $cache_control;
何もキャッシュされません。
答え1
@TeroKilkanenが提案しているように、静的アセットをファイルシステムから直接nginx経由で提供できない場合は、次の例に示すような手法を使用できます。これ答え:
map $uri $expire {
~\.(?:j|cs)s$ 180d;
~\.(?:jpe?g|png|webp|woff2?|ttf)$ 365d;
default off;
}
map $uri $cache_control {
~\.(?:js|css|jpe?g|png|webp|woff2?|ttf)$ public;
}
server {
...
expires $expire;
add_header Pragma $cache_control;
add_header Cache-Control $cache_control;
...
}
リクエスト URI が正規表現と一致しない場合、$cache_control
変数は空の値を持ち、nginx は応答にヘッダーをまったくPragma
追加しません。Cache-Control
答え2
これは実際にあなたの質問に答えるものではありませんが、nginx で静的アセットを提供するための推奨される方法を示しています。
同じホスト上で Web アプリケーションを実行しているようなので、nginx を使用して静的ファイルを直接提供することをお勧めします。
root /path/to/webroot;
location ~* \.(js|jss)$ {
expires 180d;
add_header Pragma "public";
add_header Cache-Control "public;
try_files $uri =404;
}
location ~* \.(jpg|jpeg|png|webp|woff|woff2|ttf)$ {
expires 365d;
add_header Pragma "public";
add_header Cache-Control "public";
try_files $uri =404;
}
include
このファイルには、キャッシュの定義がまだ重複しています。別のファイルにディレクティブを指定し、 を使用してそのファイルを構成に含めることで、重複の一部を解消できます。
proxy_header.conf
ファイルに次のように入力します。
add_header Pragma "public";
add_header Cache-Control "public";
そしてあなたの設定では:
location ~* ... {
include /path/to/webroot;
expires 365d;
}