舊專案僅支援 PHP 5.2,新專案需 PHP 5.3+,同一台伺服器需同時運行兩版本,Nginx 根據域名/路徑分發至對應 PHP-FPM。
PHP-FPM 監聽不同端口或 Unix Socket,Nginx fastcgi_pass 指向對應端口/Socket。
# 依賴
yum install -y libxml2-devel openssl-devel bzip2-devel libcurl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel mhash-devel
# 下載並打補丁
wget https://museum.php.net/php5/php-5.2.14.tar.gz
wget https://php-fpm.org/downloads/php-5.2.14-fpm-0.5.14.diff.gz
tar zxf php-5.2.14.tar.gz
gzip -cd php-5.2.14-fpm-0.5.14.diff.gz | patch -d php-5.2.14 -p1
# 編譯(需 autoconf 2.13)
cd php-5.2.14
export PHP_AUTOCONF=/usr/local/autoconf-2.13/bin/autoconf
export PHP_AUTOHEADER=/usr/local/autoconf-2.13/bin/autoheader
./buildconf --force
./configure --prefix=/usr/local/php-5.2.14 \
--with-config-file-path=/usr/local/php-5.2.14/etc \
--with-mysql=/usr/local/mysql \
--with-mysqli=/usr/local/mysql/bin/mysql_config \
--enable-fastcgi --enable-fpm \
--with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir \
--with-zlib --with-curl --with-mcrypt --enable-mbstring --enable-zip
make ZEND_EXTRA_LIBS='-liconv' && make install
127.0.0.1:9001 0
/usr/local/php-5.2.14/sbin/php-fpm start # 加入 /etc/rc.local 或 systemd 服務單元
# 站點 A:需 PHP 5.2
server {
listen 80;
server_name legacy.example.com;
root /www/legacy;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9001; # PHP 5.2
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
# 站點 B:PHP 5.3/5.4/7.x (主版本,監聽 9000)
server {
listen 80;
server_name modern.example.com;
root /www/modern;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000; # 主 PHP-FPM
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
curl -H "Host: legacy.example.com" https://127.0.0.1/phpinfo.php curl -H "Host: modern.example.com" https://127.0.0.1/phpinfo.php
/tmp/php-5.2.14.sock
fastcgi_pass unix:/tmp/php-5.2.14.sock;
| 問題 | 解決 |
|---|---|
PHP 5.2 編譯報錯 iconv | make ZEND_EXTRA_LIBS='-liconv' |
| php-fpm 無法啟動 | 檢查 php-fpm.conf pid_file 路徑、用戶組權限 |
| Nginx 502 Bad Gateway | 確認 fastcgi_pass 端口/Socket 正確、php-frm 進程存活、防火牆 |
| session 衝突 | 不同版本設定不同 session.save_path 或前綴 |
多 PHP 版本共存 = 多 PHP-FPM 實例 + Nginx 分發。關鍵步驟:獨立編譯安裝目錄、獨立 php.ini/php-fpm.conf、獨立監聽端口/Socket、Nginx 按站點指向對應端口。現代部署建議改用 Docker 容器隔離,更乾淨可遷移。