【備忘】Dify workflow/run で60秒 Timeout問題
こちらの記事(とても有用なWorkFlowを公開してくれています!)を参考に、GASからDifyのAPIを実施していたところ、私の環境で60秒を超える処理がTimeoutしてしまうという事象が起きました。
1. 事象
GASからDify(0.6.16)にworkflow/runを実施。
ワークフローの処理は問題なく実行され、想定の値を返しているが、GAS側には504(upstream timed out)が返ってきている。
Difyのコンテナを立てたホストOS(ubuntu 22.04 LTS)のNginxログ(/var/log/nginx/error.log)に「upstream timed out ~ while reading response header from upstream」の出力。
何回か実施した結果、60秒以内の処理については問題なくGASで結果が受け取れるが、60秒を超える処理はTimeoutになることがわかった。
2. 原因
Nginxのデフォルトのタイムアウト値が60秒のようです。
3. 解決方法
ホストOSのNginx、コンテナ内のNginxそれぞれでタイムアウト値を変更することで、100秒を超える処理が正常にGASで受け取れたことを確認
設定値
proxy_connect_timeout 1000;
proxy_read_timeout 1000;
proxy_send_timeout 1000;
補足:無駄に増やしてますが、適切な値に読み替えてください。
ホストOSのNginx
/etc/nginx/conf.d/server.conf
※/etc/nginx/nginx.confからincludeしているファイル
コンテナ内のNginx
dify/docker/nginx/nginx.conf.template
dify/docker/nginx/nginx.conf
※コンテナ起動時にnginx.conf.templateの変数部分を展開して毎回nginx.confを生成するような動きをしている(dify/docker/nginx/nginx.confだけ編集すると、起動後にtemplateの内容で上書きされた)
4. 補足
私の環境ではdifyをhttps化するために、ホストOS側のNginxとdocker-compose.yamlで以下の設定をしています。
/etc/nginx/sites-available/default
server {
if ($host = example.com) {
return 301 https://$host$request_uri;
}
listen 80;
listen [::]:80;
server_name example.com;
return 404;
}
server {
listen 443 ssl http2;
server_name example.com;
# ~略~
location / {
proxy_pass http://localhost:xxxx;
# ~略~
}
}
該当サーバ名の80番ポート
-> 該当サーバ名の443番ポートにリダイレクト該当サーバ名の443番ポート
-> ローカルホストのdifyコンテナの待ち受けポートにマッピング
docker-compose.yaml
ports:
# - "${EXPOSE_NGINX_PORT:-80}:${NGINX_PORT:-80}"
# - "${EXPOSE_NGINX_SSL_PORT:-443}:${NGINX_SSL_PORT:-443}"
- xxxx:80
- yyyy:443
補足:.envでも「EXPOSE_NGINX_PORT」「EXPOSE_NGINX_SSL_PORT」それぞれ設定しています。