nginx代理静态资源返回404问题解决过程

问题起因由于系统是两台服务器集群部署,同时运行了视频分析程序,会截取视频中的图片提供给前端访问,但是两台服务器截取的图片不能共享,所以想到了使用nginx做一个静态资源共享的代理。主要使用try_files配置检索本地文件,如果没有就代理到另外一台服务器,出现的问题是服务器A没有这个图片是会代理到服务器B,B也接受到了代理请求,而且也存在该图片,但是一直返回404,然后直接通过url请求B是能够拿到图片的,A的nginx配置如下

 nginx代理静态资源返回404问题解决过程_第1张图片

nginx代理静态资源返回404问题解决过程_第2张图片 

 B的配置如下

nginx代理静态资源返回404问题解决过程_第3张图片

配置是没问题的,A和B的nginx服务都能启动,先说一下我的排查思路最后说原因以及解决方案

我首先想到的是路径问题,通过nginx日志对比了代理请求和直接请求的路径是一样的,排除路径问题

 然后考虑是proxy_pass关键字有什么限制,所以换了rewrite,但是rewrite有个问题是会返回给浏览器304,由浏览器做重定向请求,这样会暴露静态资源的地址,不太安全,放弃

再接下来考虑可能是代理配置写错,所以去掉了try_files直接在static块里面进行代理,发现也不行,跟开始的报错一样,至此陷入僵局了,后来通过查资料才终于解决了问题

其实原因主要在于http请求中的host属性,我们知道nginx是需要监听server_name和端口的,根据请求的server_name和端口进行代理,其实server_name不是根据请求的地址匹配的,而是根据请求中的host属性进行匹配的,当我们配置代理时nginx默认的代理host配置是这样的

proxy_set_header Host $proxy_host;

这个其实是请求的后端地址,当我们设置了upstream是$proxy_host就是upstream的名字,所以是A先接到请求然后进行转发,由于我设置的upstream是fileserver,所以B接到的请求的host是fileserver,而B监听的server_name是B的地址,所以无法匹配到server_name就一直返回404

然后我再A进行转发时设置Host是B的地址就能够正常代理了

 

你可能感兴趣的:(nginx,后端,linux,nginx)