Cómo cambiar las versiones de PHP en Nginx si fastcgi_pass apunta a un socket TCP

Cómo cambiar las versiones de PHP en Nginx si fastcgi_pass apunta a un socket TCP

Mi pregunta es simple (espero).

En todas partes de Internet leo que si quiero cambiar las versiones de PHP en Nginx, necesito cambiar el socket UNIX del fastcgi_passparámetro. Pero mi fastcgi_passparámetro apunta a un socket TCP: 127.0.0.1:9250. Intenté cambiarlo a un socket UNIX, pero eso me dio un error 502 Bad Gateway y no sabía cómo continuar desde allí.

Actualmente estoy ejecutando PHP 8.2, pero necesito PHP 8.1. Lo instalé usando apt-gety aparece en la lista al hacerlo sudo update-alternatives --list php. Probé el sudo update-alternativesenfoque, pero eso solo cambia la versión de PHP en CLI. No FPM.

Mi configuración de nginx es bastante sencilla:

/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;
    }
}

El parámetro de escucha etc/php/8.2/fpm/pool.d/www.confapunta al mismo socket TCP: 127.0.0.1:9250.

EDITAR:Según lo solicitado, esto es lo que cambié /etc/php/8.1/fpm/pool.d/www.conf. Estas ediciones son iguales en /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

Respuesta1

Su pregunta es un poco confusa: hay al menos 3 configuraciones (8.2 con socket de red, 8.1 con socket de red, 8.1 con socket de red) solo la configuración de nginx para una de las configuraciones y no hay detalles de CÓMO cambió la configuración de php-fpm .

Intenté cambiarlo a un socket UNIX, pero me dio un error 502 Bad Gateway

Necesita que el servidor esté escuchando en el lugar donde el cliente intenta conectarse. Una complicación adicional con los sockets de dominio Unix (en comparación con los sockets TCP) es que requiere que el archivo tenga un propietario y un grupo (normalmente el mismo propietario que el uid con el que se ejecuta el servidor web), por ejemplo, en www.conf.

listen = /var/run/php8.1-fpm.sock
listen.owner = www-data
listen.group = www-data

Tu también necesitas sermuyTenga cuidado si tiene dos versiones de PHP instaladas en el mismo host. Me aseguraría de que el que no desea se haya eliminado por completo antes de intentar instalar el nuevo.

A menos que necesite explícitamente un socket TCP, sugeriría usar el socket de dominio Unix. Aunque localhost es significativamente más rápido que una dirección vinculada a una interfaz física y tiene ventajas de seguridad implícitas, los sockets Unix son aún más rápidos.

Respuesta2

Quizás mi pregunta no fue clara, no soy administrador de sistemas, por lo que no todo está tan claro para mí como probablemente debería. Sin embargo, leer la respuesta de @symcbean me dejó claro que cambiar a un socket UNIX no debería ser la raíz del problema, que es lo que asumí al escribir mi pregunta. Entonces, decidí seguir ese camino y lidiar con todo lo que se interpusiera en mi camino.

Aquí están las ediciones que hice para cambiar a otra versión de PHP y, como beneficio adicional, descubrí cómo facilitarme el cambio entre versiones de PHP en Nginx:

Cambié el fastcgi_passparámetro /etc/nginx/sites-enabled/daan.confa /var/run/php/php-fpm.sock.

Cambié el listenparámetro /etc/php8.1/fpm/pool.d/www.confal mismo valor. Hice lo mismo para /etc/php8.2/fpm/pool.d/www.confy /etc/php8.0/fpm/pool.d/www.conf.

Ahora, cuando se ejecuta sudo update-alternatives --config php, el php-fpm.sockarchivo se convierte en un enlace simbólico a la versión de PHP elegida, que tanto PHP FPM como Nginx escuchan.

Después de eso (y esta parte probablemente causó el error Bad Gateway que mencioné en mi pregunta anterior) es importante reiniciar correctamente Nginx y PHP-FPM (copié y modifiqué este script desdeaquí):

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

Ahora funciona.

información relacionada