關於 web service, unity, blogger 等軟體工程筆記

AWS Beanstalk: Configuring the proxy server - Keepalive connection with backend app

Edit icon 沒有留言
Amazon web services

無意間在檢查應用服務時,所發現的 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 時,是一直反覆地建立新連線?

Beanstalk 網路架構示意圖

)

立刻下指令查看 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 Beanstalk 系列文章

沒有留言: