Nginx als Load Balancer. Zeitüberschreitung bei häufigem Upstream (110: Zeitüberschreitung bei Verbindung) während der Verbindung zum Upstream

7

Ich versuche, Nginx auf einer virtuellen Centos 7-Maschine als Load Balancer zu verwenden, um ein veraltetes Coyote Point-Hardwaregerät zu ersetzen. In einer unserer Webanwendungen treten jedoch häufige und kontinuierliche Upstream-Timeout-Fehler in den Protokollen auf, und Clients berichten über Sitzungsprobleme während der Verwendung des Systems.

Hier sind die relevanten Bits aus unserer 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/;
 }
}

In den Protokollen sehe ich häufig Einträge wie

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"

Ich stellte anfangs fest, dass ich ein so hohes proxy_read_timeout festlegen musste, da wir einen Bericht haben, der sehr groß ist und für Benutzer mit einem moderaten Datensatz mindestens 20 Sekunden benötigt, um vollständig gerendert zu werden. Unsere Benutzer mit dem größten Datensatz können bis zu 2 Minuten benötigen, um den Bericht zu rendern. Es wird jedoch sehr selten ausgeführt, normalerweise weniger als einmal pro Tag, und war nie die URL in der GET-Zeichenfolge in den Protokollen.

Die vier Backend-Server sind identische Apache-Server, auf denen alle httpd 2.2.29 und PHP 5.5.22 ausgeführt werden. Alle befinden sich auf derselben Centos-Version und sind auf dem neuesten Stand. Da ich ursprünglich einen MaxClients-Treffer in den Protokollen gesehen hatte, definierte ich auf jedem Apache-Host Folgendes

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

Der Nginx-Server und die Apache-Server befinden sich alle im selben Datencenter, im selben Subnetz und im selben VLAN, und im error_log auf der Apache-Serverseite wird nichts angezeigt, was einen Grund für die Zeitüberschreitung angibt.

Zusätzliche Dinge, die wir versucht haben, um dieses Problem zu beheben, sind:

  • Erhöhen Sie das proxy_read_timeout auf 300.
  • Entfernen der Gzip-Einstellungen.
  • Entfernen des Standortblocks für CSS, Bilder und Javascript-Caching.
  • Proxy-Puffer aktivieren. Es ist aufgrund des großen Berichts deaktiviert, damit Nginx ihn als gerendert bereitstellen kann (einschließlich einer Javascript-Fortschrittsanzeige für Gebäudeberichte), anstatt 20 bis 120 Sekunden lang eine leere Seite anzuzeigen.
  • Hinzufügen von KeepAlive 8/16/32/64 zum Upstream.

An diesem Punkt bin ich zweifelhaft, dass es sich um ein Netzwerkproblem oder ein Problem mit dem Backend handelt, da ich die Webanwendung wieder auf den Coyote Point Load Balancer verschoben habe und die Beschwerden abgefallen sind.

Ich würde das wirklich gerne herausfinden, aber ich bin irgendwie ratlos, wohin ich von hier aus gehen soll. Ratschlag bitte?

Jchieppa
quelle
Angesichts dieses genauen Problems - konnten Sie dieses Problem lösen?
Jeffreyrey
1
@ Jeffreyveon Ich fürchte, ich habe nie die Grundursache dafür herausgefunden. Am Ende habe ich HAProxy zwischen Nginx und den Backend-Servern eingeklebt, sodass es zum Client <-> Nginx <-> Haproxy <-> Backend wurde. Es hatte den zusätzlichen Nebeneffekt einer aktiven Abfrage von Backend-Knoten, was meiner Meinung nach viel besser ist, als einen Fehler bei einer realen Anfrage zu entdecken.
Jchieppa

Antworten:

2

Ich bin in einem nginx <-> apache2-Setup auf so etwas gestoßen. Es war Apache, der unter Last zu lange dauerte, weil MySQL festgefahren war. Um herauszufinden, wie lange Apache gedauert hat, habe ich das Protokollformat geändert in:

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

und das Nginx-Protokoll an:

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

Dann wurde es einfacher zu erkennen, dass Apache zwar alle Anforderungen erledigte, es jedoch sehr spät (um viele Sekunden) war, Daten an nginx zurückzusenden.

Ich bin mir nicht sicher, warum Haproxy Ihrer Situation geholfen hat, es sei denn, ein Apache-Server ist viel langsamer als die anderen. Dies kann bei identischen Computern passieren, wenn auf einem Computer behebbare Festplattenfehler vorliegen. Die Fehler sollten in den Syslogs angezeigt werden.

a9k
quelle