
Meine Frage ist einfach (hoffe ich).
Überall im Internet lese ich, dass ich den UNIX-Socket des fastcgi_pass
Parameters ändern muss, wenn ich die PHP-Version in Nginx ändern möchte. Aber mein fastcgi_pass
Parameter zeigt auf einen TCP-Socket: 127.0.0.1:9250
. Ich habe versucht, ihn in einen UNIX-Socket zu ändern, aber das hat mir einen 502 Bad Gateway-Fehler beschert und ich wusste nicht, wie ich von da an weitermachen sollte.
Ich verwende derzeit PHP 8.2, brauche aber PHP 8.1. Ich habe es mit installiert apt-get
und es wird aufgelistet, wenn ich es mache sudo update-alternatives --list php
. Ich habe den sudo update-alternatives
Ansatz ausprobiert, aber das ändert nur die PHP-Version in der CLI. Nicht FPM.
Meine Nginx-Konfiguration ist ziemlich unkompliziert:
/etc/nginx/nginx.conf
:
user www-data;
worker_processes 4;
pid /run/nginx.pid;
# master_process off;
events {
worker_connections 768;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*.conf;
}
/etc/nginx/sites-enabled/daan.conf
:
server {
listen 80;
server_name "~(?'project'([^.]+))\.dev.local$";
return 301 https://$project.dev.local$request_uri;
}
server {
listen 443 ssl http2;
server_name "~(?'project'([^.]+))\.dev.local$";
root "/etc/nginx/development/$project";
index index.php;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
access_log /var/log/nginx/dev.log;
error_log /var/log/nginx/dev-error.log error;
sendfile off;
client_max_body_size 100m;
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_pass 127.0.0.1:9250;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_intercept_errors off;
fastcgi_buffer_size 16k;
fastcgi_buffers 4 16k;
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
}
location ~ /\.ht {
deny all;
}
}
Der Listenparameter in etc/php/8.2/fpm/pool.d/www.conf
zeigt auf denselben TCP-Socket: 127.0.0.1:9250
.
BEARBEITEN:Wie gewünscht habe ich Folgendes in geändert /etc/php/8.1/fpm/pool.d/www.conf
. Diese Änderungen sind in gleich /etc/php/8.2/fpm/pool.d/www.conf
.
; Unix user/group of the child processes. This can be used only if the master
; process running user is root. It is set after the child process is created.
; The user and group can be specified either by their name or by their numeric
; IDs.
; Note: If the user is root, the executable needs to be started with
; --allow-to-run-as-root option to work.
; Default Values: The user is set to master process running user by default.
; If the group is not set, the user's group is used.
user = daanvandenbergh
group = daanvandenbergh
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific IPv4 address on
; a specific port;
; '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses
; (IPv6 and IPv4-mapped) on a specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = 127.0.0.1:9250
Antwort1
Ihre Frage ist etwas verwirrend – es gibt mindestens 3 Konfigurationen (8.2 mit Netzwerk-Socket, 8.1 mit Netzwerk-Socket, 8.1 mit Netzwerk-Socket), nur die Nginx-Konfiguration für eine der Konfigurationen und keine Details dazu, WIE Sie die PHP-FPM-Konfiguration geändert haben.
Ich habe versucht, es in einen UNIX-Socket zu ändern, aber das hat mir einen 502 Bad Gateway-Fehler ausgegeben
Sie müssen den Server dort abhören, wo der Client versucht, eine Verbindung herzustellen. Eine weitere Komplikation bei Unix-Domain-Sockets (verglichen mit TCP-Sockets) besteht darin, dass die Datei einen Besitzer und eine Gruppe haben muss (normalerweise denselben Besitzer wie die UID, unter der der Webserver läuft), z. B. in www.conf
listen = /var/run/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data
Sie müssen auchsehrSeien Sie vorsichtig, wenn Sie zwei PHP-Versionen auf demselben Host installiert haben. Ich würde sicherstellen, dass die nicht gewünschte Version vollständig entfernt wurde, bevor Sie versuchen, die neue zu installieren.
Sofern Sie nicht ausdrücklich einen TCP-Socket benötigen, würde ich die Verwendung des Unix-Domain-Sockets empfehlen. Obwohl localhost deutlich schneller ist als eine an eine physische Schnittstelle gebundene Adresse und implizite Sicherheitsvorteile bietet, sind Unix-Sockets noch schneller.
Antwort2
Vielleicht war meine Frage nicht klar, ich bin kein Systemadministrator, daher ist mir nicht alles so klar, wie es wahrscheinlich sein sollte. Als ich jedoch die Antwort von @symcbean las, wurde mir klar, dass der Wechsel zu einem UNIX-Socket nicht die Ursache des Problems sein sollte – was ich beim Schreiben meiner Frage auch annahm. Also beschloss ich einfach, diesen Weg zu gehen und mich mit allem auseinanderzusetzen, was mir in den Weg kam.
Hier sind die Änderungen, die ich vorgenommen habe, um zu einer anderen PHP-Version zu wechseln. Als Bonus habe ich herausgefunden, wie ich problemlos zwischen PHP-Versionen in Nginx wechseln kann:
Ich habe den fastcgi_pass
Parameter in /etc/nginx/sites-enabled/daan.conf
geändert /var/run/php/php-fpm.sock
.
Ich habe den listen
Parameter in /etc/php8.1/fpm/pool.d/www.conf
auf denselben Wert geändert. Dasselbe habe ich für /etc/php8.2/fpm/pool.d/www.conf
und gemacht /etc/php8.0/fpm/pool.d/www.conf
.
Beim Ausführen wird sudo update-alternatives --config php
die php-fpm.sock
Datei jetzt zu einem symbolischen Link zur gewählten PHP-Version, auf die sowohl PHP FPM als auch Nginx hören.
Danach (und dieser Teil hat wahrscheinlich den Bad Gateway-Fehler verursacht, den ich in meiner Frage zuvor erwähnt habe) ist es wichtig, Nginx und PHP-FPM ordnungsgemäß neu zu starten (ich habe dieses Skript kopiert und geändert vonHier):
sudo mkdir -p /var/run/php
sudo service restart nginx
sudo service php(old version)-fpm stop -v
sudo service php(new version)-fpm start -v
sudo chown mysql:mysql /var/run/mysqld
sudo service mysql start
Jetzt funktioniert es.