2026年9月9日

2026年9月9日

VPSで複数のPHPバージョンを共存させる方法(PHP-FPMをサイトごとに切り替え)

1台の VPS で複数のサイトを動かしていると、「新しいサイトは新しい PHP で動かしたいが、古いサイトは古い版でしか動かない」という場面があります。PHP-FPM を使えば、版ごとに別のプロセスを動かし、Web サーバーの設定でサイトごとに使う版を選べます。

この記事では、Ubuntu 24.04 の VPS に PHP 8.2 と 8.4 を入れ、Nginx または Apache でサイトごとに振り分ける手順を説明します(2026年10月時点。手順は Ubuntu 24.04 のコンテナで動作を確認しています)。

先に知っておくこと

振り分けの仕組み

  • PHP-FPM は版ごとに別のサービス(php8.2-fpm、php8.4-fpm)として動き、それぞれが別のソケット(/run/php/php8.2-fpm.sock など)で待ち受けます。
  • Web サーバーは、サイトごとに「どのソケットに PHP の処理を渡すか」を設定します。これで、サイト A は 8.2、サイト B は 8.4、というように分けられます。
  • コマンドラインの php(WP-CLI や cron で使うもの)は、Web サーバーとは別に切り替えます。

ファイルの拡張子(.php81 など)で版を分ける方法や、開発用の phpenv で切り替える方法は、本番の Web サイトには向きません。

PHP の各版のサポート期限

PHP の公式サイト(php.net の Supported Versions)によると、2026年10月時点のサポート期限は次のとおりです。

版 セキュリティ修正の期限
PHP 8.2 2026年12月31日
PHP 8.3 2027年12月31日
PHP 8.4 2028年12月31日
PHP 8.5 2029年12月31日

WordPress の推奨は PHP 8.3 以上です(wordpress.org の要件ページ、2026年10月時点)。古い版の共存は、古いサイトを新しい版に移すまでのつなぎと考え、期限が切れる前に移行を進めます。

手順1: 複数の版の PHP を入れる

Ubuntu 24.04 の標準のリポジトリにある PHP は 8.3 だけです。ほかの版は、Ondřej Surý 氏が配布しているパッケージ(PPA)から入れるのが一般的です。Ubuntu 公式のものではない外部のリポジトリである点を理解したうえで使います。

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update

Debian の場合は、同じ配布元の packages.sury.org を使います。追加の手順は https://packages.sury.org/php/README.txt に書かれています。なお PPA のページには、2026年10月時点で PPA を packages.sury.org に統合していく方針が書かれているので、導入時に案内を確認してください。

使う版の PHP-FPM と、WordPress でよく使う拡張を入れます。拡張は版ごとに入れる必要があります。

# PHP 8.4(新しいサイト用)
sudo apt install php8.4-fpm php8.4-mysql php8.4-curl php8.4-gd php8.4-intl \
  php8.4-mbstring php8.4-xml php8.4-zip

# PHP 8.2(古いサイト用)
sudo apt install php8.2-fpm php8.2-mysql php8.2-curl php8.2-gd php8.2-intl \
  php8.2-mbstring php8.2-xml php8.2-zip

両方の PHP-FPM が動いていて、ソケットができていることを確認します。

systemctl status php8.2-fpm php8.4-fpm --no-pager
ls /run/php/
# php8.2-fpm.sock  php8.4-fpm.sock などが表示される

設定ファイルも版ごとに分かれています(/etc/php/8.2/fpm/php.ini、/etc/php/8.4/fpm/php.ini など)。upload_max_filesize や memory_limit を変えるときは、そのサイトが使う版のファイルを編集し、その版の PHP-FPM を再起動します。

手順2a: Nginx でサイトごとに版を指定する

Nginx では、サイトごとの server ブロックの fastcgi_pass に、使う版のソケットを書きます。

# /etc/nginx/sites-available/old.example.com(PHP 8.2 で動かすサイト)
server {
    listen 80;
    server_name old.example.com;
    root /var/www/old;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }
}

PHP 8.4 で動かすサイトでは、fastcgi_pass unix:/run/php/php8.4-fpm.sock; にします。設定を有効にして、構文を確かめてから読み込み直します。

sudo ln -s /etc/nginx/sites-available/old.example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

手順2b: Apache でサイトごとに版を指定する

