centos 安装 php74 和 php82 及与 nginx 集成
以下基本是 chatgpt 帮助下完成的,中途遇到的问题记录一下。
2024/12/31 已用于业务半年余
安装 php
添加 Remi 存储库:
到 rpms.remirepo.net/enterprise 找到与 centos 版本对应的存储库:
[root@VM-0-10-opencloudos shm]# cat /etc/redhat-release
OpenCloudOS release 8.8.2305 (Core)
yum install -y https://rpms.remirepo.net/enterprise/remi-release-8.8.rpm
启用所需版本的 Remi 存储库:
yum-config-manager --enable remi-php82
yum-config-manager --enable remi-php74
安装 PHP 8.2 和 PHP 7.4:
yum install php82 php82-php-cli php82-php-fpm
yum install php74 php74-php-cli php74-php-fpm
如果需要连接 msyql,安装 mysql 客户端扩展
yum install php82-php-mysqlnd
配置 PHP:
ln -s /usr/bin/php82 /usr/local/bin/php82
ln -s /usr/bin/php74 /usr/local/bin/php74
启动 PHP-FPM 服务:
systemctl start php82-php-fpm
systemctl start php74-php-fpm
确认 PHP 版本
php82 -v
php74 -v
配置 php-fpm
nginx 的配置示例:
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
#fastcgi_pass unix:/path/to/php-cgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi_params;
}
fastcgi_pass 允许 tcp 或者 unix 地址,在 php-fpm
配置文件(/etc/opt/remi/php版本/)中配置。
# UNIX 套接字
listen = /dev/shm/php-cgi.sock
# IP 地址和端口,多版本要改成不同的
# listen = 127.0.0.1:9000
ip:port
和 unix:/path/php-cgi.sock
配置一个就可以了。区别:
- IP 地址和端口方式适用于网络通信,可以在不同的主机上进行通信,但可能会产生一些网络开销。
- UNIX 套接字方式适用于本地通信,仅在同一台物理服务器上进行通信,速度更快,因为不需要经过网络传输。
配置示例:
listen = 127.0.0.1:9000
;listen = /dev/shm/php-cgi.sock
或
;listen = 127.0.0.1:9000
listen = /dev/shm/php-cgi.sock
以上无论是端口还是 unix 方式,都要注意不要和已运行的 php 冲突。
我们重点使用下 UNIX 套接字方式.
/dev/shm 是 Linux 系统中的一个特殊目录,通常用于共享内存。它是一个临时文件系统,意味着其内容通常存储在系统的内存中而不是硬盘上,这样可以提高访问速度。
web 访问 php 文件可能会报错: connect() to unix:/dev/shm/php-cgi.sock failed (13: Permission denied) while connecting to upstream
这是因为 nginx 的用户去读写 .sock
文件没有权限。
假设 nginx 的用户为 www,那么 php-fpm 如下配置(二选一):
- listen.owner、listen.group
listen.owner = www listen.group = www
listen.owner、listen.group 是设置unix套接字的权限(如果使用了),为了允许来自web服务器的连接,必须设置权限。
也就是说,如果选择了 listen = /dev/shm/php-cgi.sock
unix 套接字的通信方式,则须设置 listen.owner、listen.group
,即套接字文件的所有者和所属组,和 nginx 用户保持一致,否则 nginx 没有权限访问 .lock
文件。
- 如果 php-fpm 配置文件中有
listen.acl_users
项代表支持 acl 功能,以下配置与 listen.owner、listen.group 二选一listen.acl_users = www ;listen.acl_groups =
通常情况下,PHP-FPM 会监听一个 Unix 套接字或 TCP 地址以接受来自 web 服务器(如 Nginx、Apache 等)的请求。listen.acl_users 允许你指定一组用户或组,这些用户或组可以连接到 PHP-FPM 服务器,而其他用户则被拒绝。如果设置了它,listen. owner and listen. group 将被忽略。
php-fpm 完整配置参考:
[www]
listen = /dev/shm/php-cgi.sock
listen.allowed_clients = 127.0.0.1
;user 和 group 是 php-fpm 进程运行的用户和用户组,为了减少安全风险,通常不应该以 root 用户身份运行。
user = www
group = www
listen.owner = www
listen.group = www
;listen.mode = 0660
;listen.acl_users = www
;listen.acl_groups =
配置后 php-cgi.sock
的用户和用户组为 www
或
[www]
listen = /dev/shm/php-cgi.sock
listen.allowed_clients = 127.0.0.1
;user 和 group 是 php-fpm 进程运行的用户和用户组,为了减少安全风险,通常不应该以 root 用户身份运行。
user = www
group = www
;listen.owner = www
;listen.group = www
;listen.mode = 0660
listen.acl_users = www
;listen.acl_groups =
配置后 php-cgi.sock
的用户和用户组为 root,但 nginx 仍能与之通信。
到此,web 服务器就可以运行了。
本作品采用《CC 协议》,转载必须注明作者和本文链接
不用在nginx里指定php版本吗,两个php都监听听9000端口?