nginx资源404问题排查
这篇⽂章本意是写给我司现场技术⽀持的同事的,顺⼿就放上来了。
背景
⽣产环境经常会出现图⽚访问不到的情况,⼤部分是由于nginx配置或者说路径指向不对导致的。
本⽂档仅针对⽹络正常且图⽚存在的情况,如果说是⽹络故障(ping不通图⽚服务器或者说nginx端⼝未打开)那肯定优先排查⽹络相关问题;如果说图⽚根本不存在,那么只能从图⽚⽣成的⾓度去排查问题。
nginx 简介
nginx服务器是⼀个⾼性能的http服务器,⽬前市⾯上⼤部分的静态资源(例如图⽚,html⽂件等)访问都是通过nginx服务器实现的,下⽂的图⽚⽆法访问的排查流程同样适⽤于其他通过nginx访问的静态资源。简单来说nginx服务器的作⽤就是将url转换为对应服务器上的⼀个具体的⽂件路径,如果url转换后的路径和实际的资源路径不匹配,那么就会发⽣⽆法访问对应资源的情况(例如图⽚裂图,或者直接页⾯报错404)。
nginx也可以作为反向代理服务器,但与本⽂⽆关,不作展开。
解决⽅法
本⽂接下来会详细讲解在nginx配置⽂件中通过root或alias关键字修改路径指向,配置软链接两种⽅式来解决问题,这两种⽅式⽐较轻量,当然暴⼒的将具体资源移动到url对应的路径下也可以解决问题,但⽣产环境⼀般没有这么理想,所以暂不讨论。
nginx配置⽂件指f,⼀般放在/etc/f,如果没有可以通过find命令查。
软链接是指linux系统中的⼀种符号链接,这个⽂件包含了另⼀个⽂件的路径名。可以理解为windows系统中的快捷⽅式,例如我们在桌⾯上建⽴了⼀个快捷⽅式,就可以直接通过这个快捷⽅式进⼊对应的⽂件夹,在linux中作⽤同理,⽤软链接可以让我们在不移动具体⽂件资源的情况下,让nginx获得正确的路径指向。
抛开root和alias两个关键字可以实现路径转换,nginx还⽀持其他更⾼级的路径转换操作,例如rewrite,本⽂同样不讨论,有兴趣⾃⾏了解。
排查思路
当出现图⽚⽆法访问的情况,⾸先应拿到对应图⽚的url(可以通过在浏览器页⾯上点击右键选择检查或者直接复制图⽚地址),然后再对⽐图⽚在服务器存放的实际位置,根据⼆者的差异选择不同的解决办法。
判断ip和端⼝是否指向正确
例如图⽚url为:192.168.4.62:50001/ifsrc/engine1/picture/0001/1.jpg,但实际图⽚存放路径为192.168.4.63服务器上的/picture/0001/1.jpg,那么可以通过nginx配置⽂件中的proxy_pass配置项解决这个问题。
proxy_pass:转发功能,将匹配上的路径转发到指定ip路径。
配置⽂件如下:
图中表⽰192.168.4.62的nginx服务器会将192.168.4.62:50001/ifsrc/engine1/picture/0001/1.jpg转换为192.168.4.63:80/picture/0001/1.jpg然后⾃动访问192.168.4.63的nginx服务器。
同时要⾮常主要图中箭头标注的位置的斜杠,如果不包含斜杠,那么最终的转换结果为192.168.4.63:80/ifsrc/engine1/picture/0001/1.jpg 。
proxy_pass也可以替换路径,有兴趣可以⾃⾏了解。
url⽂件路径和实际路径不符
这种情况解决⽅法有很多种,⽐较灵活,本⽂只介绍配置新的location和软链接两种模式。
配置新的location可以理解为是改变nginx的指向,配置软链接可以理解为是改变了⽂件的位置。
先简单提⼀下nginx配置⽂件,如上图,表⽰监听192.168.4.62的50001端⼝,⾄于location本⾝⽀持很多种匹配,详细情况见最后的location 关键字详解,此处只讲解location的通⽤匹配。这⾥的location /表⽰默认匹配路径,root /var/www/html表⽰默认匹配的根路径,例如
192.168.4.62/1.jpg,其实际访问的是/var/www/html/1.jpg这个⽂件。
⽐如⽬前图⽚的url为192.168.4.62:50001/changkou/changkou1/1.jpg,192.168.4.62:50001/changkou/changkou2/2.jpg。
假设其实际存放的路径如下:
正则匹配两个大写字母加两个数字/var
/www
/html
/changkou1
/1.jpg
/changkou2
/2.jpg
如果我们直接拿url去访问,那么其实际访问的地址为/var/www/html/changkou/changkou1/1.jpg和/var/www/html/changkou/changkou2/2.jpg,⾃然会出现404的情况。
修改nginx配置⽂件
可以通过下图中的两种配置⽅式来解决。
root或者alias都可以⽤来配置指向路径,只不过含义有⼀点区别。
对于root,nginx实际是将root路径 + 匹配的location+匹配的location之后的路径,对于changkou/changkou1/1.jpg这张图⽚,那么实际nginx访问的路径就是/var/www/html + /changkou/changkou1 + /1.jpg,与实际⽂件位置相同,可以正常访问图⽚。
对于alias,nginx实际是将alias路径 + 匹配的location之后的路径,对于changkou/changkou2/2.jpg这张图⽚,那么实际nginx访问的路径
是/var/www/html/changkou/changkou2/ + 2.jpg。也能达到相同的效果,可以正常访问图⽚。
配置软链接
同样是上⾯的问题,如果想要不改nginx配置⽂件,那么其⾥⾯只有⼀个通⽤的匹配规则,也就是任何图⽚都会去/var/www/html/这个⽬录下⾯去,虽然⽣产环境⼀般不能直接将⽂件移动到该位置,但可以通过配置软链接达到相同的效果。
创建软链接的命令为:
sudo ln -s ⽬标⽂件夹软链接名称
在不改变nginx配置⽂件的前提下,我们可以配置如下软链接
sudo ln -s /var/www/html/ changkou
最终效果为:
经测试图⽚同样可以正常访问。
在这种情况下,整个图⽚的访问流程如下
1. 先根据url 19
2.168.4.62:50001/changkou/changkou1/1.jpg,匹配到/var/www/html/changkou/changkou1/1.jpg。
2. 然后去/var/www/html/下⾯可以名为changkou的软链接或者⽬录,实际能到软链接changkou。
3. 最后再根据changkou的软链接定位到/var/www/html/,最后根据changkou1/1.jpg到具体⽂件。
nginx配置⽂件中 location 关键字详解
location 关键字是⽤来匹配对应的url,以对不同的url进⾏不同的处理。
location语法规则:
location [=||*|^~] /uri/ { … }
=开头表⽰精确匹配
^~开头表⽰uri以某个常规字符串开头,理解为匹配 url路径即可。nginx不对url做编码,因此请求为/static/20%/aa,可以被
规则^~ /static/ /aa匹配到(注意是空格)。以xx开头
~开头表⽰区分⼤⼩写的正则匹配以xx结尾
~*开头表⽰不区分⼤⼩写的正则匹配以xx结尾
!~和!~*分别为区分⼤⼩写不匹配及不区分⼤⼩写不匹配的正则
/通⽤匹配,任何请求都会匹配到。
对于location匹配规则有兴趣可以参考:
官⽅⽂档路径如下:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。