前言
最近發現 Nginx 運行一段時間之後,就會出現以下幾種 error:
- connect() failed (111: Connection refused) while connecting to upstream
- upstream timed out (110: Connection timed out) while connecting to upstream
本來一直以為是 config 少設定了一些參數,後來才發現是 動態IP 的問題。
Nginx 在啟動時會向 DNS server 查詢 Domain 對應的 IP,之後就會 cache IP,直到下次重新載入 config 才會再更新,所以當我們服務的 IP 改變之後,Nginx 就會開始出現 Connect failed, Connection timeout 等 error.
解決方式
以下有幾種解決方式:
- 寫 cronjob, 偵測服務的 IP, 當 IP 有變動時, reload nginx.
- 在商業版的 Nginx 中,可以在 upstream 中使用
resolve
. - 在一般版的 Nginx 中,不使用 upstream,改用 set 將 url 設為變數,再傳遞給 proxy_pass.
- 使用 nginx-upstream-dynamic-servers module, 可以在 upstream 中使用
resolve
.
其中第一個方式算是比較應急的做法,建議還是要設定 Nginx 更新 IP 比較好。
第二個方式是可以付費購買 Nginx Plus,接著修改 nginx.conf
:
1 | http { |
主要是在 http {}
中設定 resolver
, 以及在 upstream {}
中加上 resolve
.resolver
是設定 DNS server, valid
是指 DNS server 回傳的 IP 會被 chache 的時間,在這個時間內不會再向 DNS server 詢問 IP.
設定完之後,resolver 就會按照 DNS server 的 TTL 來做更新。
第三個方式是將 url 設為變數,再傳給 proxy_pass:
1 | http { |
最後一個方式則是使用 nginx-upstream-dynamic-servers module, 依照以下方式安裝:
1 | # Clone nginx-upstream-dynamic-servers |
再來修改 nginx.conf
:
1 | http { |
設定的內容和第二個方式一樣,resolver 就會按照 DNS server 的 TTL 來做更新了!