問題描述
- 使用nginx做服務(wù)器請求靜態(tài)文件
- 將配置文件和靜態(tài)文件采用volumes的方式映射進入
- 訪問路徑發(fā)現(xiàn)ngixn 404
解決步驟
- Q1: 考慮這個出現(xiàn)404敛瓷,必然是兩種情況凭舶,第一是資源或者配置文件不在容器對應(yīng)的路徑之下,第二是配置文件路徑有問題。那么該如何確定笤休?
- A1: 最好確定的是就是資源齿椅,進入容器查看資源是否存在在對應(yīng)路徑下。這里我經(jīng)常出現(xiàn)的問題在于三部分:
- 映射的源文件給錯玻侥,導(dǎo)致資源無法映射進入决摧,還在錯誤的源文件路徑下創(chuàng)建了一個空文件夾(這是volumes的機制,不論原路徑還是目標路徑只要對應(yīng)文件/文件夾不存在一定會在對應(yīng)路徑下創(chuàng)建一個同名文件夾)
//例子 volumes: - ./default.conf:/etc/nginx/conf.d/default.conf //正確的源文件路徑在./nginx/default.conf,以上給了錯誤的路徑使碾,導(dǎo)致在./default.conf處創(chuàng)建了一個名字叫做default.conf的件夾
- 訪問到了正確的資源路徑卻出現(xiàn)403錯誤:這通常是訪問到了正確的資源路徑蜜徽,但是資源的權(quán)限或者類型(你要文件,但是真正資源是文件夾)不對
volumes: - ./nginx/images/zhao.jpg:/var/images/zhao.jpg //當源文件路徑不對票摇,就會創(chuàng)建一個叫做zhao.jpg的文件夾拘鞋,此時如果你訪問了對的路由,那么必然出現(xiàn)403錯誤
- nginx配置文件的存放位置和命名有問題:根據(jù)官網(wǎng)要求:需要把ngixn的配置文件存放在
/usr/local/nginx/conf或者/etc/nginx或者 /usr/local/etc/nginx下面矢门。并且通常命名為nginx.conf
- Q2:如果不是資源或者數(shù)據(jù)的路徑存放有問題盆色,如果是配置有問題,比如
alias/root/proxy_pass
配置錯誤祟剔,他們在頁面上都出現(xiàn)的是你請求的路徑隔躲,并不能看到你真正的路徑英妓,但又報錯坊秸,這時候該怎么辦? - A2:最有效的辦法必然是打印錯誤日志
docker logs nginx
直接可以查看到請求的路徑域名method各種信息赠群。本問題就是打印了日志之后發(fā)現(xiàn)alias配置有問題alias要求其值也就是路徑必須以/結(jié)尾用個例子簡單說明:
location /api/ {
alias /web/app;
}
//請求:http://localhost:8080/api/zhang.jpg
經(jīng)過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浑吟,以前先是腦子空了很生氣,不知道怎么辦耗溜。然后就是不管三七二十一组力,直接復(fù)制錯誤搜索答案。再后來是猜測可能什么問題抖拴。直到現(xiàn)在燎字,必須改變,找錯誤日志阿宅,讀懂錯誤候衍,然后再考慮可能的原因,再去根據(jù)猜測的原因搜索這才是正解家夺,但這一切基于是否能靜下心來讀懂英語脱柱。所以以后必須強迫自己讀懂
- 對于以后閱讀英語,絕對不允許自己讀完一句話啥也沒懂拉馋,一點沒有收獲榨为,一句兩句多了就浪費時間了惨好。