【備忘】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秒のようです。

Syntax: proxy_send_timeout time;
Default: proxy_send_timeout 60s

【nginx.org】proxy_send_timeout

Syntax: proxy_connect_timeout time;
Default: proxy_connect_timeout 60s;

【nginx.org】proxy_connect_timeout

Syntax: proxy_read_timeout time;
Default: proxy_read_timeout 60s;

【nginx.org】proxy_read_timeout

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」それぞれ設定しています。

いいなと思ったら応援しよう!