Caching Nginx-为什么不是&x27;uwsgi_缓存是否使用此标头?

Caching Nginx-为什么不是&x27;uwsgi_缓存是否使用此标头?,caching,nginx,web2py,uwsgi,Caching,Nginx,Web2py,Uwsgi,我正在使用Nginx+uWsgi+web2py框架,我想让Nginx缓存web2py生成的HTML响应 web2py生成的HTML标题如下: Cache-Control:max-age=300, s-maxage=300, public Connection:keep-alive Content-Length:147 Content-Type:text/html; charset=utf-8 Date:Mon, 27 Mar 2017 16:27:54 GMT Expires:lun, 27 m

我正在使用Nginx+uWsgi+web2py框架,我想让Nginx缓存web2py生成的HTML响应

web2py生成的HTML标题如下:

Cache-Control:max-age=300, s-maxage=300, public
Connection:keep-alive
Content-Length:147
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Mar 2017 16:27:54 GMT
Expires:lun, 27 mar 2017 16:32:54 GMT
Server:Rocket 1.2.6 Python/2.7.6
X-Powered-By:web2py
这些是web2py嵌入式服务器直接提供的服务。 与nginx和uwsgi(无任何缓存配置)一起提供的相同请求会生成以下标头:

Cache-Control:max-age=300, s-maxage=300, public
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Mar 2017 16:31:09 GMT
Expires:lun, 27 mar 2017 16:36:09 GMT
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:web2py
现在,我想为nginx配置实现
uwsgi\u缓存
,我尝试如下:

uwsgi_cache_path /tmp/nginx_cache/ levels=1:2 keys_zone=mycache:10m max_size=10g inactive=10m use_temp_path=off;

server {  
    listen 80;
    server_name  myapp.com;
    root /home/user/myapp;

    location / {
        uwsgi_cache mycache;
        uwsgi_cache_valid 200 15m;
        uwsgi_cache_key $request_uri;

        add_header X-uWSGI-Cache $upstream_cache_status;

        expires 1h;

        uwsgi_pass      unix:///tmp/myapp.socket;
        include         uwsgi_params;
        uwsgi_param     UWSGI_SCHEME $scheme;
        uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;
    }
}
location / {
        uwsgi_cache mycache;
        uwsgi_cache_valid 200 15m;
        uwsgi_cache_key $scheme$proxy_host$uri$is_args$args;

        add_header X-uWSGI-Cache $upstream_cache_status;

        proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie Vary;

        uwsgi_pass      unix:///tmp/myapp.socket;
        include         uwsgi_params;
        uwsgi_param     UWSGI_SCHEME $scheme;
        uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;
}
但是,每次我点击一个URL时,我都会在响应头中发现一个错误,这表明nginx没有为来自缓存的请求提供服务:

Cache-Control:max-age=3600
Connection:keep-alive
Content-Encoding:gzip
Content-Type:text/html; charset=utf-8
Date:Mon, 27 Mar 2017 16:37:29 GMT
Expires:Mon, 27 Mar 2017 22:37:29 GMT
Server:nginx
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:web2py
X-uWSGI-Cache:MISS
nginx进程正在以“www-data”用户/组的身份运行。我已经检查了文件夹/tmp/nginx_cache/的权限,它们都正常:用户有读写文件夹的权限。此外,在/tmp/nginx_缓存中,nginx创建了一个“temp”文件夹,但没有写入缓存文件

我还尝试将
proxy\u ignore\u headers
添加到location块,以指示nginx忽略一些头,如Set Cookie和Cache Control,如下所示:

uwsgi_cache_path /tmp/nginx_cache/ levels=1:2 keys_zone=mycache:10m max_size=10g inactive=10m use_temp_path=off;

server {  
    listen 80;
    server_name  myapp.com;
    root /home/user/myapp;

    location / {
        uwsgi_cache mycache;
        uwsgi_cache_valid 200 15m;
        uwsgi_cache_key $request_uri;

        add_header X-uWSGI-Cache $upstream_cache_status;

        expires 1h;

        uwsgi_pass      unix:///tmp/myapp.socket;
        include         uwsgi_params;
        uwsgi_param     UWSGI_SCHEME $scheme;
        uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;
    }
}
location / {
        uwsgi_cache mycache;
        uwsgi_cache_valid 200 15m;
        uwsgi_cache_key $scheme$proxy_host$uri$is_args$args;

        add_header X-uWSGI-Cache $upstream_cache_status;

        proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie Vary;

        uwsgi_pass      unix:///tmp/myapp.socket;
        include         uwsgi_params;
        uwsgi_param     UWSGI_SCHEME $scheme;
        uwsgi_param     SERVER_SOFTWARE    nginx/$nginx_version;
}
然而,这并没有什么区别:第一个请求并没有被缓存,所有后续的请求都是未命中的,也就是说,它们并没有从缓存中得到服务

我发现了这篇类似的帖子,回答的人指出这可能是web2py(在本例中)生成的响应标题的问题:


为什么nginx不缓存响应?

我找到了问题的原因:我将uwsgi\u cache\u*指令与proxy\u cache\u*指令混合在一起,它们属于不同的nginx模块。我只是需要用uwsgi\u ignore\u头替换proxy\u ignore\u头


请注意,模块不同于,它们有非常相似的指令,但它们是两个不同的模块。

我找到了问题的原因:我将uwsgi\u cache\u*指令与proxy\u cache\u*指令混合在一起,它们属于不同的Nginx模块。我只是需要用uwsgi\u ignore\u头替换proxy\u ignore\u头


请注意,模块不同于,它们有非常相似的指令,但它们是两个不同的模块。

您的uwsgi\u缓存\u密钥使用代理主机,这可能在本上下文中未定义。你能评论掉这句话并重新测试吗?谢谢你的建议。我已将uwsgi\u cache\u key更改为:
uwsgi\u cache\u key$request\u uri
…但是行为是一样的,nginx不缓存uwsgi响应:/抱歉,我忘了提到我也尝试删除
uwsgi\u cache\u键
指令,但没有任何区别。当删除该指令时,nginx在开始时警告我“uwsgi\u cache”没有“uwsgi\u cache\u key”。但是,行为仍然是一样的:nginx不缓存uwsgi响应。您可以尝试更新缓存键并删除代理\u忽略\u头吗?NGINX不会缓存没有过期日期的内容。我尝试了相同的配置,但没有
proxy\u ignore\u headers
指令,但仍然是相同的。还尝试只忽略Set-Cookie标头,尽管这不是必需的,因为Set-Cookie标头不存在于我的应用程序生成的响应中。我对此感到非常困惑:/uwsgi\u cache\u密钥使用的是代理主机,这在本文中可能没有定义。你能评论掉这句话并重新测试吗?谢谢你的建议。我已将uwsgi\u cache\u key更改为:
uwsgi\u cache\u key$request\u uri
…但是行为是一样的,nginx不缓存uwsgi响应:/抱歉,我忘了提到我也尝试删除
uwsgi\u cache\u键
指令,但没有任何区别。当删除该指令时,nginx在开始时警告我“uwsgi\u cache”没有“uwsgi\u cache\u key”。但是,行为仍然是一样的:nginx不缓存uwsgi响应。您可以尝试更新缓存键并删除代理\u忽略\u头吗?NGINX不会缓存没有过期日期的内容。我尝试了相同的配置,但没有
proxy\u ignore\u headers
指令,但仍然是相同的。还尝试只忽略Set-Cookie标头,尽管这不是必需的,因为Set-Cookie标头不存在于我的应用程序生成的响应中。我对这个很迷茫:/