HCRM博客

CentOS 7双版本PHP-FPM并存配置与systemd管理指南

CentOS 7 php72-php-fpm与php80-php-fpm并存,systemd管理技巧

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

CentOS 7双版本PHP-FPM并存配置与systemd管理指南-图1

先装软件,别急着改配置

系统自带base仓库只有老php,先装SCL源:

yum install -y centos-release-scl

接着把两个版本一次性拉下来:

yum install -y rh-php72-php-fpm rh-php80-php-fpm

装完别急着启动,先确认文件路径:

CentOS 7双版本PHP-FPM并存配置与systemd管理指南-图2

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

CentOS 7双版本PHP-FPM并存配置与systemd管理指南-图3

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 updatesystemctl 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。老业务稳如狗,新站点也能上最新语法,半夜上线再也不用手心冒汗。

本站部分图片及内容来源网络,版权归原作者所有,转载目的为传递知识,不代表本站立场。若侵权或违规联系Email:zjx77377423@163.com 核实后第一时间删除。 转载请注明出处:https://blog.huochengrm.cn/pc/41684.html

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
请登录后评论...
游客游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~