web-dev-qa-db-ja.com

ロードバランサーとしてのNginx。アップストリームへの接続中にアップストリームが頻繁にタイムアウトした(110:接続がタイムアウトした)

CentOS 7仮想マシンでnginxをロードバランサーとして使用して、古くなったCoyote Pointハードウェアデバイスを交換しようとしています。ただし、ウェブアプリの1つで、ログに頻繁かつ継続的なアップストリームタイムアウトエラーが表示され、システムの使用中にクライアントがセッションの問題について報告しています。

Nginx.confからの関連ビットは次のとおりです

user  nginx;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

upstream farm {
   ip_hash;

   server www1.domain.com:8080;
   server www2.domain.com:8080 down;
   server www3.domain.com:8080;
   server www4.domain.com:8080;
}

server {
        listen 192.168.1.87:80;
        server_name Host.domain.com;
        return         301 https://$server_name$request_uri;
}

server {
    listen 192.168.1.87:443 ssl;
    server_name Host.domain.com;

    ## Compression
    gzip              on;
    gzip_buffers      16 8k;
    gzip_comp_level   4;
    gzip_http_version 1.0;
    gzip_min_length   1280;
    gzip_types        text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon image/bmp;
    gzip_vary         on;

    tcp_nodelay on;
    tcp_nopush on;
    sendfile off;

    location / {
           proxy_connect_timeout   10;
           proxy_send_timeout      180;
           proxy_read_timeout 180; #to allow for large managers reports
           proxy_buffering off;
           proxy_buffer_size   128k;
           proxy_buffers   4 256k;
           proxy_busy_buffers_size   256k;
           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_pass http://farm;

           location ~* \.(css|jpg|gif|ico|js)$ {
                        proxy_cache mypms_cache;
                add_header X-Proxy-Cache $upstream_cache_status;
                        proxy_cache_valid 200 60m;
                        expires 60m;
                        proxy_pass http://farm;
                 }
 }

 location /basic_status {
    stub_status;
    }

    error_page 502 502 = /maintenance.html;
    location = /maintenance.html {
    root /www/;
 }
}

ログに次のようなエントリが頻繁に表示されます

2015/03/13 15:22:58 [error] 4482#0: *557390 upstream timed out (110: Connection timed out) while connecting to upstream, client: 72.160.92.101, server: Host.domain.com, request: "GET /tapechart.php HTTP/1.1", upstream: "http://192.168.1.50:8080/tapechart.php", Host: "Host.domain.com", referrer: "https://Host.domain.com/tapechart.php"
2015/03/13 15:23:14 [error] 4481#0: *557663 upstream timed out (110: Connection timed out) while connecting to upstream, client: 174.53.144.4, server: Host.domain.com, request: "GET /bkgtabs.php?bookingID=3105543&show=0 HTTP/1.1", upstream: "http://192.168.1.50:8080/bkgtabs.php?bookingID=3105543&show=0", Host: "Host.domain.com", referrer: "https://Host.domain.com/bkgtabs.php?bookingID=3105543&show=0"
2015/03/13 15:23:19 [error] 4481#0: *557550 upstream timed out (110: Connection timed out) while connecting to upstream, client: 50.134.133.213, server: Host.domain.com, request: "GET /tbltapechart.php?numNights=30&startDate=1-Aug-2015&roomTypeID=-1&hideNav=N&bookingID=&roomFilter=-1 HTTP/1.1", upstream: "http://192.168.1.50:8080/tbltapechart.php?numNights=30&startDate=1-Aug-2015&roomTypeID=-1&hideNav=N&bookingID=&roomFilter=-1", Host: "Host.domain.com", referrer: "https://Host.domain.com/tapechart.php"
2015/03/13 15:23:37 [error] 4483#0: *561705 upstream timed out (110: Connection timed out) while connecting to upstream, client: 74.223.167.14, server: Host.domain.com, request: "GET /js/multiselect/jquery.multiselect.filter.css HTTP/1.1", upstream: "http://192.168.1.55:8080/js/multiselect/jquery.multiselect.filter.css", Host: "Host.domain.com", referrer: "https://Host.domain.com/fdhome.php"
2015/03/13 15:23:40 [error] 4481#0: *561099 upstream timed out (110: Connection timed out) while connecting to upstream, client: 74.223.167.14, server: Host.domain.com, request: "GET /img/tabs_left_bc.jpg HTTP/1.1", upstream: "http://192.168.1.55:8080/img/tabs_left_bc.jpg", Host: "Host.domain.com", referrer: "https://Host.domain.com/fdhome.php"
2015/03/13 15:23:45 [error] 4481#0: *557214 upstream timed out (110: Connection timed out) while connecting to upstream, client: 75.37.141.182, server: Host.domain.com, request: "GET /tapechart.php HTTP/1.1", upstream: "http://192.168.1.50:8080/tapechart.php", Host: "Host.domain.com", referrer: "https://Host.domain.com/tapechart.php"
2015/03/13 15:23:52 [error] 4482#0: *557330 upstream timed out (110: Connection timed out) while connecting to upstream, client: 173.164.149.18, server: Host.domain.com, request: "GET /bkgtabs.php?bookingID=658108460B&show=1&toFolioID=3361434 HTTP/1.1", upstream: "http://192.168.1.50:8080/bkgtabs.php?bookingID=658108460B&show=1&toFolioID=3361434", Host: "Host.domain.com", referrer: "https://Host.domain.com/bkgtabs.php?bookingID=658108460B&show=1&toFolioID=3361434"
2015/03/13 15:24:14 [error] 4481#0: *557663 upstream timed out (110: Connection timed out) while connecting to upstream, client: 174.53.144.4, server: Host.domain.com, request: "GET /bkgtabs.php?bookingID=3105543&show=0 HTTP/1.1", upstream: "http://192.168.1.50:8080/bkgtabs.php?bookingID=3105543&show=0", Host: "Host.domain.com", referrer: "https://Host.domain.com/bkgtabs.php?bookingID=3105543&show=0"
2015/03/13 15:24:15 [error] 4481#0: *557752 upstream timed out (110: Connection timed out) while connecting to upstream, client: 24.158.4.70, server: Host.domain.com, request: "GET /bkgtabs.php?bookingID=2070569 HTTP/1.1", upstream: "http://192.168.1.50:8080/bkgtabs.php?bookingID=2070569", Host: "Host.domain.com", referrer: "https://Host.domain.com/tapechart.php"
2015/03/13 15:24:15 [error] 4482#0: *558613 upstream timed out (110: Connection timed out) while connecting to upstream, client: 199.102.121.3, server: Host.domain.com, request: "GET /rptlanding.php HTTP/1.1", upstream: "http://192.168.1.50:8080/rptlanding.php", Host: "Host.domain.com", referrer: "https://Host.domain.com/tapechart.php"
2015/03/13 15:24:17 [error] 4482#0: *557353 upstream timed out (110: Connection timed out) while connecting to upstream, client: 174.53.144.4, server: Host.domain.com, request: "GET /js/multiselect/demo/assets/prettify.js HTTP/1.1", upstream: "http://192.168.1.50:8080/js/multiselect/demo/assets/prettify.js", Host: "Host.domain.com", referrer: "https://Host.domain.com/bkgtabs.php?bookingID=3186044"

