NGINX:アップストリームからの応答ヘッダーの読み取り中にアップストリームがタイムアウトしました(110:接続がタイムアウトしました)


130

私はPumaをアップストリームアプリサーバーとして実行し、RiakをバックグラウンドDBクラスターとして実行しています。約25Kユーザーのデータのチャンクをmap-reduceし、Riakからアプリに返すリクエストを送信すると、Nginxログにエラーが表示されます。

アップストリームからの応答ヘッダーの読み取り中にアップストリームがタイムアウトしました(110:接続がタイムアウトしました)

同じ要求で、nginxプロキシなしでアップストリームを直接クエリすると、必要なデータが得られます。

Nginxタイムアウトは、プロキシが配置されると発生します。

**nginx.conf**

http {
    keepalive_timeout 10m;
    proxy_connect_timeout  600s;
    proxy_send_timeout  600s;
    proxy_read_timeout  600s;
    fastcgi_send_timeout 600s;
    fastcgi_read_timeout 600s;
    include /etc/nginx/sites-enabled/*.conf;
}

**virtual host conf**

upstream ss_api {
  server 127.0.0.1:3000 max_fails=0  fail_timeout=600;
}

server {
  listen 81;
  server_name xxxxx.com; # change to match your URL

  location / {
    # match the name of upstream directive which is defined above
    proxy_pass http://ss_api; 
    proxy_set_header  Host $http_host;
    proxy_set_header  X-Real-IP  $remote_addr;
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_cache cloud;
    proxy_cache_valid  200 302  60m;
    proxy_cache_valid  404      1m;
    proxy_cache_bypass $http_authorization;
    proxy_cache_bypass http://ss_api/account/;
    add_header X-Cache-Status $upstream_cache_status;
  }
}

Nginxには多数のタイムアウトディレクティブがあります。重要なものが欠けているかどうかわかりません。どんな助けでも大歓迎です...


600秒後にタイムアウトする必要がありますか?127.0.0.1:3000にtcpサーバーをセットアップして接続を受け入れ、何もしないようにすることで、時間を計ることができます。600
秒に

回答:


47

これは、アップストリームが要求に応答するのに時間がかかりすぎており、NGINXが上流が要求の処理にすでに失敗したと判断し、エラーで応答するために発生します。location構成ブロックにproxy_read_timeoutを含めて増やすだけです。同じことが私にも起こり、社内のアプリで1時間のタイムアウトを使用しました。

proxy_read_timeout 3600;

これにより、NGINXはアップストリームが何かを返すまで1時間(3600秒)待機します。


6
httpセクションに入れても役に立たない場合があることproxy_read_timeoutに注意してください。私が持っているで指示位置部分のみが設定が違いを作りました。(nginx 1.16.0)proxy_passproxy_read_timeout
JonnyJD

私の場合、http / server / locationで動作しているようです...状況が変わった可能性があります:)
rogerdpack

39

タイムアウトの増加は常に控える必要があります。いずれにしても、バックエンドサーバーの応答時間が問題になるとは思いません。

接続のキープアライブフラグをクリアし、httpバージョンをここの回答に従って指定することで、この問題を回避しました:https : //stackoverflow.com/a/36589120/479632

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;

        # these two lines here
        proxy_http_version 1.1;
        proxy_set_header Connection "";

        proxy_pass http://localhost:5000;
    }
}

残念ながら、これが機能する理由を説明することはできず、リンクされた回答で言及されているドキュメントからそれを解読することもできませんでした。


1
proxy_read_timeoutプロキシが(特定のURLの場合でも)より多くの処理時間を必要とすることがわかっている場合、なぜ調整しないのですか?
Josh M.

こんにちは!正確な問題はもう覚えていませんが、URLの実際の時間とは関係がなく、これらの設定がないとタイムアウトが正しく処理されなかったと思います。
Almund

@magicbaconこれは数年前だったので、もうほとんどケースを覚えていませんが、あなたは$http_host正しく変更しましたか?私はそれがhttpsのために飛ぶことはないと思います。httpsリクエストのプロキシにも追加の設定が必要になる場合があります。
Almund

+1 ...これは厄介なハックのように見えますが、実際にはこれは公式のドキュメントからのものです:) nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive少し異なる問題があります。 「アップストリームからのヘッダー」をキープアライブでアップストリームディレクティブを使用し、これらの2行を使用すると修正されるようです。
Karussell、

1
@TimDavisなるほど。この記事では、WebSocketをするために必要だと言うように私は、それはトラフィックに依存する場合があります推測:serverlab.ca/tutorials/linux/web-servers-linux/...
Almund

26

最初に、nginxエラーログファイルを調べて、どのアップストリームが遅くなっているのかを確認し、それに応じて読み込みタイムアウトを調整します(私の場合はfastCGI)。

2017/09/27 13:34:03 [error] 16559#16559: *14381 upstream timed out (110: Connection timed out) while reading response header from upstream, client:xxxxxxxxxxxxxxxxxxxxxxxxx", upstream: "fastcgi://unix:/var/run/php/php5.6-fpm.sock", host: "xxxxxxxxxxxxxxx", referrer: "xxxxxxxxxxxxxxxxxxxx"

だから私は私のサーバー構成でfastcgi_read_timeoutを調整する必要があります

 location ~ \.php$ {
     fastcgi_read_timeout 240;
     ...
 }

参照:元の投稿


:ここでは、「必要性」とは、それを高めるためにどのくらい見に失敗したタイミング情報を追加する方法ですstackoverflow.com/questions/18627469/... FWIW
rogerdpack

10

あなたの場合、それはプロキシの小さな最適化に役立ちます、またはあなたは「#タイムアウト設定」を使うことができます

location / 
{        

  # time out settings
  proxy_connect_timeout 159s;
  proxy_send_timeout   600;
  proxy_read_timeout   600;
  proxy_buffer_size    64k;
  proxy_buffers     16 32k;
  proxy_busy_buffers_size 64k;
  proxy_temp_file_write_size 64k;
  proxy_pass_header Set-Cookie;
  proxy_redirect     off;
  proxy_hide_header  Vary;
  proxy_set_header   Accept-Encoding '';
  proxy_ignore_headers Cache-Control Expires;
  proxy_set_header   Referer $http_referer;
  proxy_set_header   Host   $host;
  proxy_set_header   Cookie $http_cookie;
  proxy_set_header   X-Real-IP  $remote_addr;
  proxy_set_header X-Forwarded-Host $host;
  proxy_set_header X-Forwarded-Server $host;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

私にとっては、場所セクションにこれらの設定があると違いがあります。それらをhttpセクションに置いても役に立たなかった(おそらく私proxy_passロケーションセクションにも持っていたためです。)
JonnyJD

これらの宣言で正確に何を最適化していますか?
Vlad

9

このエラーはさまざまな理由で発生する可能性がありますが、使用しているモジュールに固有である可能性があります。たとえば、uwsgiモジュールを使用してこれを確認したため、「uwsgi_read_timeout」を設定する必要がありました。


2
私はuwsgi_read_timeout 3600だと思います。proxy_send_timeout 3600; proxy_read_timeout 3600; 私のために働く。
tyan

9

を確認することをお勧めしますerror_logs。具体的には、タイムアウトしている特定のアップストリームを示すアップストリーム部分を確認します。

次に、それに基づいてproxy_read_timeoutfastcgi_read_timeoutまたはを調整できますuwsgi_read_timeout

また、設定が読み込まれていることを確認してください。

詳細はこちらNginxアップストリームがタイムアウトしました(理由と修正方法)


4

他の多くの人がここで指摘しているように、NGINXのタイムアウト設定を増やすことで問題を解決できます。

ただし、タイムアウト設定の増加は、これらの回答の多くが示唆するほど簡単ではない場合があります。私自身もこの問題に直面し、/ etc / nginx / nginx.confファイルのタイムアウト設定を変更しようとしましたが、これらのスレッドのほぼ全員が示唆しています。これは少しも役に立ちませんでした。NGINXのタイムアウト設定に明らかな変更はありませんでした。さて、数時間後、ようやくこの問題を解決することができました。

解決策はこのフォーラムスレッドにあり、タイムアウト設定を/etc/nginx/conf.d/timeout.confに配置する必要があるということです(このファイルが存在しない場合は作成する必要があります)。スレッドで提案されているのと同じ設定を使用しました:

proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;

1

私も同じ問題を抱えており、その結果、railsコントローラーで「毎日」エラーが発生しました。理由はわかりませんが、プロダクションでは、pumaが何度もエラーを実行し、次のメッセージを表示します。

アップストリームからの応答ヘッダーの読み取り中にアップストリームがタイムアウトしました(110:接続がタイムアウトしました)

おそらくNginxがプーマからデータを何度も取得しようとしているためでしょう。おかしなことは、コントローラーで別のアクションを呼び出している場合でも、エラーがタイムアウトメッセージを引き起こしたため、1つのタイプミスがすべてのアプリをブロックすることです。

log / puma.stderr.logファイルをチェックして、それが状況であるかどうかを確認してください。


0

私たちの側からは、プロキシキャッシュでspdyを使用していました。キャッシュが期限切れになると、キャッシュが更新されるまでこのエラーが発生します。


0

うまくいけばそれが誰かを助ける:私はこのエラーに遭遇し、原因はphpfpmのログフォルダーに対する誤った権限でした。phpfpmがそれに書き込むことができるように変更した後、すべてが問題ありませんでした。


0

proxy_upstreamタイムアウトについては、上記の設定を試しましたが、うまくいきませんでした。

resolver_timeoutアップストリームタイムアウトメッセージが生成されるまで30秒かかることを知っていたので、設定はうまくいきました。たとえば、me.atwibble.comを解決できませんでした(110:操作がタイムアウトしました)

http://nginx.org/en/docs/http/ngx_http_core_module.html#resolver_timeout

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