nginx 中设置如下
http{
......
server{
....
location ~*\.(gif|jpg|jpeg|png|bmp|swf|htm|html|shtml)$
{
expires 1d;
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 30m;
proxy_cache_valid any 30m;
proxy_cache_key $host$uri$is_args$args;
add_header Nginx-Cache "$upstream_cache_status from skybug's cache ";
proxy_set_header Host $server_name
proxy_pass_header X-Real-IP;
proxy_pass_header REMOTE-HOST;
proxy_pass_header X-Forwarded-For;
proxy_pass
http://xxxx.server_pool;
}
....
}
}
用httpdebug测试n次 发现 $upstream_cache_statu s 一直是MISS
初步认为是 cache_one的物理路径 权限不够 写不了cache文件
ls -al /var/nginx/cache/cache_one
看到 权限是正常的
反复检查 nginxd.conf 和站点的conf 发现没有错误
用httpdebug直接访问后端服务器 图片文件
http头响应也无异常
HTTP/1.1 200 OK
Content-Length: 137
Content-Type: p_w_picpath/gif
Last-Modified: Wed, 28 Sep 2011 08:11:24 GMT
Accept-Ranges: bytes
ETag: "09e9236b67dcc1:17fb"
Date: Sat, 27 Apr 2013 14:35:23 GMT
使用ipad下的webdebug直接访问后端服务器的图片文件
发现http响应头为
HTTP/1.1 200 OK
Content-Length: 137
Content-Type: p_w_picpath/gif
Last-Modified: Wed, 28 Sep 2011 08:11:24 GMT
Accept-Ranges: bytes
Cache-Control:no-cache
Cache-Control:no-cache
ETag: "09e9236b67dcc1:17fb"
Date: Sat, 27 Apr 2013 14:35:23 GMT
多了个no-cache
问题就在这里了
检查后端服务器,想起来前几天由于应急,临时在站点的http头里将 立即失效打了勾勾, 也就是相当于 no-cache
关闭后端服务器的no-cache后
重新测试nginx $upstream_status 在第二次访问同一个图片的时候 返回HIT 终于不是MISS了
结论1 后端服务器如果设置no_cache 要么在nginx前端设置 proxy_ignore_headers "cache-control"忽略后端服务器的cache控制头,要么直接关闭后端的cache-control:no-cache
结论2 桌面上用的免费的httpdebug软件 不靠谱 竟然没有返回正确的cache-control的响应头 在IPAD上花了16元钱买的webdebug倒是正确返回了 忘记用IE10自带的F12工具测试 估计这个返回也是正常的。
另 在查看cache MISS问题的时候 发现/var/log/message 里有如下错误
restorecond: Will not restore a file with more than one hard link (/etc/resolv.conf)
文件硬链接 出错导致
1 # ls -i /etc/resolv.conf #查找 inode
3735567 /etc/resolv.conf
2 # find /etc -inum 3735567#查找硬连接
/etc/sysconfig/networking/profiles/default/resolv.conf
/etc/resolv.conf
# lsof|grep resolv.conf #确认文件是否被打开
# rm /etc/sysconfig/networking/profiles/default/resolv.conf #删除文件
# restorecon /etc/resolv.conf 恢复文件预设
# ln /etc/resolv.conf /etc/sysconfig/networking/profiles/default/resolv.conf #创建硬连接
问题解决
至于为什么硬连接文件出错 尚未查明 估计与磁盘文件写满有关
转载于:https://blog.51cto.com/skybug/1337794