我的测试环境中有 3 台服务器:
- Linux 上运行 nginx
- 使用 ASP 应用程序运行 IIS 的 Win
- Linux 上运行带有 PHP 的 Apache。
我正在尝试设置静态文件缓存。服务器 2 和 3 的内容完全不同。
这是我的缓存配置:
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=static_cache:100m inactive=120m max_size=900M;
proxy_cache_min_uses 1;
这是 nginx 的主要配置文件:
server {
listen 80;
server_name _;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
location /foo/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.11:8888/foo/";
proxy_set_header X-debug-message-foo request_method|$host|$request_uri|$proxy_add_x_forwarded_for";
}
location /bar/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.10:8885/bar/";
proxy_set_header X-debug-message-bar "$request_method|$host|$request_uri|$proxy_add_x_forwarded_for";
}
location ~* ^.+/foo/.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.11:8888;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
location ~* ^.+/bar/.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.10:8885;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
}
因此,我的观点是为不同位置创建包含静态文件的缓存,如果缓存过期,nginx 必须从后端服务器(而不是从本地服务器的根目录)加载内容。不幸的是,sudo ls -la /var/cache/nginx
显示缓存目录始终为空。
我还尝试了如何通过像这样更改位置来缓存仅适用于一个后端站点
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|gz)
和
proxy_pass http://192.168.11.11:8888;
在这种情况下,foo 位置缓存工作正常,缓存文件夹不为空。当然,“bar”位置不提供任何静态文件。
UDP
最后我终于明白了。唯一可行的解决方案是使用嵌套位置上下文。就像这个例子一样:
server {
listen 80;
server_name _;
proxy_read_timeout 600s;
proxy_send_timeout 600s;
location /foo/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.11:8888/foo/";
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.11:8888;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
}
location /bar/ {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_pass "http://192.168.11.10:8885/bar/";
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|gz) {
expires 60d;
proxy_pass http://192.168.11.10:8885;
proxy_redirect off;
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_cache static_cache;
proxy_cache_key "$request_method|$host|$request_uri";
proxy_cache_valid 1d;
}
}
}
请记住,如果您的后端服务器不在子目录中(例如直接在 public_html 目录中,而不是像这个 public_html/foo),您需要使用rewrite /foo(.*) /$1 break;
嵌套位置上下文删除双子目录。
答案1
你的正则表达式似乎是错误的。
^.+/foo/.+.(jpg|jpeg|gif|css|png|js|ico|gz)
无法匹配类似的 url /foo/test.jpg
,只能匹配类似的 url /t/foo/test.jpg
。
+
表示一次或多次。