Der Webserver bedient zufällig verschiedene vhosts

9

Wir haben Nginx unter Ubuntu Trusty. Es bedient mehrere Websites über https, die unter einer IP-Adresse ausgeführt werden.

Zufällig werden einzelne Anforderungen auf dem falschen vhost angezeigt, obwohl dies in geringem Zusammenhang mit der Arbeitslast zu stehen scheint. Dies führt zu Anfragen nach lustrum.thalia.nuZustellung durch thalia.nuund umgekehrt. Dies führt dann zu bösen Fehlerseiten, da Benutzer plötzlich auf einer anderen Website landen. Wenn Sie drücken F5, landen die Benutzer wieder auf dem ursprünglichen Ziel.

Es scheint nicht mit dem Browser oder dem Betriebssystem zu tun zu haben. Es wurde bestätigt, dass dies unter Firefox (Linux, Windows, Mac), Edge (Windows) und Chrome (Linux, Windows, Android) und Safari (iOS) geschieht.

Das Problem scheint häufiger aufzutreten, wenn das System unter Last gesetzt wird, was auf eine Art Rennbedingung hindeutet.

lustrum.thalia.nu

server {
        server_name lustrum.thalia.nu;

        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/nginx/certs/lustrum.thalia.nu.crt;
        ssl_certificate_key /etc/nginx/certs/lustrum.thalia.nu.key;

        add_header Strict-Transport-Security "max-age=63072000; preload";

        root /var/www/thalia-lustrum/public_html;

        location / {
                index index.php;
                try_files $uri $uri/ /index.php?$args;
        }

        # Add trailing slash to */wp-admin requests.
        rewrite /wp-admin$ $scheme://$host$uri/ permanent;

        # Pass all .php files onto a php-fpm/php-fcgi server.
        location ~ [^/]\.php(/|$) {
                include         /etc/nginx/fastcgi_params;

                fastcgi_split_path_info ^(.+?\.php)(/.*)$;

                if (!-f $document_root$fastcgi_script_name) {
                        return 404;
                }

                fastcgi_pass    unix:/var/run/php5-fpm-thalia-lustrum.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
        }
}

thalia.nu

server {
        server_name thalia.nu;    
        listen 443 ssl;

        ssl on;
        ssl_certificate /etc/nginx/certs/www.thalia.nu.crt;
        ssl_certificate_key /etc/nginx/certs/www.thalia.nu.key;

        add_header Strict-Transport-Security "max-age=63072000; preload";

        root /var/www/thalia/public_html;

        location / {
                try_files $uri $uri/ /index.php/$request_uri;
                index index.php index.html index.htm;
        }

        location ~ \.php($|/) {
                include         /etc/nginx/fastcgi_params;
                set  $script     $uri;
                set  $path_info  "";
                if ($uri ~ "^(.+\.php)(/.+)") {
                                set  $script     $1;
                                set  $path_info  $2;
                }
                fastcgi_read_timeout    120;
                fastcgi_pass    unix:/var/run/php5-fpm-thalia-www.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME  /public_html$fastcgi_script_name;
        }
}

Wie Sie sehen können, führen wir für diese beiden Domänen unterschiedliche PHP5-FPM-Pools aus. Diese Pools werden in verschiedenen Ordnern gespeichert und als verschiedene Benutzer ausgeführt. Die Konfiguration von PHP-FPM ist ansonsten, soweit ich das beurteilen kann, ziemlich Standard.

Wir haben sowohl nginx 1.4.6-ubuntu3 als auch nginx 1.8.0-1 + vertrauenswürdig ausprobiert.

Protokolltelemetrie

266.266.266.266 - - [25/Nov/2015:09:24:40 +0100] "GET /committees/175 HTTP/1.1" 302 5 "https://thalia.nu/committees" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:42.0) Gecko/20100101 Firefox/42.0" Host: "thalia.nu" Location: "https://thalia.nu/index.php//committees/wp-admin/setup-config.php"

In dieser Zeile sehen Sie, dass die Anforderung für die Seite /committeesplötzlich umgeleitet wird wp-admin. Dies scheint, dass die Anfrage für /committeesvom thalia-lustrumPHP-fpm-Pool bearbeitet wurde ...

DNS-Zonendatei

Wir sehen nicht, wie dies möglicherweise relevant sein kann, aber ...

;; MX Records
thalia.nu.    300    IN    MX    20    relay.transip.nl.
thalia.nu.    300    IN    MX    10    ivo.thalia.nu.

;; TXT Records
thalia.nu.    300    IN    TXT    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; SPF Records (Sender Policy Framework)
thalia.nu.    300    IN    SPF    "v=spf1 a mx a:mulgore.hexon-is.nl a:moonray.hexon-is.nl a:fred.thalia.nu a:ivo.thalia.nu ~all"

;; CNAME Records
lustrum.thalia.nu.    300    IN    CNAME    thalia.nu.

