Mehrere PHP-Versionen durch nginx

Mehrere PHP-Versionen durch nginx

BEARBEITEN:Zum Nachschlagen

Ich verwende Ubuntu 14.10 mit einem LEMP-Stack und PHP 5.5.12. Ich habe eine Reihe älterer WordPress-Sites, die PHP 5.3.3 erfordern, sowie einige WP-Sites, die eine relativ neue Version von PHP verwenden und alle auf nginx laufen.auf meinem lokalen Rechner.

In Bezug auf virtuelle Maschinen und Sandboxen sind mir die Hände gebunden, ich kann nur mit nginx spielen, daher diese Frage. Ich verstehe die Sicherheitsbedenken der Leute, aber ich muss diese Sites lokal ausführen, damit ich sie auf defekte Funktionen testen kann, während ich sie auf die neuesten PHP-/WP-Versionen aktualisiere.

Ich möchte, dass nginx je nach WordPress-Site die richtige Version von PHP ausführt (mit php-fpm). Lautein andererSF-Frage: Eine Möglichkeit, dies zu erreichen, besteht darin, die verschiedenen PHP-Versionen auf separaten Ports/Sockets auszuführen und die Nginx-Serverblöcke so zu konfigurieren, dass sie den jeweiligen Port/Socket verwenden.

Ich habe PHP 5.3.3 manuell kompiliert, um php-fpm einzuschließen, aber weiter bin ich nicht gekommen.

Tatsächlich möchte ich, dass jemand mir das etwas genauer erklärtDasAntwort. Ich weiß nicht genau, wie ich„Führen Sie jede Version von php-fpm auf einem anderen Port (oder Socket) aus.“oder„Konfigurieren Sie den entsprechenden Port in Ihrem Fastcgi_pass-Parameter in Ihrem Nginx-Serverblock.“.

Einer meiner Serverblöcke sieht zur Referenz so aus

server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

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

    error_page 404 /404.html;

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
}

BEARBEITEN:

Ich habe jede Site mit einem separaten Serverblock in einer separaten Datei eingerichtet, die durch einen symbolischen Link zwischen /var/nginx/sites-available/testsite1und verknüpft ist /var/nginx/sites-enabled/testsite1. var/nginx/sites-availableEnthält also:

 testsite1
 testsite2
 testsite3
 ...

Alsoim IdealfallIch habe mich gefragt, ob so etwas wie das Folgende möglich ist (da dies der Einrichtung von Apache mit verschiedenen PHP-Versionen ähnelt).

testsite1 – Ausführen einer älteren PHP-Version

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite1;
    index index.php index.html index.htm;

    server_name local.testsite1.com;

    ...settings to use older PHP version...

    ...remaining nginx settings...
}

testsite2 - aktuelle PHP-Version wird ausgeführt

 server {
    listen 80;
    listen [::]:80;

    root /usr/share/nginx/html/testsite2;
    index index.php index.html index.htm;

    server_name local.testsite2.com;

    ...settings to use currrent PHP version (if needed)...

    ...remaining nginx settings...
}

Ist das möglich? Der Grund für meine Frage ist, dass ich es lieber vermeiden möchte, alle meine phpDateien umzubenennen, um php2sie ausführen zu können (was die Versionskontrolle mühsam machen würde). Mir macht das Bearbeiten der nginx.confDatei oder die dazu erforderlichen Schritte nichts aus, solange ich keine Dateien umbenennen muss.

ich auchglaubenIch muss aufgrund von WordPress Sockets statt Ports verwenden (fastcgi_pass unix:/var/run/php5-fpm.sock;)(bin aber für alle Vorschläge offen).

Antwort1

Okay, Sie möchten mehrere PHP-Versionen über nginx ausführen. Die Konfigurationsdatei sollte den spezifischen Pfad enthalten, in dem Sie Ihre PHP-Skripte in verschiedenen Versionen oder Erweiterungsnamen ablegen.

Ich möchte jedoch den in Ihrem Beitrag angegebenen Link zur SF-Frage erläutern.

Diese Antwort bietet Ihnen die Möglichkeit, confIhre zu ändern nginx. Dabei wird vorausgesetzt, dass der Fragesteller über Hintergrundwissen in verfügt nginx.

