问题描述
- 使用nginx做服务器请求静态文件
- 将配置文件和静态文件采用volumes的方式映射进入
- 访问路径发现ngixn 404
解决步骤
- Q1: 考虑这个出现404,必然是两种情况,第一是资源或者配置文件不在容器对应的路径之下,第二是配置文件路径有问题。那么该如何确定?
- A1: 最好确定的是就是资源,进入容器查看资源是否存在在对应路径下。这里我经常出现的问题在于三部分:
- 映射的源文件给错,导致资源无法映射进入,还在错误的源文件路径下创建了一个空文件夹(这是volumes的机制,不论原路径还是目标路径只要对应文件/文件夹不存在一定会在对应路径下创建一个同名文件夹)
//例子 volumes: - ./default.conf:/etc/nginx/conf.d/default.conf //正确的源文件路径在./nginx/default.conf,以上给了错误的路径,导致在./default.conf处创建了一个名字叫做default.conf的件夹
- 访问到了正确的资源路径却出现403错误:这通常是访问到了正确的资源路径,但是资源的权限或者类型(你要文件,但是真正资源是文件夹)不对
volumes: - ./nginx/images/zhao.jpg:/var/images/zhao.jpg //当源文件路径不对,就会创建一个叫做zhao.jpg的文件夹,此时如果你访问了对的路由,那么必然出现403错误
- nginx配置文件的存放位置和命名有问题:根据官网要求:需要把ngixn的配置文件存放在
/usr/local/nginx/conf或者/etc/nginx或者 /usr/local/etc/nginx下面。并且通常命名为nginx.conf
- Q2:如果不是资源或者数据的路径存放有问题,如果是配置有问题,比如
alias/root/proxy_pass
配置错误,他们在页面上都出现的是你请求的路径,并不能看到你真正的路径,但又报错,这时候该怎么办? - A2:最有效的办法必然是打印错误日志
docker logs nginx
直接可以查看到请求的路径域名method各种信息。本问题就是打印了日志之后发现alias配置有问题alias要求其值也就是路径必须以/结尾用个例子简单说明:
location /api/ {
alias /web/app;
}
//请求:http://localhost:8080/api/zhang.jpg
经过alias---> http://localhost:8080web/app/zhao.jpg
可以看出路径有问题:alias会将和location匹配的部分全部去掉因此原请求中的/api/会被去掉,剩下zhang.jpg直接拼接在app之后因此解决办法有两种
location /api {
alias /web/app;
}或者
location /api/ {
alias /web/app/;
}
----->每次修改了配置文件别忘记重启nginx(docker restart nginx
)
心得
- 遇到bug,以前先是脑子空了很生气,不知道怎么办。然后就是不管三七二十一,直接复制错误搜索答案。再后来是猜测可能什么问题。直到现在,必须改变,找错误日志,读懂错误,然后再考虑可能的原因,再去根据猜测的原因搜索这才是正解,但这一切基于是否能静下心来读懂英语。所以以后必须强迫自己读懂
- 对于以后阅读英语,绝对不允许自己读完一句话啥也没懂,一点没有收获,一句两句多了就浪费时间了。