AWS Beanstalk: Configuring the proxy server - Keepalive connection with backend app
無意間在檢查應用服務時,所發現的 nginx 設定問題,每次與 nginx 連線要求時,nginx 都會另外開一個連線來處理與後端伺服器 (backend app) 的資料交換。目前專案服務採用 source bundle 方式在 Beanstalk 平台部屬 (deploy),其環境為 64bit Amazon Linux 2017.09 v2.7.1 running Go 1.9。
在服務運作的情況下,使用 SSH 遠端登入該服務實體 (instance),嘗試使用以下指令追蹤該機器上的 TCP 狀態:
netstat -an --tcp | sort -n
發現許多連到 port 5000 的 TCP 連線,其狀態都是 TIME_WAIT,這表示 nginx 連線到 backend app 時,是一直反覆地建立新連線?
)
立刻下指令查看 nginx 目前的設定位置:
sudo service nginx configtest
仔細查看其設定後才發現,好似真的沒有開啟 keepalive 的功能…因此參閱網路文章 (see Reference),嘗試修改 Beanstalk nginx 的設定檔,使得 nginx 連到 backend app 不再是反覆建立連線,占用 TCP 資源…(雖然同台機器上建立 TCP 連線速度非常快)。
加入兩個檔案 00_application.conf:
# .ebextensions/nginx/conf.d/elasticbeanstalk/00_application.conf
location / {
proxy_pass http://http_backend;
proxy_http_version 1.1;
# Clear connection header, ignore client connection settings
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
以及 00_upstream.conf:
# .ebextensions/nginx/conf.d/00_upstream.conf
# keepalive is important! must set
upstream http_backend {
server 127.0.0.1:5000;
keepalive 300;
}
將兩個檔案放置在對應 source bundle 資料夾的位置,打包上傳重新佈署後,在相同環境下,經過測試便沒有過多進入 TIME_AWAIT 的連線了(keepalive 運作中)。
(為什麼會是這樣的配置,可參考之前文章內容 AWS Beanstalk HTTP 502 Bad Gateway 處理方法,裏頭有提及到 Beanstalk nginx 的設定內容)
Reference
- AWS Docs: Configuring the Reverse Proxy
- Getting to Know and Love AWS Elastic Beanstalk Configuration Files (.ebextensions)
- Gitbooks: nginx 學習筆記-支持 keepalive 長連接
- 你真的用上 keepalive 了嗎?
- 關於 nginx upstream keepalive 的說明
AWS Beanstalk 系列文章
- Go WebApp 部署筆記
- Nginx header size 設定 (upstream sent too big header)
- Nginx 長連線設定 (keep-alive setup)
- 關於動態程式庫 (cannot open shared object file)
- CloudWatch 日誌推送設定
沒有留言: