Nginx - 为什么uwsgi_cache不能使用这个头文件?

时间:2017-03-27 16:56:29

标签: 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 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_cache,我尝试这样做:

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;
    }
}

但是,每当我点击一个URL时,我在响应头中都会得到一个MISS,表明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_cache / a" temp"文件夹由nginx创建,但没有写入缓存文件。

我还尝试将proxy_ignore_headers添加到位置块,以指示nginx忽略Set-Cookie和Cache-Control等标题,如下所示:

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;
}

然而,这没有区别:第一个请求没有被缓存,所有后续请求都是MISS,也就是说,它们不是从缓存中提供的。

我发现了这篇类似的帖子,答案的人指出这可能是(在这种情况下)web2py生成的响应标题的问题: https://serverfault.com/questions/690164/why-is-this-nginx-setup-not-caching-responses

为什么nginx没有缓存响应?

1 个答案:

答案 0 :(得分:0)

我发现了问题的原因:我将uwsgi_cache_ *指令与proxy_cache_ *指令混合使用,它们属于不同的Nginx模块。我只是需要用uwsgi_ignore_headers替换proxy_ignore_headers

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