;; A Records (IPv4 addresses)
thalia.nu.    300    IN    A    131.174.31.8
www.thalia.nu.    300    IN    A    131.174.31.8
ivo.thalia.nu.    300    IN    A    131.174.31.8
Thom Wiggers
quelle
1
Bitte überprüfen Sie Ihre DNS-Einstellungen für die Domains.
Diamond
1
@bangal Sie sind ein A- und ein CNAME-Datensatz, die auf dieselbe IP verweisen. Ich sehe jedoch nicht, wie dies zusammenhängt; Diese Probleme lösen sich einwandfrei auf, und es ist unwahrscheinlich, dass sich ein DNS-Problem so uneinheitlich manifestiert.
Joost
2
@ThomWiggers, können Sie der Protokolldatei den Inhalt des Host:http-Headers und des Benutzeragenten hinzufügen ? Hier erfahren Sie, wie: serverfault.com/questions/636790/… . Eigentlich habe ich versucht, einige Anfragen an Ihre Websites zu stellen, aber Ihr Problem konnte nicht reproduziert werden. Welchen Client verwenden Sie, um dies zu reproduzieren?
Fredi
3
Ist die Tatsache, dass ich gerade "Inhalte von Drittanbietern nicht installiert" habe oder so, weil Sie daran arbeiten, oder bin ich in einem anderen PHP-Pool gelandet oder so (was denselben Fehler auslöst)? Ich habe auch einen kurzen Fehler über config.phpnicht gefunden bekommen.
Halfgaar
2
@kasperd serverfault.com/questions/737349/… . Es scheint nur PHP-Skripte zu betreffen.
Thom Wiggers

Antworten:

4

Nach stundenlangem Debuggen dieses Problems konnten wir es endlich auf die Ursache zurückführen. Es scheint, dass die Ursache nicht ist nginx, aber PHP-fpm. Wir führen die php5-fpmVersion aus 5.5.9-1ubuntu4.14. Es scheint, dass beim Gabeln neuer Arbeiter manchmal etwas schief geht und die Arbeiter (Teil?) Den Kodex verschiedener Arbeiter ausführen.

Unsere Lösung bestand darin /etc/php5/fpm/php5-fpm.conf, mit ihren eigenen pool.dOrdnern in verschiedene Kopien zu kopieren und dann zu kopieren /etc/init.d/php5-fpm, um mit der neuen Konfigurationsdatei zu starten (auch Dateien in zu erstellen /etc/init/). Das heißt, wir haben jetzt einen php5-fpmProzessmanager pro Pool. Separate Chroots und Sockets zu haben, scheint die Dinge nicht getrennt genug zu halten.

Thom Wiggers
quelle
Beachten Sie, dass derzeit unklar ist, ob dies ein Problem in unserer Konfiguration oder in (dieser Version von) php5-fpm ist, obwohl letzteres aufgrund des Fehlens ähnlicher Berichte nicht wahrscheinlich erscheint. Wenn wir den Grund für dieses Problem finden, wird diese Antwort aktualisiert.
Joost
1

Ich stehe vor dem gleichen Problem, aber unter Debian mit Apache2.4.25 und PHP7.1-FPM. Hier ist eine Möglichkeit, Prozesse zu trennen: https://ma.ttias.be/a-better-way-to-run-php-fpm/

Für diejenigen wie mich, die diese Lösung für kleine Websites möglicherweise zu schwer finden, fügen Sie sie php_admin_value[opcache.revalidate_freq] = 0am Ende der Konfigurationsdatei des php-fpm-Pools hinzu. Dies kann jedoch schwerwiegende Auswirkungen auf die Leistung haben ...

Hier ist der offizielle Fehlerbericht: https://bugs.php.net/bug.php?id=67141

Nic0tiN
quelle
0

Unterstützt Nginx SNI? Sie können nginx -V ausführen und sollten die TLS-SNI-Unterstützung aktiviert sehen. Wenn Sie dies nicht tun, kann dies der Grund sein, weil der Hostname nach dem Handshake gesendet wird und ich davon ausgehe, dass Sie ein Platzhalterzertifikat für * .thalia.nu haben

Mugurel
quelle
Natürlich würde dies ohne SNI 100% der Zeit schief gehen, anstatt sehr gelegentlich. (und ich habe dies auch überprüft, es ist definitiv aktiviert)
Thom Wiggers
FWIW, beachten Sie, dass wir kein Platzhalterzertifikat bereitstellen, sondern einzelne Zertifikate für die separaten Subdomänen verwenden. Dies ist in der in der Frage aufgeführten Konfiguration enthalten.
Joost
.. obwohl das lustrum.thalia.nu Zertifikat auch für Thalia.nu
Thom Wiggers
Können Sie versuchen, den Parameter includeSubDomains wie folgt hinzuzufügen? add_header Strict-Transport-Security "max-age = 63072000; includeSubDomains; Preload";
Mugurel
@ThomWiggers Wenn das Zertifikat für mehrere Domänen gültig ist, können mehrere Domänen auf einer einzigen IP ohne SNI unterstützt werden.
Kasperd
-1

Es scheint, dass das Zertifikat nicht richtig ist: Firefox sagt mir, dass es für www.thalia.nu ausgestellt wurde, nicht für thalia.nu.

Dies ist meiner Meinung nach das, was Ärger verursacht. Versuchen Sie es mit einem anderen Zertifikat oder aktivieren Sie HTTP-Verbindungen ohne SSL.

Xavier Nicollet
quelle
Das können wir nicht reproduzieren. Das Zertifikat serviert www.thalia.nuund thalia.nuumfassen sowohl Domains mit und ohne www. Welche Firefox-Version verwenden Sie und auf welcher Plattform?
Joost