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?
quelle
Antworten:
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:
und das Nginx-Protokoll an:
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.
quelle