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