一次nginx 做负载均衡 +cache时 CACHE 全部不命中排错

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
简介:

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: image/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: image/gif
Last-Modified: Wed, 28 Sep 2011 08:11:24 GMT
Accept-Ranges: bytes
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. 1  # ls -i /etc/resolv.conf #查找 inode

  2. 3735567 /etc/resolv.conf

  3. 2 # find /etc -inum 3735567#查找硬连接

  4. /etc/sysconfig/networking/profiles/default/resolv.conf

  5. /etc/resolv.conf

  6. # lsof|grep resolv.conf #确认文件是否被打开

  7. # rm /etc/sysconfig/networking/profiles/default/resolv.conf #删除文件

  8. # restorecon /etc/resolv.conf  恢复文件预设

  9. # ln /etc/resolv.conf /etc/sysconfig/networking/profiles/default/resolv.conf #创建硬连接


问题解决

至于为什么硬连接文件出错 尚未查明  估计与磁盘文件写满有关



      本文转自天山三害 51CTO博客,原文链接:http://blog.51cto.com/skybug/1337794,如需转载请自行联系原作者





相关实践学习
使用CloudLens观测ALB下的网站访问情况
通过本实验,您可搭建网站,并使用ALB进行负载均衡,同时使用CloudLens for ALB一键采集ALB日志,进行ALB 7层日志分析、秒级监控指标分析、基于AIOps的自动异常巡检等操作。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
1月前
|
缓存 负载均衡 算法
解读 Nginx:构建高效反向代理和负载均衡的秘密
解读 Nginx:构建高效反向代理和负载均衡的秘密
42 2
|
2月前
|
负载均衡 应用服务中间件 nginx
解决nginx配置负载均衡时invalid host in upstream报错
在Windows环境下,配置Nginx 1.11.5进行负载均衡时遇到问题,服务无法启动。错误日志显示“invalid host in upstream”。检查发现上游服务器列表中,192.168.29.128的主机地址无效。负载均衡配置中,两个服务器地址前误加了"http://"。修正方法是删除上游服务器列表和proxy_pass中的"http://"。问题解决后,Nginx服务应能正常启动。
143 4
解决nginx配置负载均衡时invalid host in upstream报错
|
20天前
|
负载均衡 应用服务中间件 开发工具
技术笔记:nginx和keeplive实现负载均衡高可用
技术笔记:nginx和keeplive实现负载均衡高可用
|
2月前
|
负载均衡 前端开发 应用服务中间件
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400
|
2月前
|
负载均衡 前端开发 应用服务中间件
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400(2)
Nginx+Tomcat负载均衡配置_nginx做tomcat的负载均衡成功,但tomcat的css文件400(2)
|
1月前
|
负载均衡 算法 应用服务中间件
解密Nginx负载均衡:实现流量分发与故障转移
解密Nginx负载均衡:实现流量分发与故障转移
76 0
|
2月前
|
负载均衡 应用服务中间件 PHP
使用nginx-haproxy实现七层负载均衡
【4月更文挑战第13天】使用nginx实现动静分离的负载均衡集群
74 4
|
2月前
|
负载均衡 算法 网络协议
LVS、Nginx和HAProxy负载均衡器对比总结
LVS、Nginx和HAProxy负载均衡器对比总结
|
2月前
|
负载均衡 应用服务中间件 nginx
Nginx 负载均衡
Nginx 负载均衡
38 2
|
2月前
|
负载均衡 算法 应用服务中间件
解密Nginx负载均衡:实现流量分发与故障转移
解密Nginx负载均衡:实现流量分发与故障转移
69 1