我有 Rails 应用程序。它有 nginx 配置的一部分: 上游应用服务器{ 服务器 unix:/var/www/app/shared/unicorn.sock fail_timeout=0;
server {
listen 80;
server_name app hostname;
keepalive_timeout 5;
root /var/www/app/current/public;
try_files $uri/index.html $uri.html $uri @app;
location @app {
proxy_pass http://app_server;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_cache off;
}
location ~ /assets/*\.(png|gif|jpg|jpeg|css|js|swf|ico|gz)(\?[0-9]+)?$ {
access_log off;
}
}
我想缓存我的应用程序的多个页面(例如所有 *.json 网址)。我该怎么做?
根据 nginx 文档,我不能:
- 在命名位置使用嵌套位置
- 在 if block 中使用 proxy_cache
最佳答案
如果静态文件 block 中的扩展名不是虚拟 URL,您可以将 Json 添加到扩展名中。 如果是,您需要通过默认将所有内容转发到您的应用程序并进行异常(exception)设置来进行不同的设置,从而避免使用命名位置。或者您可以根据命名位置内的 if 语句设置变量:
location @app {
set $proxy_cache_cfg "off";
if($request_uri ~ \.json$) {
set $proxy_cache_cfg "json_zone";
}
}
未经测试,不确定是否应引用“off”以及它是否适用于此处。如果这不起作用,您始终可以使用相反的方法并根据变量设置 proxy_no_cache,因为这对任何非空和非零的东西都有效。
关于Nginx:仅缓存特定的 url 和命名位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26122637/