nginx 不同后端静态文件缓存

nginx 不同后端静态文件缓存

我的测试环境中有 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

+表示一次或多次。

相关内容