web-dev-qa-db-ja.com

Nginxアップストリームは、大規模なリクエストに対して、アップストリームからの応答ヘッダーの読み取り中に接続を途中で閉じました

更新リクエストを処理するために、nginxとノードサーバーを使用しています。大きなデータの更新を要求すると、ゲートウェイのタイムアウトが発生します。私はnginxエラーログからこのエラーを見ました:

2016/04/07 00:46:04 [エラー] 28599#0:* 1アップストリームからの応答ヘッダーの読み取り中にアップストリームの接続が途中で閉じられました、クライアント:10.0.2.77、サーバー:gis.oneconcern.com、リクエスト: "GET/update_mbtiles/atlas19891018000415 HTTP/1.1 "、アップストリーム:" http://127.0.0.1:7777/update_mbtiles/atlas19891018000415 "、ホスト:" gis.oneconcern.com "

エラーをグーグルで検索して、できる限りのことを試しましたが、それでもエラーが発生します。

私のnginx confにはこれらのプロキシ設定があります:

    ##
    # Proxy settings
    ##

    proxy_connect_timeout 1000;
    proxy_send_timeout 1000;
    proxy_read_timeout 1000;
    send_timeout 1000;

これが私のサーバーの設定方法です

server {
listen 80;

server_name gis.oneconcern.com;
access_log /home/ubuntu/Tilelive-Server/logs/nginx_access.log;
error_log /home/ubuntu/Tilelive-Server/logs/nginx_error.log;

large_client_header_buffers 8 32k;
location / {
    proxy_pass http://127.0.0.1:7777;
    proxy_redirect off;

    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $http_Host;
    proxy_cache_bypass $http_upgrade;
}

location /faults {
    proxy_pass http://127.0.0.1:8888;
    proxy_http_version 1.1;
    proxy_buffers 8 64k;
    proxy_buffer_size 128k;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection 'upgrade';
    proxy_set_header Host $Host;
    proxy_cache_bypass $http_upgrade;
}

}

Nodejsバックエンドを使用して、awsサーバーでリクエストを処理しています。ゲートウェイエラーは、更新に時間がかかる(約3〜4分)場合にのみ表示されます。小規模な更新で​​はエラーは発生しません。どんな助けも大歓迎です。

ノードjsコード:

app.get("/update_mbtiles/:earthquake", function(req, res){
var earthquake = req.params.earthquake
var command = spawn(__dirname + '/update_mbtiles.sh', [ earthquake, pg_details ]);
//var output  = [];

command.stdout.on('data', function(chunk) {
//    logger.info(chunk.toString());
//     output.Push(chunk.toString());
});

command.stderr.on('data', function(chunk) {
  //  logger.error(chunk.toString());
 //   output.Push(chunk.toString());
});

command.on('close', function(code) {
    if (code === 0) {
        logger.info("updating mbtiles successful for " + earthquake);
        tilelive_reload_and_switch_source(earthquake);
        res.send("Completed updating!");
    }
    else {
        logger.error("Error occured while updating " + earthquake);
        res.status(500);
        res.send("Error occured while updating " + earthquake);
    }
});
});

function tilelive_reload_and_switch_source(earthquake_unique_id) {
tilelive.load('mbtiles:///'+__dirname+'/mbtiles/tipp_out_'+ earthquake_unique_id + '.mbtiles', function(err, source) {
    if (err) {
        logger.error(err.message);
        throw err;
    }
    sources.set(earthquake_unique_id, source); 
    logger.info('Updated source! New tiles!');
});
}

ありがとうございました。

44
Divya Konda

Nginxからのエラーは、nodejsサーバー(つまり「上流」)によって接続が閉じられたことを示していると思います。 nodejsはどのように構成されていますか?

8
SilentMiles

プロキシのタイムアウト値を高く設定することでこれを解決しました:

location / {
    proxy_read_timeout 300s;
    proxy_connect_timeout 75s;
    proxy_pass http://localhost:3000;
}

ドキュメント: https://nginx.org/en/docs/http/ngx_http_proxy_module.html

13
Lowinput

私はかなり長い間同じエラーを抱えていましたが、ここでそれが私のために修正しました。

私は単に次のことを使用することをサービスで宣言しました:

Description= Your node service description
After=network.target

[Service]
Type=forking
PIDFile=/tmp/node_pid_name.pid
Restart=on-failure
KillSignal=SIGQUIT
WorkingDirectory=/path/to/node/app/root/directory
ExecStart=/path/to/node /path/to/server.js

[Install]
WantedBy=multi-user.target

ここで注意を引く必要があるのは、「After = network.target」です。問題はそれだけでしたが、nginx側で修正を探すために何日も費やしました。確認するには、お持ちのノードサービスの実行を停止し、ExecStartコマンドを直接起動して、バグの再現を試みてください。ポップしない場合は、サービスに問題があることを意味します。少なくともこれが私の答えを見つけた方法です。

それ以外の皆さん、幸運を祈ります!

3
millenion

このようにノードのタイムアウトを増やすことができます。

app.post('/slow/request', function(req, res){ req.connection.setTimeout(100000); //100 seconds ... }

2
tanner burton

私の場合、構成ファイルのタイムアウトを長くしようとしましたが、うまくいきませんでした。後で、1つのページに表示するデータを少なくするためにフィルタリングを行ったときに機能していたことが判明しました。 views.pyに、「&Q(year = 2019)」を追加して、2019年のデータのみを表示しました。

def list_offers(request, list_type):
context = {}
context['list_type'] = list_type
if list_type == 'ready':
    context['menu_page'] = 'ready'
    offer_groups = OfferGroup.objects.filter(~Q(run_status=OfferGroup.DRAFT) & Q(year=2019)).order_by('-year', '-week')

context['grouped_offers'] = offer_groups

return render(request, 'app_offers/list_offers.html', context)
0
ddss12