Nginx中fastcgi_pass指向TCP套接字时如何切换PHP版本
看起来你已经折腾了好一会儿啦——用TCP套接字的时候切换PHP版本,和咱们常见的Unix Socket方式确实有点不一样,别着急,咱们一步步把问题解决掉:
核心问题先搞懂
你现在的问题出在两个PHP-FPM版本用了同一个TCP端口:PHP8.2-FPM在监听127.0.0.1:9250,而你把PHP8.1-FPM的listen也设成了同一个端口,这会导致要么8.1-FPM启动失败(端口被占),要么Nginx还是连的8.2-FPM。每个PHP-FPM版本必须用独立的端口或者Socket,不能冲突。
具体操作步骤
修改PHP8.1-FPM的监听端口
打开PHP8.1的FPM配置文件:sudo nano /etc/php/8.1/fpm/pool.d/www.conf
找到listen = 127.0.0.1:9250这一行,把端口改成一个没被占用的,比如listen = 127.0.0.1:9249(只要和8.2的9250不一样就行)。
保存退出后,重启PHP8.1-FPM服务:sudo systemctl restart php8.1-fpm别忘了确认服务正常运行,没报错:
sudo systemctl status php8.1-fpm更新Nginx配置指向新端口
打开你的站点配置文件:sudo nano /etc/nginx/sites-enabled/daan.conf
找到fastcgi_pass 127.0.0.1:9250;这一行,把端口改成刚才给8.1设的127.0.0.1:9249;。验证Nginx配置并重启
先检查配置有没有语法错误:sudo nginx -t如果提示
test is successful,就重启Nginx让配置生效:sudo systemctl reload nginx确认版本切换成功
在你的项目根目录(比如/etc/nginx/development/你的项目名)新建一个info.php文件,内容是:<?php phpinfo(); ?>访问
https://你的项目名.dev.local/info.php,看页面里的PHP版本是不是8.1就搞定啦!
额外说明
- 为什么之前换Unix Socket会报502?大概率是权限问题:Unix Socket文件的属主属组需要和Nginx运行用户(www-data)匹配,或者你没启动PHP8.1-FPM。不过既然你习惯用TCP,咱们先把这个方式搞定就好。
update-alternatives --config php确实只负责切换CLI命令行的PHP版本,FPM是独立的服务,每个版本各自运行,所以这个命令管不到FPM的切换哦。
备注:内容来源于stack exchange,提问作者Daan van den Bergh