Durch die Angabe eines bestimmten Ports confsorgt Nginx dafür, dass das Skript über diesen FastCGI-Kanal ausgeführt wird.

portNehmen wir an, Sie haben eine andere PHP-Version auf Ihrem Server installiert und diese in geändert php-fpm.conf.

Sie möchten, dass alle phpDateien in der Version 5.5.0und php2alle Dateien in ausgeführt werden 5.6.0.

Beispielkonfiguration von Nginx wie folgt:

    listen       8080;
    server_name  localhost;

    root   html;

    location / {
        index  index.php index.php2;
    }

    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

    location ~ \.php2$ {
        fastcgi_pass   127.0.0.1:9001;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  "${document_root}${fastcgi_script_name}";
        include        fastcgi_params;
    }

In diesem Fall phpwird über den Hafen verarbeitet 9000und php2geht an9001

Dies ist nur ein einfaches Beispiel. Für Fortgeschrittene: Sie können zwei unterschiedliche Ordner erstellen, um beispielsweise PHP-Dateien zu speichern, /home/php55und /home/php56dann Ihre bearbeiten nginx.conf.

FÜR IHRE BEARBEITETE FRAGE

Wenn Sie versuchen möchten, verschiedene Server hinzuzufügen, um die Skripte in unterschiedlichen Versionen zu verarbeiten, können Sie das natürlich tun, da Nginx als Lastenausgleich fungieren kann und auch mit dieser Art von Problemen umgehen kann.

Erste Anwendung

server{
listen 80;
server_name php1.localhost; 

root   /home/www/php5.5;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9002; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

Zweite Anwendung

server{
listen 80;
server_name php2.localhost; 

root   /home/www/php5.6;

location / {
  index  index.php;
}

location ~ \.php$ {
  fastcgi_pass   127.0.0.1:9004; (You can change it to your private IP in the future)
  fastcgi_index  index.php;
  fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include        fastcgi_params;
}
}

Mit der obigen Konfiguration können Sie problemlos zwischen den verschiedenen Versionsergebnissen des PHP-Skripts wechseln. Darüber hinaus können Sie NFS (wenn Sie sich in einer *nix-Umgebung befinden) zum Mounten der Festplatte verwenden. In diesem Fall müssen Sie die Dateien nicht manuell in zwei Ordnern ablegen.

Was die Fastcgi-Übergabemethode betrifft, empfehle ich die Verwendung von PORT statt Socket.

Wir alle wissen, dass Unix Socket eine bessere Leistung hat, da der TCP-Port den gesamten Netzwerkstapel verwendet, sogar auf derselben Maschine.

Allerdings ist die Zeitersparnis sehr gering. Außerdem kann dieses Problem auftreten, wenn Sie Socket zu Zeiten mit hohem Datenverkehr verwenden.

connect() zu unix:/var/run/php5-fpm.sock ist fehlgeschlagen oderapr_socket_recv: Verbindung vom Peer zurückgesetzt (104)

Darüber hinaus kann Ihnen der TCP-Port eine schnellere Verwaltung ermöglichen, wenn Sie Nginx und PHP-FPM auf getrennten Servern platzieren.

Ich verwende einen kleinen Laptop, um diesen Beitrag zu bearbeiten, daher sind die Codes nicht schön, aber ich habe es versucht …

BEARBEITET

Denken Sie daran, Ihren /etc/hostsso zu ändern, dass er Ihrem Hostnamen entspricht (Servername in nginx.conf).

Antwort2

Zu Testzwecken wollte ich meinen nginx so konfigurieren, dass er an verschiedenen Stellen im gleichen Serverbereich unterschiedliche PHP-Versionen verwendet. Schließlich hat es so geklappt:

#Folder to run some tests with the new php-7
location ~ "^\/test_php7.0.3\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php7-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#Folder to run some tests with a custom compiled version of php5.6
location ~ "^\/test_php5.6.18\/.*\.php$" {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php56-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

#The default php version:
location ~ \.php$ {
    try_files $uri =404;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Hoffe, das hilft jemand anderem :)

verwandte Informationen