一。前書き#
NGINX 反向代理 後端インターフェース時エラー:
[error] ...: *1918 readv() failed (104: Connection reset by peer) while reading upstream ...
コンソールエラーメッセージ
NGINX エラーログ
二。解決策#
参考記事 http://blog.51yip.com/apachenginx/2203.html
nginx エラーを確認すると、以下のエラーがアップロードインターフェースで発生していることがわかります:
2019/10/10 19:58:25 [error] 299784#0: \*5967188 readv() failed (104: Connection reset by peer) while reading upstream, client: 59.34.155.7, server: xxxxxxxx, request: "POST /stream/tracking/file HTTP/1.1", upstream: "http://xxxxxxxx/stream/tracking/file", host: "xxxxxxxx"
このようなエラーログは少ないですが、最初の感覚はファイルのアップロードが大きすぎる、転送時間が長すぎるために接続が中断されたということです。
Nginxをリバースプロキシとして使用する場合、長時間の接続をサポートするためには、次の2つのポイントを満たす必要があります:
クライアントからNginxへの接続は長時間接続であること。クライアント側では、Nginxの長時間接続はデフォルトで有効になっています。 Nginxからサーバーへの接続は長時間接続であること。自分で有効にする必要があります。
upstream bigdata { server 10.0.20.xx:18018; server 10.0.20.xx:18018; server 10.0.20.xx:18018; server 10.0.20.xx:18018; keepalive 100; //qpsに基づいて調整する } location ~ / { 。。。。。。。。。省略。。。。。。。。。。。。。 proxy_connect_timeout 120; //120に増やす proxy_send_timeout 120; //120に増やす proxy_read_timeout 120; //120に増やす proxy_http_version 1.1; //バックエンドで長時間接続を有効にする proxy_set_header Connection ""; //バックエンドで長時間接続を有効にする }
注意:
keepaliveで指定された値は、Nginxの各ワーカーがバックエンドとの最大長時間接続数を示しており、Nginx全体の数ではありません。
作者:海底苍鹰
三。個人設定記録#
$ cat cpen.top.conf
server {
listen xxx ssl;
server_name xxx.xxx;
location / {
proxy_pass http://127.0.0.1:xxx;
proxy_connect_timeout 120; # 120に増やす
proxy_send_timeout 120; # 120に増やす
proxy_read_timeout 120; # 120に増やす
proxy_http_version 1.1; # バックエンドで長時間接続を有効にする
proxy_set_header Connection ""; # バックエンドで長時間接続を有効にする
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
}
ssl_certificate /usr/local/nginx/ssl/xxx.pem;
ssl_certificate_key /usr/local/nginx/ssl/xxx.key;
access_log /data/service_logs/nginx/xxx.log misc;
error_log /data/service_logs/nginx/xxx.log;
}