upstream timed out (110: Connection timed out) while reading response header from upstream
在使用 Nginx 時(shí),錯(cuò)誤信息
upstream timed out (110: Connection timed out) while reading response header from upstream 是一個(gè)常見(jiàn)的超時(shí)問(wèn)題。這一錯(cuò)誤意味著 Nginx 作為反向代理,在等待上游服務(wù)器(如 Tomcat、PHP-FPM)返回響應(yīng)頭時(shí)超出了預(yù)設(shè)時(shí)間。下面詳細(xì)分析可能的原因及解決辦法。可能的原因
- 上游服務(wù)器處理緩慢:像應(yīng)用程序存在性能問(wèn)題,或者數(shù)據(jù)庫(kù)查詢耗時(shí)過(guò)長(zhǎng),都可能導(dǎo)致服務(wù)器處理請(qǐng)求的速度變慢。
- 網(wǎng)絡(luò)連接不穩(wěn)定:Nginx 與上游服務(wù)器之間的網(wǎng)絡(luò)可能存在丟包、延遲等情況。
- Nginx 超時(shí)參數(shù)設(shè)置不合理:相關(guān)的超時(shí)參數(shù)配置可能無(wú)法滿足應(yīng)用的實(shí)際需求。
- 上游服務(wù)器負(fù)載過(guò)高:服務(wù)器資源不足,無(wú)法及時(shí)響應(yīng)請(qǐng)求。
- 防火墻限制:防火墻可能阻斷了 Nginx 與上游服務(wù)器之間的通信。
解決方案
1. 調(diào)整 Nginx 超時(shí)參數(shù)
你可以在 Nginx 配置文件中對(duì)以下超時(shí)參數(shù)進(jìn)行調(diào)整:
http {
# 全局超時(shí)設(shè)置
proxy_connect_timeout 60s; # 連接上游服務(wù)器的超時(shí)時(shí)間
proxy_send_timeout 60s; # 向上游服務(wù)器發(fā)送請(qǐng)求的超時(shí)時(shí)間
proxy_read_timeout 60s; # 從上游服務(wù)器讀取響應(yīng)的超時(shí)時(shí)間
send_timeout 60s; # 客戶端與 Nginx 連接的超時(shí)時(shí)間
server {
location / {
proxy_pass http://backend;
# 針對(duì)特定位置的超時(shí)設(shè)置,會(huì)覆蓋全局設(shè)置
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
}
}
}
參數(shù)說(shuō)明:
proxy_connect_timeout:Nginx 嘗試與上游服務(wù)器建立連接的最大時(shí)長(zhǎng)。proxy_send_timeout:Nginx 向上游服務(wù)器發(fā)送請(qǐng)求的最長(zhǎng)時(shí)間。proxy_read_timeout:Nginx 等待上游服務(wù)器發(fā)送響應(yīng)頭的最長(zhǎng)時(shí)間。send_timeout:Nginx 向客戶端發(fā)送響應(yīng)的最長(zhǎng)時(shí)間。
2. 優(yōu)化上游服務(wù)器性能
- 檢查應(yīng)用程序性能:可以使用工具(如 VisualVM、YourKit)對(duì)應(yīng)用進(jìn)行性能分析,找出導(dǎo)致處理緩慢的代碼。
- 優(yōu)化數(shù)據(jù)庫(kù)查詢:為查詢添加索引,避免全表掃描,對(duì)復(fù)雜查詢進(jìn)行重構(gòu)。
- 增加服務(wù)器資源:根據(jù)實(shí)際情況,考慮增加服務(wù)器的 CPU、內(nèi)存或磁盤(pán)資源。
- 實(shí)現(xiàn)異步處理:將耗時(shí)的操作放入消息隊(duì)列,讓?xiě)?yīng)用能夠快速返回響應(yīng)。
3. 檢查網(wǎng)絡(luò)連接
- 測(cè)試網(wǎng)絡(luò)連通性:使用
ping和traceroute命令檢查 Nginx 與上游服務(wù)器之間的網(wǎng)絡(luò)是否暢通。 - 監(jiān)控網(wǎng)絡(luò)狀態(tài):查看服務(wù)器的網(wǎng)絡(luò)接口狀態(tài),檢查是否存在丟包、高延遲等問(wèn)題。
- 增加網(wǎng)絡(luò)帶寬:如果網(wǎng)絡(luò)流量較大,考慮升級(jí)網(wǎng)絡(luò)帶寬。
4. 配置 keepalive 連接
啟用 keepalive 連接可以減少連接建立的開(kāi)銷(xiāo),降低超時(shí)的可能性:
upstream backend {
server backend1.example.com;
server backend2.example.com;
keepalive 32; # 保持活躍的連接數(shù)
keepalive_timeout 60s; # 連接保持活躍的時(shí)間
keepalive_requests 100; # 一個(gè)連接可以處理的最大請(qǐng)求數(shù)
}
server {
location / {
proxy_pass http://backend;
proxy_http_version 1.1; # 必須使用 HTTP/1.1
proxy_set_header Connection ""; # 清除默認(rèn)的 Connection 頭
}
}
5. 檢查防火墻設(shè)置
確保防火墻允許 Nginx 與上游服務(wù)器之間的通信:
- 開(kāi)放相應(yīng)端口:開(kāi)放上游服務(wù)器監(jiān)聽(tīng)的端口(如 8080、9000)。
- 檢查 SELinux/AppArmor:如果服務(wù)器啟用了 SELinux 或 AppArmor,需要配置它們?cè)试S Nginx 訪問(wèn)上游服務(wù)器。
6. 啟用 Nginx 狀態(tài)監(jiān)控
在 Nginx 配置中添加狀態(tài)頁(yè)面,方便監(jiān)控連接狀態(tài):
server {
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
通過(guò)訪問(wèn)
http://your-server/nginx_status 可以查看 Nginx 的當(dāng)前連接狀態(tài)。7. 實(shí)現(xiàn)重試機(jī)制
在 Nginx 配置中添加重試邏輯,當(dāng)請(qǐng)求超時(shí)時(shí)可以自動(dòng)重試其他上游服務(wù)器:
upstream backend {
server backend1.example.com max_fails=3 fail_timeout=30s;
server backend2.example.com max_fails=3 fail_timeout=30s;
}
server {
location / {
proxy_pass http://backend;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 3;
}
}
驗(yàn)證配置
修改 Nginx 配置后,需要驗(yàn)證配置的正確性并重新加載:
nginx -t # 檢查配置文件語(yǔ)法
nginx -s reload # 重新加載配置
總結(jié)
處理 Nginx 超時(shí)問(wèn)題的關(guān)鍵在于:
- 合理調(diào)整超時(shí)參數(shù),使其與應(yīng)用的實(shí)際需求相匹配。
- 優(yōu)化上游服務(wù)器的性能,提高其響應(yīng)速度。
- 確保網(wǎng)絡(luò)連接穩(wěn)定,減少丟包和延遲。
- 通過(guò) keepalive 連接和重試機(jī)制增強(qiáng)系統(tǒng)的健壯性。
通過(guò)以上步驟,通常可以有效解決
upstream timed out 錯(cuò)誤。如果問(wèn)題仍然存在,建議進(jìn)一步檢查應(yīng)用程序日志和系統(tǒng)資源使用情況。

浙公網(wǎng)安備 33010602011771號(hào)