NginxでFastCGIを使用してゲートウェイのタイムアウトを防ぐにはどうすればよいですか


203

Django、FastCGI、およびNginxを実行しています。私は、誰かがXMLを介してデータを送信できるAPIを作成しています。このデータを処理してから、送信された各ノードのステータスコードを返します。

問題は、XMLの処理に時間がかかりすぎると、Nginxが504ゲートウェイタイムアウトをスローすることです-60秒より長いと思います。

そこで、場所/ apiに一致するリクエストが120秒間タイムアウトしないように、Nginxを設定したいと思います。それを達成する設定は何ですか。

これまでのところ:

    # Handles all api calls
    location ^~ /api/ {
        proxy_read_timeout 120;
        proxy_connect_timeout 120;
        fastcgi_pass 127.0.0.1:8080;
    }

編集:私が持っているものが機能していません:)


7
タイムアウト値を「120」ではなく「2m」に設定できます。
Cenk Alti

1
データがストリーミングされていないことは悪いようです...つまり、サーバーが60秒以上で応答を開始することは受け入れられないようです。
アダム・ゲント

回答:


245

プロキシのタイムアウトは、FastCGIではなく、プロキシにとって適切です...

FastCGIタイムアウトに影響を与えるディレクティブはclient_header_timeoutclient_body_timeoutおよびsend_timeoutです。

編集:nginx wikiで見つかったことを考慮して、send_timeoutディレクティブは応答の一般的なタイムアウトの設定を担当します(これは少し誤解を招くものでした)。FastCGIの場合fastcgi_read_timeoutfastcgiプロセスの応答タイムアウトに影響しているものがあります。ます。

HTH。


8
uwsgiを使用していてこのエラーが発生した場合は、uwsgi_read_timeout 600を使用してください。私の問題を修正しました。
Homer6

2
私の質問は(サーバー管理者のアマチュアとして)どこに変更すればよいですか?httpd.confファイル?
jeffkee 2012

2
助けになれば、私はMedia TempleのDVシステムの/ etc / nginx /にいました。
jeffkee 2012

Abdoはデバッグに優れた方法を提供します。それでも問題が解決しない場合は、nginx.confのクライアントメッセージの最大サイズ(client_max_body_size ** M;)を増やす必要があるかもしれません
Sam Grondahl

2
タイムアウトimhoを増やすことは適切な解決策ではありません。
JazzCat

24

ユニコーンとレールでnginxを使用している場合、おそらくタイムアウトはunicorn.rbファイルにあります

unicorn.rbに大きなタイムアウトを設定する

timeout 500

それでも問題が解決しない場合は、nginxのアップストリームでfail_timeout = 0を試して、問題が解決するかどうかを確認してください。これはデバッグ用であり、実稼働環境では危険な場合があります。

upstream foo_server {
        server 127.0.0.1:3000 fail_timeout=0;
}

3
これはDjangoに関するものであるため、人々は反対票を投じたと思いますが、あなたの答えはRails + Unicornでのゲートウェイタイムアウトの問題を修正しました:)
ZiggyTheHamster

4

httpnginxのセクション(/etc/nginx/nginx.conf)を追加または変更します。

keepalive_timeout 300s

servernginxのセクション(/etc/nginx/sites-available/your-config-file.com)これらの行を追加します。

client_max_body_size 50M;
fastcgi_buffers 8 1600k;
fastcgi_buffer_size 3200k;
fastcgi_connect_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_read_timeout 300s;

phpケース127.0.0.1:9000(/etc/php/7.X/fpm/pool.d/www.conf)でファイルを変更します。

request_terminate_timeout = 300

お役に立てば幸いです。


時間を10000秒に変更すると、「悪い」ことが起こりますか?
utdev 2018年

悪いことは何も起こらないが、あなたのサービスはもっと時間を待つ。必要に応じて値を変更できます。
ホセカルロスラモスカルメネーツ

1

ユニコーンを使用する場合。

topサーバーを見てください。ユニコーンは現在、CPUを100%使用している可能性があります。この問題にはいくつかの理由があります。

  • HTTPリクエストを確認してください。一部のリクエストは非常に難しい場合があります。

  • ユニコーンのバージョンを確認してください。最近更新して、何かが壊れている可能性があります。


0

そのようなサーバープロキシセットで

location / {

                proxy_pass http://ip:80;                

                proxy_connect_timeout   90;
                proxy_send_timeout      90;
                proxy_read_timeout      90;

            }

サーバーのphpではそのように設定しました

server {
        client_body_timeout 120;
        location = /index.php {

                #include fastcgi.conf; //example
                #fastcgi_pass unix:/run/php/php7.3-fpm.sock;//example veriosn

                fastcgi_read_timeout 120s;
       }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.