Como mudar versões do PHP no Nginx se fastcgi_pass estiver apontando para um soquete TCP

Como mudar versões do PHP no Nginx se fastcgi_pass estiver apontando para um soquete TCP

Minha pergunta é simples (espero).

Em todo lugar na internet eu li que se eu quiser mudar as versões do PHP no Nginx, preciso mudar o soquete UNIX do fastcgi_passparâmetro. Mas meu fastcgi_passparâmetro está apontando para um soquete TCP: 127.0.0.1:9250. Tentei alterá-lo para um soquete UNIX, mas isso me deu um erro 502 Bad Gateway e não sabia como continuar a partir daí.

Atualmente estou executando o PHP 8.2, mas preciso do PHP 8.1. Eu instalei usando apt-gete está listado ao fazer sudo update-alternatives --list php. Tentei a sudo update-alternativesabordagem, mas isso só altera a versão do PHP na CLI. Não é FPM.

Minha configuração do nginx é bastante simples:

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

O parâmetro listen etc/php/8.2/fpm/pool.d/www.confaponta para o mesmo soquete TCP: 127.0.0.1:9250.

EDITAR:Conforme solicitado, aqui está o que alterei no /etc/php/8.1/fpm/pool.d/www.conf. Essas edições são iguais em /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

Responder1

Sua pergunta é um pouco confusa - existem pelo menos 3 configurações (8.2 com soquete de rede, 8.1 com soquete de rede, 8.1 com soquete de rede) apenas o conf nginx para uma das configurações e nenhum detalhe de COMO você alterou a configuração do php-fpm .

Eu tentei alterá-lo para um soquete UNIX, mas isso me deu um erro 502 Bad Gateway

Você precisa que o servidor esteja escutando no local onde o cliente está tentando se conectar. Uma complicação adicional com soquetes de domínio Unix (em comparação com soquetes TCP) é que ele exige que o arquivo tenha um proprietário e um grupo (normalmente o mesmo proprietário do uid como o servidor web é executado), por exemplo, em www.conf

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

Você também precisa estarmuitocuidado se você tiver duas versões do PHP instaladas no mesmo host. Eu garantiria que aquele que você não deseja foi completamente removido antes de tentar instalar o novo.

A menos que você precise explicitamente de um soquete TCP, sugiro usar o soquete de domínio Unix. Embora localhost seja significativamente mais rápido que um endereço vinculado a uma interface física e tenha vantagens de segurança implícitas, os soquetes Unix são ainda mais rápidos.

Responder2

Talvez minha pergunta não tenha sido clara, não sou administrador de sistema, então não está tão claro para mim como provavelmente deveria. No entanto, a leitura da resposta do @symcbean deixou claro para mim que mudar para um soquete UNIX não deveria ser a raiz do problema - que foi o que presumi ao escrever minha pergunta. Então, decidi seguir esse caminho e lidar com tudo o que apareceu no meu caminho.

Aqui estão as edições que fiz para mudar para outra versão do PHP e, como bônus adicional, descobri como tornar mais fácil alternar entre versões do PHP no Nginx:

Alterei o fastcgi_passparâmetro /etc/nginx/sites-enabled/daan.confpara /var/run/php/php-fpm.sock.

Alterei o listenparâmetro /etc/php8.1/fpm/pool.d/www.confpara o mesmo valor. Eu fiz o mesmo para /etc/php8.2/fpm/pool.d/www.confe /etc/php8.0/fpm/pool.d/www.conf.

Agora, ao executar o sudo update-alternatives --config php, o php-fpm.sockarquivo se torna um link simbólico para a versão escolhida do PHP, que o PHP FPM e o Nginx escutam.

Depois disso (e esta parte provavelmente causou o erro Bad Gateway que mencionei na minha pergunta anterior), é importante reiniciar corretamente o Nginx e o PHP-FPM (copiei e modifiquei este script deaqui):

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

Agora funciona.

informação relacionada