nginx try_files, proxy_pass-und upstream
Ich Baue ein dockerised Test 'Plattform' für PHP-apps - speziell (für den moment) für WordPress. Ich bin mit PHPFarm zu dienen, unterschiedliche PHP-Versionen auf verschiedenen ports. Mithilfe von nginx in der front, ich habe sehr viel es Arbeit. ( https://github.com/richardtape/testit ist das Haupt-repo )
Das große Thema, ich bin vor jetzt ist immer WordPress die "pretty permalinks" zu arbeiten. In einem standard-nginx-setup, es ist nur ein Fall von so etwas wie
location / {
index index.php index.html index.htm;
try_files $uri $uri/ /index.php?$args;
}
Aber um der Lage sein, um schöne urls in der host-Maschine, und um eine code-Basis, ich bin mit etwas entlang der folgenden Zeilen:
server {
listen 80;
index index.php index.html index.htm;
server_name 52.spaces.dev;
location / {
proxy_pass http://phpfarm_52;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
root /var/www;
}
upstream phpfarm_52{
server phpfarm:8052;
}
Diese, so wie es da steht, funktioniert. (Es gibt 5 Regeln, ähnlich wie dies für PHP 5.3, 5.4, 5.5, 5.6 und 7) Die home-Seite geladen wird auf jede der verschiedenen server_names von der host-Maschine (und wenn du die Ausgabe der PHP-version auf jeden von Ihnen, können Sie sehen, dass Sie immer eine andere PHP-version).
Aber der zweite Wechsel ich zu einem 'internen' url (oder jeder nicht-root-d.h. http://52.spaces.dev/about/), bekomme ich ein 404. Ich habe versucht, etwas ähnliches zu
location / {
try_files $uri $uri/ /index.php?$args
}
location ~ \.php$ {
proxy_pass http://phpfarm_52;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
}
Bekomme ich eine redirect-Schleife, je nachdem, ein paar verschiedene Möglichkeiten, die ich probiert habe entweder ist es nur eine Serie von 301-Weiterleitungen und die Seite nie geladen wird oder ein Fehler, wie
nginx_1 | 2016/04/08 20:31:29 [error] 5#5: *4 rewrite or internal redirection cycle while processing "/index.php", client: 192.168.99.1, server: 52.spaces.dev, request: "GET /favicon.ico HTTP/1.1", host: "52.spaces.dev", referrer: "http://52.spaces.dev/"
Ich bin stecken. Ich bin auch ziemlich neu in der nginx-Konfiguration (das kann offensichtlich sein), also kann ich auch etwas tun, völlig falsch und/oder dumm. Irgendwelche Vorschläge?
Das selbst sollte einen 404, aber soweit ich es verstehe, sind die
try_files $uri $uri/ /index.php?$args
bedeutet, dass es sollte schließlich fallback auf die index.php (mit den entsprechenden args), die nicht einen 404 (dargestellt durch die Tatsache, dass die home-Seite funktioniert). Wenn ich die 'pretty' permalinks deaktiviert, d.h. alles läuft über den index.php), dann funktioniert es wie erwartet.InformationsquelleAutor RichardTape | 2016-04-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem, das Sie erlebt haben mit dem redirect-Schleife, die in Ihrer Frage ist, dass grundsätzlich jede Anfrage, auch für statische Dateien versucht, über Ihre route index.php?$args block.
Ich sehe 2 mögliche Lösungen hier. Erstens, wenn Sie bereit sind, zur Umsetzung des nginx setup mit einer einzigen Apache-Instanz, Blick auf diesen thread: NGINX try_files mit mehrere benannte Orte und diesem blog-post http://linuxplayer.org/2013/06/nginx-try-files-on-multiple-named-location-or-server
Was geschehen muss, ist, dass Sie brauchen, um zuerst zu testen, wenn die Ressource vorhanden ist, die auf der stromaufwärts (d.h., nicht mehr zurück 404). Wenn es funktioniert, dann dienen Sie, wie es ist. Wenn nicht, dann würden Sie anrufen, den rewrite-block, der versucht, um es als parameter an index.php. So würden Sie am Ende mit etwas wie dieses (sorry, ich weiß wirklich nicht haben eine chance, dies zu testen, aber ich hoffe, es gibt eine Idee):
Die zweite Lösung (das würde ich persönlich bevorzugen), um vor jedem upstream mit eigener nginx. Dann die top nginx, die vor allen anderen eine viel sauberere Struktur mit einfachen proxy_pass (+ vielleicht ein paar statische Inhalte) und das ist es. Es wird auch reduzieren auf die Anfrage round-trip, da Sie nicht brauchen, um zu beheben 404 kommt von der upstreams.
;
auf der Linie 2), aber jetzt jede Seite (einschließlich der home-page) diente der downloads index.php Datei anstatt ausführt. Ich vermute, wir sind fast dort mit diesem.Fixiert wird das Semikolon ; -) Wenn es die Datei lädt, es bedeutet, dass entweder der content-Typ ist nicht ordnungsgemäß weitergeleitet, oder ich Durcheinander etwas mit der rewrite-Zeile (ich bin mir nicht sicher, wie es sein soll für wordpress in diesen Tagen), oder beides. Aber das spielen mit diesen sollte es lösen. Hoffe, es hilft.
Nochmals vielen Dank so viel für Ihre Hilfe so weit. Ich habe versucht, indem
default_type
(undproxy_set_header content-type
) application/octet-stream, aber keine Würfel gibt. Ich glaubst könnte es sein, dass der container, auf dem nginx installiert ist, PHP ist nicht, so dietry_files
Zeile für die root-Lage block ist zu sehen, die index.php Datei und einfach herunterladen Sie es. Würde das einen Unterschied machen? Ich habe versucht, hinzufügen .php location-block, aber immer redirect-loops. Der aktuelle Stand der conf-Datei ist: gist.github.com/richardtape/9a84e5de6f09d14a1ff8b92449ba96b0Also der code oben ist korrekt (möglicherweise müssen Sie einige Anpassungen für die rewrite-handling, etc), aber das Problem ist am Ende PHPFarm/Apache und Handhabung der schreibt
Hi Richard, nahm ein anderes Aussehen an Ihrer Konfiguration aus, und scheinbar Ihre phpfarm Knoten Apache vor Ihnen. Haben Sie versucht, die Lösung permalinks mit Apache statt, das wäre äquivalent zu meiner 2. Lösung, bei nginx wäre eine saubere reverse-proxy? codex.wordpress.org/Using_Permalinks
InformationsquelleAutor taleodor