Ubuntu環境におけるPHP 5.4からPHP 5.3へのダウングレード手順

近年リリースされたUbuntuのバージョン(例: 12.10以降)では、デフォルトのパッケージリポジトリに含まれるPHPのバージョンがPHP 5.4以降となっています。しかし、既存のWebアプリケーションやフレームワークによっては、PHP 5.4環境での互換性の問題が発生し、PHP 5.3へのダウングレードが必要となる場合があります。本記事では、NginxとPHP-FPMを利用している環境を想定し、PHP 5.4からPHP 5.3へ安全にダウングレードする具体的な手順を解説します。

1. PHP 5.3ダウングレード用スクリプトの準備

まず、PHP 5.3のパッケージをUbuntu 12.04 LTS (Precise Pangolin) のリポジトリから取得し、既存のPHP 5.4パッケージを置き換えるためのシェルスクリプトを作成します。このスクリプトは、APTパッケージ管理システムの設定を一時的に変更し、古いPHPバージョンをインストールすることを可能にします。

以下の内容で downgrade_php53.sh という名前のファイルを作成してください。

#!/bin/bash

# スクリプトの実行にはroot権限が必要です
if [[ $EUID -ne 0 ]]; then
   echo "エラー: このスクリプトはroot権限で実行する必要があります。"
   echo "例: sudo ./downgrade_php53.sh"
   exit 1
fi

echo "システムを更新し、aptitudeをインストールします (もし未インストールの場合)。"
apt-get update
apt-get install -y aptitude
aptitude update
aptitude -f install

echo "既存のPHPパッケージをリストアップし、削除します。"
# 現在インストールされているPHP関連パッケージをすべて取得
INSTALLED_PHP_PACKAGES=$(dpkg -l | grep php | awk '{print $2}')

if [ -z "$INSTALLED_PHP_PACKAGES" ]; then
    echo "インストールされているPHPパッケージが見つかりませんでした。続行します。"
else
    echo "以下のPHPパッケージを削除します: $INSTALLED_PHP_PACKAGES"
    aptitude remove --assume-yes $INSTALLED_PHP_PACKAGES
fi

echo "PHPパッケージをPreciseリポジトリから取得するためのAPT優先度を設定します。"
# /etc/apt/preferences.d/php5_3 に優先度設定ファイルを作成
PREFERENCES_FILE="/etc/apt/preferences.d/php5_3_for_downgrade"
echo "" > $PREFERENCES_FILE
for pkg in $INSTALLED_PHP_PACKAGES; do
    echo "Package: $pkg
Pin: release a=precise
Pin-Priority: 991
" >> $PREFERENCES_FILE
done
echo "APT優先度設定ファイル '$PREFERENCES_FILE' を作成しました。"

echo "PHP 5.3を取得するために必要なPreciseリポジトリをsources.list.dに追加します。"
# Preciseリポジトリの情報を追加
SOURCES_LIST_FILE="/etc/apt/sources.list.d/precise_for_php53.list"
echo "# PHP 5.3をPreciseリポジトリから取得するために追加
deb http://archive.ubuntu.com/ubuntu precise main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu precise-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu precise-security main restricted universe multiverse
" > $SOURCES_LIST_FILE
echo "Preciseリポジトリ情報ファイル '$SOURCES_LIST_FILE' を作成しました。"

echo "APTパッケージリストを更新します。"
aptitude update

echo "PHP 5.3パッケージをPreciseリポジトリからインストールします。"
# aptitudeの-tオプションでPreciseリポジトリを指定してインストール
aptitude -t precise install --assume-yes $INSTALLED_PHP_PACKAGES

echo "PHP 5.3のダウングレードプロセスが完了しました。"

2. スクリプトの実行

作成したスクリプトに実行権限を付与し、rootユーザーで実行します。

chmod +x downgrade_php53.sh
sudo ./downgrade_php53.sh

スクリプトの実行が完了したら、PHP-FPMとNginxサービスを再起動して、新しいPHPバージョンが適用されるようにします。

sudo service php5-fpm restart
sudo service nginx restart

3. PHP-FPMソケット接続の問題への対処

上記のステップ後、Webサイトにアクセスすると「502 Bad Gateway」エラーが発生する場合があります。Nginxのエラーログを確認すると、以下のようなメッセージが表示されることがあります。

2013/08/05 20:17:10 [crit] 16107#0: *7 connect() to unix:/var/run/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET /phpinfo.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php5-fpm.sock:", host: "127.0.0.1"

このエラーは、NginxがPHP-FPMとの通信にUnixソケット /var/run/php5-fpm.sock を利用しようとしている一方で、PHP 5.3のPHP-FPM設定がデフォルトでTCPポート(例: 127.0.0.1:9000)でのリッスンになっている場合に発生します。

Nginxの設定が以下のようにUnixソケットを使用していることを確認してください。

location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # PHP-FPMとの通信にUnixソケットを使用
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
}

この問題を解決するには、PHP-FPMのプール設定ファイル /etc/php5/fpm/pool.d/www.conf を編集し、Unixソケットでリッスンするように設定を変更します。

sudo vim /etc/php5/fpm/pool.d/www.conf

ファイル内で、listen ディレクティブを探し、以下のようにUnixソケットのパスを追記、またはコメントアウトを解除します。

; TCPポートでリッスンする場合
;listen = 127.0.0.1:9000

; Unixソケットでリッスンする場合(Nginxと合わせる)
listen = /var/run/php5-fpm.sock

変更を保存した後、再度PHP-FPMサービスを再起動します。

sudo service php5-fpm restart

これにより、NginxとPHP-FPM間の通信が正常に行われるようになり、「502 Bad Gateway」エラーが解消されるはずです。

タグ: Ubuntu PHP5.3 PHP5.4 ダウングレード APT

10月10日 06:01 投稿