Node AWS Elastic Beanstalkで実行されているサーバーがあります。エンドポイントの1つが巨大なペイロードを受け入れ、関数自体がかなり遅く、長く、10分以上かかる場合があります。
ビジネス要件のため、単一のHTTP POSTとして維持する必要があり、分割して小さくすることはできません。
より大きな通話では、常に60秒程度の504ゲートウェイタイムアウトが発生します。 Elastic Beanstalkロードバランサセクションのタイムアウト設定をいじってみましたが、最長のタイムアウト期間はとにかく60秒です。
https://docs.aws.Amazon.com/elasticloadbalancing/latest/classic/config-idle-timeout.html のドキュメントで有望な解決策が1つありました。
ファイルのアップロードなどの長い操作が完了するまでの時間を確保するには、各アイドルタイムアウト期間が経過する前に、少なくとも1バイトのデータを送信します
これはまさに私が必要とするもののように聞こえますが、私は達成する方法がわかりません
1)セッションを確実にするために、my Node appから「少なくとも1バイトのデータを送信する」にはどうすればよいですか?存続し、1分後にタイムアウトしない
ElasticBeanstalk環境の504タイムアウトは、ELBポリシーを設定することで解決できます。 Nginxタイムアウト設定の更新も必要になる場合があります。
ELBポリシー:Elastic Load Balancerのアイドルタイムアウトを選択した値(デフォルトは60秒)に設定します。これを行うには、プロジェクトのルートに。ebextensionsフォルダーを作成します。このフォルダーで、ファイル拡張子が。configの別のファイルを作成し、ELBアイドルタイムアウトを任意の値(300秒など)に設定します。
option_settings:
- namespace: aws:elb:policies
option_name: ConnectionSettingIdleTimeout
value: 300
または、アプリケーションロードバランサーを使用している場合:
option_settings:
- namespace: aws:elbv2:loadbalancer
option_name: IdleTimeout
value: 300
Nginxの設定:Nginxにタイムアウトの値を設定します:send_timeout
、proxy_connect_timeout
、proxy_read_timeout, proxy_Send_timeout
all defaults to 60s(追加の仕様は次のとおりです:client_header_timeout
、client_body_timeout
、keepalive_timeout
)。 Nginxのデフォルトのタイムアウト値は specifications および構成ファイル(たとえば、/etc/nginx
の下の。configファイル)で指定されています。 .ebextensions
フォルダーに新しいファイルを作成(または上記の.configファイルで更新)し、ファイル内に次のコンテンツを追加します(監視されたタイムアウトに従って関連設定を追加または削除します)。
files:
"/etc/nginx/conf.d/nginx.custom.conf":
mode: "644"
owner: "root"
group: "root"
content: |
client_header_timeout 300;
client_body_timeout 300;
keepalive_timeout 300;
send_timeout 300;
proxy_connect_timeout 300;
proxy_read_timeout 300;
proxy_send_timeout 300;
container_commands:
01_restart_nginx:
command: "Sudo service nginx reload"