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

質問が少し混乱しています。少なくとも 3 つの構成 (ネットワーク ソケットを使用した 8.2、ネットワーク ソケットを使用した 8.1、ネットワーク ソケットを使用した 8.1) があり、構成の 1 つに対する nginx conf のみがあり、php-fpm 構成をどのように変更したかについての詳細がありません。

UNIXソケットに変更しようとしましたが、502 Bad Gatewayエラーが発生しました

サーバーはクライアントが接続しようとしている場所で待機している必要があります。Unix ドメイン ソケットのもう 1 つの複雑な点は (TCP ソケットと比較して)、ファイルに所有者とグループ (通常は Web サーバーが実行される uid と同じ所有者) が必要であることです (例: www.conf)。

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

あなたもそうする必要がありますとても同じホストに PHP の 2 つのバージョンがインストールされている場合は注意してください。新しいバージョンをインストールする前に、不要なバージョンが完全に削除されていることを確認してください。

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 phpphp-fpm.sockファイルは選択した PHP バージョンへのシンボリックリンクになり、PHP FPM と Nginx の両方がそれをリッスンするようになります。

その後(そしてこの部分がおそらく私が先ほど質問したBad Gatewayエラーの原因です)、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

今は動作します。

関連情報