背景
問題症狀:
測試線上域名david.domain.com對應的服務器(Nginx1.12實現, 111.111.111.111) 通過中轉機(111.111.111.112), 調用線下機器(192.201.4.53)上部署的微服務接口SpringCloud體系, 含Zuul Gateway, Eureka, MicroService)時.
發現對於中轉機,無法ping通, 也無法telnet通.
機器信息
類型 | 功能 | IP |
---|---|---|
線上Nginx | 反向代理 | 111.111.111.111 |
中轉機 | 部署了nginx服務(80端口對外服務), 中轉線上微服務請求至線下微服務體系中,win08服務器 | 111.111.111.112 |
微服務 | 線下提供微服務API | 192.201.4.53 |
逐步排查
①. 檢查線下微服務是否正常
MicroService訪問方式 | 樣例 |
---|---|
直接訪問 | http://192.201.4.53:8005/personalRcommend/getHotSaleTest |
通過Gateway 訪問 | http://192.201.4.53:8900/ds/rec/personalRcommend/getHotSaleTest 或http://192.201.4.53:8900/ds/rec/info(僅獲取微服務簡短服務可用與否的信息) |
測試下來,沒有問題, 說明底層微服務狀態良好, 排除線上微服務服務異常問題.
②. 檢查中轉機至線下機器是否正常
在瀏覽器中輸入, 走中轉機服務器路徑的如下接口URL:
http://111.111.111.112/ds/rec/info
發現服務異常, 說明中轉機至線下的http請求(底層爲tcp協議)有問題. 但通過ping(底層爲icmp協議)命令,如下, 可以ping通線下機器.
G:\Software\nginx-1.14.2>ping 192.201.4.53
正在 Ping 192.201.4.53 具有 32 字節的數據:
來自 192.201.4.53 的回覆: 字節=32 時間<1ms TTL=61
來自 192.201.4.53 的回覆: 字節=32 時間<1ms TTL=61
來自 192.201.4.53 的回覆: 字節=32 時間=1ms TTL=61
來自 192.201.4.53 的回覆: 字節=32 時間<1ms TTL=61
192.201.4.53 的 Ping 統計信息:
數據包: 已發送 = 4,已接收 = 4,丟失 = 0 (0% 丟失),
往返行程的估計時間(以毫秒爲單位):
最短 = 0ms,最長 = 1ms,平均 = 0ms
說明, 中轉機可以訪問到測試機器, 但通過中轉機的nginx服務(入站規則:80端口)無法訪問到線下資源.
中轉機nginx(windows版本)配置:
upstream micro_service_server {
server 192.201.4.53:8900;
}
server {
#......
location /ds/rec/ {
proxy_pass http://micro_service_server/ds/rec/;
}
#......
}
③. 檢查線上至中轉機是否正常
線上服務器上, 執行telnet到中轉機nginx服務的操作:
[david_admin@server111-111 ~]$ telnet 111.111.111.112 80
Trying 111.111.111.112...
telnet: connect to address 111.111.111.112: Connection timed out
telnet(底層爲tcp協議)失敗, 說明線上連接至跳板機的80端口有異常.
線上Nginx(Linux版本)配置:
location /ds/rec/ {
proxy_pass http://111.111.111.112/ds/rec/;
}
④. 總結
②/③等排查步驟, 都說明了中轉機在使用tcp服務(連接 或 端口)提供承上啓下的中繼服務時,出現異常. 考慮到中轉機在nginx上使用80端口對外提供服務, 故猜想是否可以在中轉機側配置防火牆入站規則, 使得使用80端口的http請求可以被放行.
解決方案:
Windows防火牆設置端口白名單
詳見文末"參考列表".
配置之後測試, 發現問題得以解決, 線上telnet 中轉機的 80端口 已正常, 但還是無法ping通 中轉機.
注意:
由於telnet 和 ping 走了不同的網絡協議, 本例中出現不能ping通中轉機, 但能telnet通中轉機的80端口的情況是正常的.
附錄:
①. 不同軟件的協議使用情況
ping / telnet / tracert 命令使用的協議棧, 如下 :
協議名 | 使用協議類型 | 使用樣例 |
---|---|---|
telnet | tcp | telnet 192.168.1.100 80 |
ping | icmp | ping www.csdn.net 或ping 192.168.1.101 |
tracert | icmp | tracert 192.168.1.102 |
Tips:
ICMP全稱Internet Control Message Protocol,中文名爲因特網控制報文協議。它工作在OSI的網絡層,向數據通訊中的源主機報告錯誤。
②. TCP在網絡模型層中的位置
OSI 模型把網絡通信的工作分爲 7 層,從下到上分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。
OSI 只是存在於概念和理論上的一種模型,它的缺點是分層太多,增加了網絡工作的複雜性,所以沒有大規模應用。後來人們對 OSI 進行了簡化,合併了一些層,最終只保留了 4 層,從下到上分別是接口層、網絡層、傳輸層和應用層,這就是大名鼎鼎的 TCP/IP 模型。
如下圖所示, TCP協議均位於兩種模型中的
<傳輸層>
.