這幾天接獲通報 ELB 的 Metric 有出現 5xx, 502 的訊息,但是應用面沒問題,所以開始來查問題。
- CLB:5xx metric
- ALB:502 metric
從 CloudWatch 上發現偶爾會出現 502 的錯誤,都是由 ELB 產生的而不是 Backend instance,詳細查看 Log 後其實都沒有特殊的異常,發想可能是 ELB 和 EC2 之間溝通出了問題。
有經驗的同事找了之前看過相似的文章「AWS Application ELB sometimes responds 502 without calling the backend」,發現原來是因為 Backend instance 提早回收了 Connection 導致 ELB Connection failed。
Backend instance 使用的是 Apache 2.4 在預設的情況下
一般情況下的 HTTP 傳輸不會超過 5 秒,所以多數 request 都不會有問題,而少數可能系統忙碌造成超過 5 秒就會被 Apache 提早回收,此時 ELB 就會被切斷而產生 502 錯誤訊息。
遇到這樣的問題,基本上要考量幾件事:
- Request time 超過 5 秒導致 Apache 回收是否合理?程式效能不好或者是需要加 Instance or Upgrade spec?
- 如果超過 5 秒為正常情況,那麼就要調整 Apache KeepAlive 的數值,數值範圍必須是 ELB Timeout > Apache KeepAlive。
- 整條 Request connection pipeline 的 timeout/keepalive 等設定是否都不少於「最短回收時間」
以這個案例,直接調整 Apache KeepAliveTimeout 即可
...
KeepAlive On
KeepAliveTimeout 60
...