web-dev-qa-db-ja.com

NginxのFastCGIでゲートウェイタイムアウトを防ぐ方法

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;
    }

編集:私が持っているものは動作していません:)

196
sheats

プロキシタイムアウトは、FastCGIではなく、プロキシ用です。

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

Edit:nginx wikiの内容を考慮して、 send_timeoutディレクティブ は応答の一般的なタイムアウトの設定を担当します(少し誤解を招く恐れがありました) )。 FastCGIには、 fastcgiプロセス応答タイムアウト に影響を与えるfastcgi_read_timeoutがあります。

HTH。

241
zgoda

UnicornとRailsでnginxを使用している場合、ほとんどの場合、タイムアウトはUnicorn.rbファイルにあります

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

timeout 500

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

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

http nginxセクション(/etc/nginx/nginx.conf)で追加または変更:

keepalive_timeout 300s

server nginxセクション(/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;

ケース127.0.0.1:9000のphpファイル(/etc/php/7.X/fpm/pool.d/www.conf)modify:

request_terminate_timeout = 300

お役に立てば幸いです。

Unicornを使用する場合。

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

  • HTTPリクエストを確認する必要がありますが、その中には非常に難しいものもあります。

  • Unicornのバージョンを確認してください。あなたは最近それを更新したかもしれません、そして何かが壊れました。

1