問題描述
Server Load Balancer執行個體使用HTTP監聽,同時配置了使用HEAD
方法的健全狀態檢查功能。業務網站可以正常訪問的情況下,健全狀態檢查卻顯示異常。為了類比健全狀態檢查,同樣使用HEAD
方法以及nc
命令測試業務網站的狀態,樣本命令如下。
echo -e "HEAD /test.html HTTP/1.0\r\n\r\n" | nc -t www.example.com 80
說明:命令中的test.html以及www.example.com僅為樣本,現場以實際情況為準。
返回結果如下,HTTP狀態代碼為404。
作為對比,使用curl
命令測試業務網站的狀態,樣本命令如下。
curl -I http://www.example.com/test.html
返回結果如下,HTTP狀態代碼為200,屬於正常情況,與HEAD
方法以及nc
命令的結果不一致。
上述描述中主要包含的問題如下:
問題一:業務網站可以正常訪問,為什麼SLB的健全狀態檢查和類比測試中的
HEAD
方法及nc
命令均顯示網站異常,但curl
命令顯示網站正常?問題二:業務網站返回的HTTP狀態代碼為404,為什麼健全狀態檢查判定為異常?
問題原因
上述問題的原因如下:
問題一:上述三種方式產生不同結果的原因如下:
curl
命令curl
命令和通過瀏覽器訪問的結果一致,均訪問請求網域名稱下的資源檔,即訪問www.example.com網域名稱下的test.html檔案。SLB執行個體的健全狀態檢查,如果SLB執行個體未配置健全狀態檢查網域名稱,則健全狀態檢查時的請求網域名稱為後端伺服器的IP地址,類似於192.0.2.1等IP地址。請求網域名稱為IP地址時,Web伺服器會將請求轉寄到預設網站,而預設網站下沒有test.html檔案,因此返回HTTP 404狀態代碼。
說明說明:此處以Nginx的預設配置為例,Nginx的預設配置中含有預設網站。
HEAD
方法及nc
命令的類比測試HEAD
方法本身沒有問題,但是nc
命令會將請求轉寄給網域名稱對應的IP地址,和SLB執行個體的健全狀態檢查情況一致,最終請求到Web伺服器的預設網站,因此返回HTTP 404狀態代碼。
問題二:預設情況下,SLB執行個體的健全狀態檢查配置中以http_2xx和http_3xx作為正常狀態代碼,除此之外的狀態代碼均識別為異常狀態代碼。HTTP 404屬於http_4xx,因此健全狀態檢查判定為網站異常。
解決方案
針對本文中的兩個問題,解決方案不同,分別如下:
問題一:關於此問題,有下列兩種解決方案,您可以根據實際情況進行選擇:
完善SLB執行個體的健全狀態檢查配置,您可以在SLB執行個體的健全狀態檢查配置中完善健全狀態檢查路徑和健全狀態檢查網域名稱選項。以本文為例,您可以設定健全狀態檢查網域名稱為
www.example.com
,健全狀態檢查路徑為/test.html
。關於如何完善健全狀態檢查配置以及這兩個選項的說明,請參見配置健全狀態檢查。禁用Web伺服器的預設網站,您可以修改Web伺服器的設定檔,禁用預設網站。不同的Web伺服器配置方法不同,以下步驟以Nginx伺服器為例。
遠程登入Nginx所在伺服器。
找到Nginx的主設定檔,此檔案預設路徑為
/etc/nginx/nginx.conf
。源碼安裝的Nginx,請自行確認Nginx主設定檔所在路徑。編輯Nginx的主設定檔,找到標記為default_server的server配置段,通過注釋符井號(#)注釋此段代碼,退出並儲存檔案。
執行以下命令,確認更新後的設定檔無異常。
nginx -t
如果系統返回異常錯誤,請根據提示進行修複,直到系統返回以下內容。
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
執行以下命令,重新載入Nginx設定檔。
nginx -s reload
重新檢查SLB執行個體的健全狀態檢查狀態。
問題二:您可以根據業務的實際情況,在SLB執行個體的健全狀態檢查配置中選擇設定哪些HTTP狀態代碼為正常狀態。如果您認為HTTP 404不屬於網站異常,您可以勾選http_4xx為正常狀態代碼。關於如何設定SLB執行個體的健全狀態檢查,請參見配置健全狀態檢查。
適用於
Server Load Balancer