非常に大きく、適度なデータセットを持つユーザーに対して完全にレンダリングするために少なくとも20秒かかる1つのレポートがあるため、私は最初にそのような高いproxy_read_timeoutを設定する必要があることに気付きました。最大のデータセットを持つユーザーがレポートを表示するには、最大2分かかります。ただし、実行される頻度は非常に低く、通常は使用によって1日に1回未満であり、ログのGET文字列のURLには使用されていません。

4つのバックエンドサーバーは、ソースからビルドされたhttpd 2.2.29とphp 5.5.22を実行する同一のApacheサーバーであり、すべて同じバージョンのcentos上にあり、最新です。最初にMaxClientsがログでヒットするのを見たので、各Apacheホストで次のように定義しました

<IfModule mpm_prefork_module>
    StartServers          10
    MinSpareServers       10
    MaxSpareServers      20
    MaxClients          200
    MaxRequestsPerChild   300
</IfModule>

NginxサーバーとApacheサーバーはすべて同じデータセンターの同じサブネットとvlanにあり、Apacheサーバー側のerror_logにタイムアウトの理由を示すものは何もありません。

これをトラブルシューティングするために私たちが試みたその他のことには、

  • Proxy_read_timeoutを300に増やします。
  • Gzip設定を削除しています。
  • CSS、画像、JavaScriptキャッシュのロケーションブロックを削除します。
  • Proxy_bufferingを有効にします。 nginxが空白のページを20〜120秒間表示するのではなく、レンダリングされた状態で(建物のレポートのJavaScript進行状況インジケーターを含む)配信を開始できるようにするため、大きなレポートのために無効になっています。
  • キープアライブ8/16/32/64をアップストリームに追加します。

この時点で、webappをコヨーテポイントロードバランサーに戻し、苦情がなくなったため、ネットワークの問題またはバックエンドの問題であるかどうか疑問です。

私は本当にこれを理解するのが大好きですが、私はここからどこへ行くべきかについてちょっと困惑しています。アドバイスしてください?

7
Jchieppa

Nginx <-> Apache2セットアップでこのような状況に遭遇しました。 MySQLのパフォーマンスが低下したため、Apacheは負荷がかかったときに時間がかかりすぎました。 Apacheの所要時間を調べるために、ログの形式を次のように変更しました。

LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %DµSEC" timed

そしてnginxログは:

log_format timed_combined '$remote_addr - $remote_user [$time_local]  '

次に、Apacheがすべてのリクエストを完了しているにもかかわらず、nginxにデータを返送するのが(何秒も)非常に遅いことがわかりやすくなりました。

1つのApacheサーバーが他のサーバーよりもはるかに遅い場合を除いて、なぜhaproxyがあなたの状況を助けたのかはわかりません。これは、1台のマシンで回復可能なディスクエラーが発生している場合に、同じマシンで発生する可能性があります。エラーはsyslogに表示されます。

2
a9k