场景:
我在测试服部署了一个项目,姑且命名它为A项目,域名是https://rcrc.testpage.com;在这同一个域名的情况下:
- 管理后台的地址可以登录:https://rcrc.testpage.com/guanlihoutai/;
- 此域名拼接的接口可以被第三方调用;
- 但以这域名开头的图片(图片存在服务器中)却报错404不能被访问或打开:https://rcrc.testpage.com/static/UN/11/29/Gshfd.jpg;
排查思路:
- 首先域名指向的服务器肯定没问题,也没有拦截黑名单等。因为管理后台可以被不同用户登录且接口可以被调用。
- 错误是哪里报的?仅仅是图片无法访问,那么考虑应该是访问静态文件这边出了问题
排查步骤:
-
查看报错日志
日志是Nginx报的,如果不知道Nginx的错误日志在哪里,可在使用nginx -t 命令先进入其配置文件,找到配置文件中error_log的地址,然后再使用cat+日志地址 的命令查看日志内容。
错误内容显示如下图:找不到“/var/filepath/static/xxxxx…” 很明显,nginx并不认识这个图片地址,就是说,它在这个路径下根本没办法找到对到对应的图片。
那nginx是怎么拼出找到这个错误地址的呢?
-
首先弄清楚,nginx是以容器部署在Docker中还是直接部署在宿主机上?
我是用Docker ps 命令并未发现以容器的运行的nginx,所以我的nginx是直接运行在了宿主机上
那么接下来就要看,这个A项目里的配置文件怎么配的 -
查看该项目的nginx的配置文件
找到该项目的配置文件A.conf;打开后发现静态文件的访问当前的配置是:
所以nginx直接用这个/var/filepath路径去拼接了/static/…图片路径,可是这其实是个挂载路径,我的nginx并不认识docker中的/var/filepath挂载目录。 这个目录的挂载关系在项目的docker-compose.yml中映射,如下:
经过查找,图片确实存在这个真实的宿主机路径下:/home/docker-compose/filepath,将该项目的A.conf文件的静态资源访问位置改成真实的宿主机路径:
这样一改,Nginx就会根据这个真实的宿主机路径去找到这个图片,这回就能访问图片成功了