176

リクエストを受け取り、ポート 8001 で実行されているアップストリーム サーバーから実際の Web アプリケーションを取得するために proxy_pass を実行するリバース プロキシとして Nginx を使用しています。

mywebsite.com にアクセスするか、wget を実行すると、60 秒後に 504 Gateway Timeout が発生します...ただし、mywebsite.com:8001 をロードすると、アプリケーションは期待どおりにロードされます!

そのため、何かが Nginx とアップストリーム サーバーとの通信を妨げています。

これはすべて、ホスティング会社が私のものが実行されているマシンをリセットした後に始まりましたが、それ以前は問題はありませんでした。

これが私のvhostsサーバーブロックです:

server {
    listen   80;
    server_name mywebsite.com;

    root /home/user/public_html/mywebsite.com/public;

    access_log /home/user/public_html/mywebsite.com/log/access.log upstreamlog;
    error_log /home/user/public_html/mywebsite.com/log/error.log;

    location / {
        proxy_pass http://xxx.xxx.xxx.xxx:8001;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
} 

そして私のNginxエラーログからの出力:

2014/06/27 13:10:58 [error] 31406#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: xxx.xx.xxx.xxx, server: mywebsite.com, request: "GET / HTTP/1.1", upstream: "http://xxx.xxx.xxx.xxx:8001/", host: "mywebsite.com"
4

10 に答える 10

195

おそらく、さらに数行追加して、アップストリームへのタイムアウト期間を増やすことができます。以下の例では、タイムアウトを 300 秒に設定しています。

proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;
于 2014-09-19T08:25:53.517 に答える
119

あなたが言うように、実際のターゲットWebサーバーは問題なく応答しているため、タイムアウトを増やしても問題は解決しない可能性があります.

これと同じ問題があり、接続でキープアライブを使用しないことに関係していることがわかりました。これがなぜなのか実際には答えられませんが、接続ヘッダーをクリアすることでこの問題を解決し、リクエストは問題なくプロキシされました:

server {
    location / {
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   Host      $http_host;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_pass http://localhost:5000;
    }
}

詳細については、この投稿をご覧ください: nginx リクエスト後にアップストリーム接続を閉じます Keep -alive ヘッダーの説明

于 2016-04-13T05:13:35.120 に答える
19

アップストリーム サーバーがドメイン名を使用し、その IP アドレスが変更された場合にも、この状況に直面する可能性があります (例: アップストリームが AWS Elastic Load Balancer を指している)。

問題は、nginx が IP アドレスを一度解決し、構成がリロードされるまで、後続のリクエストのためにキャッシュされたままになることです。

キャッシュされたエントリの有効期限が切れたら、ネーム サーバーを使用してドメインを再解決するように nginx に指示できます。

location /mylocation {
    # use google dns to resolve host after IP cached expires
    resolver 8.8.8.8;
    set $upstream_endpoint http://your.backend.server/;
    proxy_pass $upstream_endpoint;
}

proxy_passのドキュメントでは、このトリックが機能する理由を説明しています。

パラメータ値には変数を含めることができます。この場合、ドメイン名としてアドレスを指定すると、記載されているサーバ群の中から名前を検索し、見つからなければリゾルバを使って決定します。

詳細な説明については、 「動的なアップストリームを備えた Nginx」(tenzer.dk)を称賛します。これには、転送された URI に関するこのアプローチの警告に関する関連情報も含まれています。

于 2018-09-13T10:03:11.303 に答える