Apache では、mod_php ではなく PHP-FPM に処理を渡すモジュールを有効にし、VirtualHost ごとに SetHandler でソケットを指定します。

sudo a2enmod proxy_fcgi setenvif
# /etc/apache2/sites-available/old.example.com.conf(PHP 8.2 で動かすサイト)
<VirtualHost *:80>
    ServerName old.example.com
    DocumentRoot /var/www/old

    <FilesMatch "\.php$">
        SetHandler "proxy:unix:/run/php/php8.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

PHP 8.4 のサイトでは、ソケットを /run/php/php8.4-fpm.sock にします。設定を有効にして、構文を確かめてから読み込み直します。

sudo a2ensite old.example.com
sudo apache2ctl configtest
sudo systemctl reload apache2
  • a2enconf php8.4-fpm を実行すると、サーバー全体の既定の版が決まります。VirtualHost の中に SetHandler を書いたサイトは、そちらが優先されます。
  • libapache2-mod-php8.x(mod_php)が入っていて有効な場合は、PHP-FPM に渡らないことがあります。a2dismod php8.3 のように無効にします。

手順3(任意): サイトごとに PHP-FPM のプールを分ける

標準の www プールは、全サイトが同じユーザー(www-data)で動きます。サイトごとに別のユーザーで動かしたい場合は、プールを追加します。

; /etc/php/8.2/fpm/pool.d/oldsite.conf
[oldsite]
user = oldsite
group = oldsite
listen = /run/php/php8.2-oldsite.sock
listen.owner = www-data
listen.group = www-data
pm = ondemand
pm.max_children = 5

oldsite ユーザーを作り(sudo useradd -r oldsite)、サイトのファイルをそのユーザーが読めるようにしてから、sudo php-fpm8.2 -t で設定を確かめ、sudo systemctl restart php8.2-fpm で反映します。Web サーバーの設定のソケットは /run/php/php8.2-oldsite.sock に変えます。

手順4: コマンドラインの php と WP-CLI の版

コマンドラインの php がどの版を指すかは、update-alternatives で決まります。

# 入っている版の一覧
update-alternatives --list php

# 既定の php を 8.4 にする
sudo update-alternatives --set php /usr/bin/php8.4
php -v

# 版を指定して実行する
php8.2 -v

WP-CLI(/usr/local/bin/wp に置いた場合)を特定の版で動かすには、版を指定した php から実行します。

cd /var/www/old
php8.2 /usr/local/bin/wp core version

cron で WordPress のコマンドや PHP のスクリプトを動かしている場合も、php8.2 のように版を明記しておくと、既定の版を変えたときに影響を受けません。

手順5: サイトごとの版を確認する

WordPress の管理画面で「ツール」→「サイトヘルス」→「情報」タブを開き、「サーバー」の項目で PHP のバージョンを確認します。サイトごとに、意図した版になっていることを確かめます。

うまく動かない場合は、次を確認します。

  • 502 Bad Gateway(Nginx)や 503 Service Unavailable(Apache): 指定したソケットのパスが正しいか、その版の PHP-FPM が動いているか(ls /run/php/、systemctl status php8.2-fpm)
  • WordPress が「MySQL 拡張を利用できない」という趣旨のエラーを出す、画像の処理ができない: その版の拡張(例: php8.2-mysql、php8.2-gd)を入れたか
  • PHP-FPM のエラーログ: /var/log/php8.2-fpm.log など

古い版を片付ける

古いサイトを新しい版に移し終えたら、使わなくなった版を削除します。どのサイトもその版のソケットを使っていないことを確認してから行います。

grep -rn "php8.2" /etc/nginx/ /etc/apache2/ 2>/dev/null
sudo apt purge 'php8.2-*'
sudo apt autoremove

まとめ

  • 複数の版の PHP-FPM を入れると、版ごとに別のサービスとソケットで動く
  • Nginx は fastcgi_pass、Apache は VirtualHost 内の SetHandler で、サイトごとに使うソケット(版)を指定する
  • 拡張と php.ini は版ごとに別。設定を変えたらその版の PHP-FPM を再起動する
  • コマンドラインは update-alternatives で既定の版を決め、WP-CLI や cron は php8.2 のように版を明記する
  • PHP 8.2 のセキュリティ修正は 2026年12月31日まで。古い版の共存は移行までのつなぎにする

関連記事

お気軽にご相談ください

お見積りへ お問い合わせへ
▲