CentOS 7 php72-php-fpm与php80-php-fpm并存,systemd管理技巧
老机器上跑着CentOS 7,业务代码还黏在php72,新站点又必须用php80,两边都不想动,还要systemd一把梭。很多人直接编译,结果升级时手一抖,老池子起不来,新站点也挂,回滚半小时。下面把最小改动、零编译、纯yum的方案拆成五步,照着敲,十分钟后两个版本并肩跑,systemd还能独立启停、自启、看日志。

先装软件,别急着改配置
系统自带base仓库只有老php,先装SCL源:
yum install -y centos-release-scl
接着把两个版本一次性拉下来:
yum install -y rh-php72-php-fpm rh-php80-php-fpm
装完别急着启动,先确认文件路径:

ls /opt/rh/rh-php72/root/usr/sbin/php-fpm
ls /opt/rh/rh-php80/root/usr/sbin/php-fpm
两条命令都有回显,说明二进制已经就位,下一步让systemd认得它们。
给php-fpm造独立unit,避免名字冲突
SCL包自带模板,但默认服务名叫php-fpm,只能跑一个版本。复制两份unit,改名最干脆:
cp /usr/lib/systemd/system/rh-php72-php-fpm.service /etc/systemd/system/php72-fpm.service

cp /usr/lib/systemd/system/rh-php80-php-fpm.service /etc/systemd/system/php80-fpm.service
打开php72-fpm.service,把里面所有%{scl_prefix}替换成实际路径,防止启动时找不到sock。php80那一份同理。改完重载:
systemctl daemon-reload
此时执行systemctl status php72-fpm已经能看到加载状态,说明systemd没报语法错。
端口与sock分离,别让池子抢地盘
两个版本默认都想监听/run/php-fpm/www.sock,同时启动必打架。先把php72的池子改端口:
编辑/etc/opt/rh/rh-php72/php-fpm.d/www.conf
改三行:
listen = 127.0.0.1:9072
listen.owner = apache
listen.group = apache
php80那份改另一个端口:
编辑/etc/opt/rh/rh-php80/php-fpm.d/www.conf
listen = 127.0.0.1:9080
listen.owner = apache
listen.group = apache
如果站点在同一台机器,nginx配upstream时写fastcgi_pass 127.0.0.1:9072;或9080就能精准分流。sock方案也行,只要路径不同,但端口最直观,防火墙策略也省心。
systemd自启与日志轮询一次配完
老系统最怕断电重启后池子没起来,把两服务都写进启动目标:
systemctl enable php72-fpm php80-fpm
日志默认走journald,想看独立文件,给每个unit加一行:
在[Service]段追加:
StandardOutput=append:/var/log/php72-fpm/access.log
StandardError=append:/var/log/php72-fpm/error.log
php80同理。目录提前建,权限给apache,防止SELinux拦截。之后用logrotate按日切,再也不怕日志炸根分区。
日常运维三板斧:启停、看状态、热重载
独立unit后,操作粒度细化到版本:
启72:systemctl start php72-fpm
启80:systemctl start php80-fpm
看内存:systemctl show php80-fpm --property MemoryCurrent
平滑重载配置:systemctl reload php80-fpm
reload信号只重读池子配置,正在处理的请求不会断,线上环境比restart稳妥得多。升级php80小版本后,也只要yum update再systemctl reload,一分钟收工。
常见坑速查表
1. SELinux拦sock:用setsebool -p httpdcannetwork_connect 1,或者给自定义端口打标签。
2. nginx报502:多半是listen.owner与nginx运行用户不一致,改统一即可。
3. 启动报can't bind address:端口被旧unit占用,systemctl stop rh-php72-php-fpm再禁用原模板。
4. 升级后扩展消失:SCL的扩展也在/opt/rh/下,记得装rh-php80-php-mysqlnd这类对应包。
5. 内存飙高:把池子模式从static换成dynamic,pm.max_children按机器内存给上限,留20%缓冲。
CentOS 7上让php72-php-fpm与php80-php-fpm并存,其实不需要编译,也不动系统默认php。用SCL源、复制unit、改监听、加自启,四条命令就能让两个版本各跑各的,systemd还能单独reload。老业务稳如狗,新站点也能上最新语法,半夜上线再也不用手心冒汗。
