Nginx可以caching包含X-Accel-Redirect头的上游响应吗?

我正在使用nginx作为应用程序服务器前面的反向代理。 应用程序响应一个X-Accel-Redirect头文件,告诉nginx要提供哪个静态文件。 我希望能够做的是让nginxcaching一些上游回应,所以它可以提供正确的文件,而无需点击应用服务器。

不幸的是,这不起作用:nginx似乎拒绝用X-Accel-Redirect头caching任何响应。 如果我不使用X-Accel-Redirect并让应用程序服务器返回文件本身,那么caching完美无缺。 然而,这并不是非常有效,因为应用程序服务器必须从磁盘读取文件并将其发送给nginx,nginx然后将文件写回磁盘(在其caching中)并将其发送到客户端。

这里是我的nginxconfiguration的精简版本:

proxy_cache_path /tmp/nginx-cache keys_zone=testzone:10m; server { location / { proxy_cache testzone; proxy_pass http://localhost:8000/; } location /static-files/ { internal; alias /var/static-files/; } } 

有谁知道我试图做什么是可能的? 我的怀疑是,当nginx发现X-Accel-Redirect头部时,它立即跳转到处理提供的URI并跳过正常的caching逻辑,但是确认这个会很好。

我有一个类似的情况,Nginx不想caching我的东西,因为我正在使用的Web应用程序试图设置我不想设置的Cookie。

http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_ignore_headers

除非你想雇佣一些人来破解源代码,否则你可能会尝试的是将nginx作为自己的代理,然后再转到web应用程序。

在中间的一个,你忽略了X-Accel-Redirect头,因此caching应该再次进行。

在前面的一个,你不要做caching,而是向中间的那个cachingX-Accel-Redirect响应的代理请求。

我不明白为什么这样的东西不应该工作! 🙂

我build议你重写你的服务器和位置块:

 server { location / { proxy_cache testzone; proxy_pass http://localhost:8000; } location ~* \.(ico|js|jpg|png|gif|jpeg|mp3|wav|swf|mov|doc|pdf|flv|css)$ { expires max; proxy_cache testzone; proxy_pass http://localhost:8000; } } 

也看看proxy_temp_path http://wiki.nginx.org/HttpProxyModule#proxy_temp_path 。 虽然已经默认启用(我想),我喜欢看这个文件夹,看看是否存储对静态内容的请求。