记录一次http请求失败的问题分析
問題背景
當前我有一個基于Flask編寫的Restful服務,由于業務的需求,我需要將該服務打包成docker 鏡像進行離線部署,原始服務的端口是在6661端口進行開啟,為了區分,在docker中啟動的服務使用了端口映射,將宿主機上的6665端口映射到docker容器中已啟動服務的6661端口.
假設宿主機的ip地址為:192.168.124.234,即如果我請求宿主機的http://192.168.124.234:6665/api/hello,實際上是訪問docker容器中的XXXX:6661/api/hello
docker服務啟動完成后的顯示如下:
問題描述
在組內使用自行部署的接口管理工具中(yapi)進行接口請求,接口顯示請求異常,并且該條請求在服務內部日志中也沒有顯示,但是同樣的請求api在其他多種方式下均可正常請求。
ps: yapi是通過瀏覽器打開的網頁進行訪問的,yapi如果希望在網頁上進行訪問接口需要安裝yapi指定的chrome插件方可在chrome瀏覽器中進行訪問
正確結果
- 當docker完成啟動之后我通過postman進行訪問,可以正確得到結果:
- 當我在其他機器乃至docker宿主機上通過
curl進行請求,也可以正確得到結果
問題初判斷
由于通過yapi訪問訪問部署在其他機器的服務均沒有問題,并且通過postman、curl進行請求api也沒有問題所以肯定的是服務本身是沒有問題的
所以初步判斷問題如下:
- 問題1: api請求是否正確到達docker容器中的服務?
- 問題2: api請求沒有正確到達宿主機?
- 問題3: api請求沒有正確的傳出chrome瀏覽器?(ps:由于請求其他服務器的接口沒有問題,最開始并沒有這樣的懷疑)
問題解決
問題1:api請求是否正確到達docker容器中的服務?
由于docker容器中的服務log中沒有請求的日志信息記錄,所以api請求一定是沒有到達docker容器中的服務
問題2:api請求沒有正確到達宿主機?
這里需要通過借用tcpdump進行數據抓包,我們通過下面的命令進行監聽eno1接口的所有數據包并將數據寫入到1.pcap文件中
tcpdump -i eno1 -w 1.pcap
然后我們通過wireshark軟件對數據包進行分析
發現我們在使用yapi在chrome中進行接口請求時候,我們并沒有抓到請求6665端口的數據包
而我們使用postman或者curl進行訪問的時候進行訪問的時候都完整的抓到了數據包,所以結論是:通過yapi進行api請求沒有正確到達宿主機
問題3:api請求沒有正確的傳出chrome瀏覽器?
由于yapi在chrome瀏覽器中發出的請求,是通過chrome插件進行的,所以我們使用F12查看chrome的debug頁面是看不見請求結果的,無論怎么請求都沒有反應。
所以我們通過查看chrome插件的debug頁面,然后點擊“發送”按鈕還是沒有反應
經過搜索發現chrome插件的調試還有一個background頁面可以進行調試,關于chrome插件的backgroud信息可以看這里,我們在插件上用鼠標右鍵調出如下界面:
然后點擊"背景頁",出現如下界面:
這時候當我們點擊yapi中的“發送”按鈕時候,在這個頁面中終于發現了報錯信息:
說是(failed)net::ERR_UNSAFE_PORT,也就是我請求的這個端口不安全
這才反應到可能是我的端口設置問題,經過搜索發現:
6665——6669這幾個端口是IRC協議使用的缺省端口,存在很大的安全風險,很容易被木馬程序利用,被谷歌火狐瀏覽器屏蔽掉了
這真是太坑了,千算萬算沒算到竟然是端口設置的問題,然后被chrome瀏覽器屏蔽了訪問
于是我將端口換了一個,問題完美解決。
收獲
后端服務的端口千萬不要隨便設置
后端服務的端口千萬不要隨便設置
后端服務的端口千萬不要隨便設置
參考
6665——6669端口為什么用不了
【干貨】Chrome插件(擴展)開發全攻略
總結
以上是生活随笔為你收集整理的记录一次http请求失败的问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【置顶】利用 NLP 技术做简单数据可视
- 下一篇: 我的博客开工了