問題描述
架構說明:
AWS LB -> EC2 * 4 (Nginx -> Puma 2 worker / 10 threads)
描述:
某些時段與某些 EC2 主機會出現 502 Bad Gateway,還沒有特定的規律。通常不會持續太久,問題發生時 CPU 會飆高,但是 Nginx 與 Puma 都沒有錯誤訊息。
推測:
可能是因為某些時段流量過大,導致 Nginx 與 Puma 之間的連線出現問題。 Nginx 的 Upstream 被 Puma 拒絕。
解決方法
- 嘗試從 TIME_WAIT 的角度來解決,調整 Nginx 與 Puma 的設定。由於 TIME_WAIT 的消失需要約 1 分鐘(2MSL),容易造成連線不足。
1
2
3
4
5
6
7
8
9# 可以先查看 Port 可用範圍,不夠大的話可以調整
# port range - bucket size 約當 2 * worker * threads 即可
$ cat /proc/sys/net/ipv4/ip_local_port_range
$ cat /proc/sys/net/ipv4/tcp_max_tw_buckets
# 開啟 TCP_TW_REUSE
$ sysctl -w net.ipv4.tcp_tw_reuse=1
# (option) NAT環境中不要開啟 TCP_TW_RECYCLE
$ sysctl -w net.ipv4.tcp_tw_recycle=1 - 嘗試調整 Nginx Upstream 為長連接,避免短連接造成的問題。
1
2
3
4
5upstream puma {
server 127.0.0.1:5000;
keepalive 32; # 這邊可以調整長連接數量
keepalive_time 30s; # 這邊可以調整長連接時間
}