fastcgi_pass가 TCP 소켓을 가리키는 경우 Nginx에서 PHP 버전을 전환하는 방법

fastcgi_pass가 TCP 소켓을 가리키는 경우 Nginx에서 PHP 버전을 전환하는 방법

내 질문은 간단합니다.

인터넷 어디에서나 Nginx에서 PHP 버전을 변경하려면 fastcgi_pass매개변수의 UNIX 소켓을 변경해야 한다는 내용을 읽었습니다. 하지만 내 fastcgi_pass매개변수는 TCP 소켓을 가리키고 있습니다 127.0.0.1:9250. UNIX 소켓으로 변경하려고 시도했지만 이로 인해 502 Bad Gateway 오류가 발생했고 거기서부터 계속하는 방법을 몰랐습니다.

현재 PHP 8.2를 실행하고 있는데 PHP 8.1이 필요합니다. 나는 그것을 사용하여 설치했으며 apt-get를 수행할 때 나열됩니다 sudo update-alternatives --list php. 접근 방식 을 시도했지만 sudo update-alternatives이는 CLI의 PHP 버전만 변경합니다. FPM이 아닙니다.

내 nginx 구성은 매우 간단합니다.

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

의 Listen 매개변수는 etc/php/8.2/fpm/pool.d/www.conf동일한 TCP 소켓을 가리킵니다 127.0.0.1:9250.

편집하다:요청한 대로 에서 변경한 내용은 다음과 같습니다 /etc/php/8.1/fpm/pool.d/www.conf. 이러한 편집 내용은 에서도 동일합니다 /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

답변1

귀하의 질문은 약간 혼란 스럽습니다. 구성 중 하나에 대한 nginx conf 만 3 개 이상의 구성 (네트워크 소켓이있는 8.2, 네트워크 소켓이있는 8.1, 네트워크 소켓이있는 8.1)이 있고 php-fpm 구성을 변경한 방법에 대한 세부 정보는 없습니다. .

UNIX 소켓으로 변경하려고 시도했지만 502 잘못된 게이트웨이 오류가 발생했습니다.

클라이언트가 연결을 시도하는 곳에서 서버가 수신 대기해야 합니다. Unix 도메인 소켓(TCP 소켓과 비교)의 추가적인 복잡성은 파일에 소유자와 그룹(일반적으로 웹 서버가 실행하는 uid와 동일한 소유자)이 있어야 한다는 것입니다(예: www.conf).

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

당신은 또한매우동일한 호스트에 두 가지 버전의 PHP가 설치되어 있으면 주의하십시오. 새 것을 설치하기 전에 원하지 않는 것이 완전히 제거되었는지 확인하겠습니다.

TCP 소켓이 명시적으로 필요하지 않은 한 Unix 도메인 소켓을 사용하는 것이 좋습니다. localhost는 물리적 인터페이스에 바인딩된 주소보다 훨씬 빠르고 암묵적인 보안 이점도 있지만 Unix 소켓은 여전히 ​​더 빠릅니다.

답변2

아마도 제 질문이 명확하지 않았을 것입니다. 저는 시스템 관리자가 아니기 때문에 아마도 필요한 만큼 명확하지 않을 것입니다. 그러나 @symcbean의 답변을 읽으면서 UNIX 소켓으로 전환하는 것이 문제의 근본 원인이 되어서는 안 된다는 것이 분명해졌습니다. 이는 제가 질문을 작성할 때 가정했던 것입니다. 그래서 나는 그 길을 가고 내 길에 닥친 모든 일을 처리하기로 결정했습니다.

다음은 다른 PHP 버전으로 전환하기 위해 편집한 내용입니다. 추가 보너스로 Nginx에서 PHP 버전 간에 쉽게 전환하는 방법을 알아냈습니다.

매개변수 를 로 fastcgi_pass변경 했습니다 ./etc/nginx/sites-enabled/daan.conf/var/run/php/php-fpm.sock

listen매개변수를 /etc/php8.1/fpm/pool.d/www.conf동일한 값으로 변경했습니다 . 나는 /etc/php8.2/fpm/pool.d/www.conf및 에 대해서도 동일한 작업을 수행했습니다 /etc/php8.0/fpm/pool.d/www.conf.

이제 를 실행하면 sudo update-alternatives --config php파일 php-fpm.sock은 PHP FPM과 Nginx가 모두 수신하는 선택한 PHP 버전에 대한 심볼릭 링크가 됩니다.

그 후(그리고 이 부분으로 인해 이전 질문에서 언급한 잘못된 게이트웨이 오류가 발생했을 수 있음) Nginx와 PHP-FPM을 올바르게 다시 시작하는 것이 중요합니다.여기):

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

이제 작동합니다.

관련 정보