許昌專業(yè)做網(wǎng)站公司百度站長工具怎么查排名
問題場景:
項目中用到了多個子域名,測試環(huán)境通過子域名進行接口訪問的時候返回 404 NOT_FOUND,經(jīng)過排查測試后確定是 Nginx 配置問題,而導致事故的根本原因是運維在Nginx配置的時候少配置了一個斜杠(/),下面我們來聊聊具體情況。
故障現(xiàn)象如下:
nginx 配置如下:
location /api/{client_max_body_size 100m;proxy_connect_timeout 120;proxy_send_timeout 120;proxy_read_timeout 120;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://10.xxx.xxx.xxx:8080/api;}
接口請求結(jié)果如下:
{"code": 404,"message": "404 NOT_FOUND","data": ""
}
問題分析:
- 接口不存在,直接通過服務(wù)部署的機器,通過 ip + 端口訪問,正常響應(yīng)。
- 網(wǎng)關(guān) Gateway 有問題,通過 Gateway 服務(wù)部署的機器,通過 ip + 端口訪問,正常響應(yīng)。
- Nginx 配置有問題,通過 Nginx 的機器IP和暴露的端口去訪問,響應(yīng) 404,基本可以確定Nginx 配置有問題。
原因分析:
- 通過對問題現(xiàn)象分析,我們基本確定是 Nginx 配置的問題,我們?nèi)〔樵?Nginx 的日 看是否可以找到有效信息,沒有找到有用信息。
- 接著我們對 Gateway 日志進行分析,看看是否可以找到有用的信息,我們發(fā)現(xiàn)了這樣一段日志, /apidxx/v1/szzz/method(真實接口路徑不方便暴露,請理解),apidxx 這段有明顯問題,api 后面應(yīng)該有個斜桿 / ,才接著是 dxx 才對,這段日志是在 Gateway 發(fā)現(xiàn)的,再次證明是 Nginx 配置的問題,現(xiàn)在我們進一步確定了是少了個斜杠 /,已經(jīng)確定到了問題,現(xiàn)在去排查 Nginx 配置即可。
分析 Nginx 配置:
我們發(fā)現(xiàn) proxy_pass http://10.xxx.xxx.xxx:8080/api 這段配置在api 后面沒有接斜杠 / ,對比我們上面的分析,果斷加上斜杠試試,重啟后問題解決,正確的 Nginx 配置如下:
location /api/{client_max_body_size 100m;proxy_connect_timeout 120;proxy_send_timeout 120;proxy_read_timeout 120;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header REMOTE-HOST $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://10.xxx.xxx.xxx:8080/api/;}
問題解決了,下面我們來分析一下,斜杠的各種場景。
location、proxy_pass 斜杠分析:
以下分析,不在贅述驗證流程,感興趣的朋友可以自己去驗證,也歡迎提出疑問。
虛擬場景:我們需要通過 Nginx 代理訪問地址:http://127.0.0.1/api/zt/app/list。
location加斜杠,proxy_pass 加api(上面分析的案例),如下:
location /api/ {proxy_pass http://127.0.0.1:8888/api;
}
實際訪問地址 :http://127.0.0.1:8888/apizt/app/list,這是個錯誤的地址,apizt 之間少了斜杠 /,導致 404。
location 不加斜杠,proxy_pass 加 api,api后面不加斜杠 /,如下:
location /api {proxy_pass http://127.0.0.1:8888/api;
}
實際訪問地址 :http://127.0.0.1:8888/api/zt/app/list,地址正確。
location 不加斜杠,proxy_pass 加 api,api后面加斜杠 /,如下:
location /api {proxy_pass http://127.0.0.1:8888/api/;
}
實際訪問地址 :http://127.0.0.1:8888/api/zt/app/list,地址正確。
location 加斜杠,proxy_pass 加 api,api后面加斜杠 /,如下:
location /api/ {proxy_pass http://127.0.0.1:8888/api/;
}
實際訪問地址 :http://127.0.0.1:8888/api/zt/app/list,地址正確。
location 不加斜杠,proxy_pass 不加 api,如下:
location /api {proxy_pass http://127.0.0.1:8888;
}
實際訪問地址 :http://127.0.0.1:8888/api/zt/app/list,地址正確。
location 加斜杠,proxy_pass 不加 api,如下:
location /api/ {proxy_pass http://127.0.0.1:8888;
}
實際訪問地址 :http://127.0.0.1:8888/api/zt/app/list,地址正確。
location 加斜杠,proxy_pass 不加 api,如下:
location /api {proxy_pass http://127.0.0.1:8888/;
}
實際訪問地址 :http://127.0.0.1:8888//api/zt/app/list,地址錯誤。
總結(jié):
我們發(fā)現(xiàn) proxy_pass 基本可以分為兩種配置方法,一種是代理地址端口無字符,另外一種則是代理地址端口后有字符,下面給出結(jié)論:
- proxy_pass 代理地址端口后無任何字符,轉(zhuǎn)發(fā)后實際地址:代理地址+訪問URL接口路徑部分。
- proxy_pass 代理地址端口后有目錄(包括 / ),轉(zhuǎn)發(fā)后實際地址:代理地址+訪問URL目錄部分去除location匹配目錄。
Nginx常用命令:
#查看Nginx 進程命令
ps aux|grep nginx
#優(yōu)雅停止Nginx服務(wù)器命令
/data/svr/nginx/sbin/nginx -s quit
#啟動Nginx服務(wù)器命令(Nginx 很多命令都是在 sbin 目錄下執(zhí)行)
#去到sbin路徑:cd /usr/local/nginx/sbin
#啟動Nginx服務(wù)器: ./nginx
#修改配置后檢查配置文件是否出錯
/data/svr/nginx/sbin/nginx -t
#修改配置后熱加載
/data/svr/nginx/sbin/nginx -s reload
#指定啟動配置文件命令
/data/svr/nginx/sbin/nginx -c /data/svr/nginx/conf/nginx.conf
#暴力停止Nginx服務(wù)器命令
/data/svr/nginx/sbin/nginx -s stop
#優(yōu)雅停止Nginx服務(wù)器命令
/data/svr/nginx/sbin/nginx -s quit
如有不正確的地方歡迎各位指出糾正。