公司网站采用 nginx + apache + tomcat + db + nfs 的架构,即前端 nginx 进行 upstream 转发,交给后端的 apache 和 tomcat 进行处理,两个一静一动,各司其职。db 采用主从读写分离,各后端服务器 mount 挂载 nfs 上的某图片路径,用于共享运营上传上来的图片信息。
今天客服反映说很多公司的图片都看不到了,但是单独指定IP的话可以访问。
指定单独的IP可以访问,但是走 nginx 就不行,可以基本判定 nfs 没有问题,于是排查 nginx 错误,在 nfs 上查到的 nginx 转发图片的配置为:
location ~ /p/ {
expires -1;
rewrite ^/p/(.*) /picture/c/$1 break;
}
查看 nginx 错误日志,tail -f ng_err.log | grep '421965.jpg' 报如下错误,/opt/data/picture/c/logo/0/421/421965.jpg 现在发现,在 nginx 所做的转发是拦截 /p 的请求转发至 /picture/c , 而进入 /opt/data/picture 目录看,发现 logo 和 c 是同级文件夹,并且 c 下根本就不存在 logo 文件夹,判断了问题所在,提出了以下两种解决方法
1. 通知研发在代码层修改,将图片存取路径改为正确的,经反馈该代码代价太大,只好采取第二种方法了。
2. 修改 nginx 配置,将 rewrite ^/p/(.*) /picture/c/$1 break; 改为 rewrite ^/p/(.*) /picture/$1 break;
在此测试,找到了图片,问题解决。