Nginx 502 Bad Gateway

問題描述

架構說明:

AWS LB -> EC2 * 4 (Nginx -> Puma 2 worker / 10 threads)

描述:

某些時段與某些 EC2 主機會出現 502 Bad Gateway,還沒有特定的規律。通常不會持續太久,問題發生時 CPU 會飆高,但是 Nginx 與 Puma 都沒有錯誤訊息。

推測:

可能是因為某些時段流量過大,導致 Nginx 與 Puma 之間的連線出現問題。 Nginx 的 Upstream 被 Puma 拒絕。

解決方法

  1. 嘗試從 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
  2. 嘗試調整 Nginx Upstream 為長連接,避免短連接造成的問題。
    1
    2
    3
    4
    5
    upstream puma {
    server 127.0.0.1:5000;
    keepalive 32; # 這邊可以調整長連接數量
    keepalive_time 30s; # 這邊可以調整長連接時間
    }

參考資料