在 CentOS Stream 上搭建 LNMP(Nginx + MySQL/MariaDB + PHP)或 LAMP(Apache + MySQL/MariaDB + PHP),核心痛点不在于“能不能装”,而在于源的选择、版本兼容性以及服务管理的细微差异。CentOS Stream 是滚动更新的发行版,它介于 RHEL 和 Fedora 之间,这意味着它的软件包更新频率比传统的 CentOS Linux 7/8 要高,但也更不稳定。
以下是实操中必须注意的几个关键点,按优先级排序:
1. 源的管理:别直接信默认源
CentOS Stream 的默认 AppStream 仓库虽然包含主流软件,但版本往往滞后于最新稳定版,或者与某些第三方插件不兼容。
- EPEL 是必须的:安装
epel-release。很多非核心组件(如特定版本的 PHP 扩展、监控工具)都在 EPEL 里。-
sudo dnf install epel-release sudo dnf update
-
- PHP 版本选择:不要指望用
dnf install php就能装上你想要的最新版 PHP。默认源里的 PHP 版本通常比较保守(比如 PHP 7.4 或 8.0)。如果你需要 PHP 8.2+,强烈建议使用 Remi Repository。- 配置 Remi 源后,启用特定的模块流:
sudo dnf module list php sudo dnf module enable php:remi-8.2 sudo dnf install php php-fpm php-mysqlnd php-gd php-curl ... - 注意:CentOS Stream 对模块化支持较好,利用
dnf module管理 PHP 版本比手动编译或加 PPA 要干净得多。
- 配置 Remi 源后,启用特定的模块流:
2. Nginx vs Apache:性能与配置的陷阱
如果你选 Nginx (LNMP):
- 权限问题:Nginx 默认以
nginx用户运行,而 PHP-FPM 默认以apache或nginx用户运行。确保两者用户一致,或者正确设置文件权限(chown -R nginx:nginx /var/www/html)。否则你会看到大量的 502 Bad Gateway 错误,日志里全是 Permission denied。 - FastCGI 配置:CentOS Stream 的 Nginx 配置结构可能因版本而异。检查
/etc/nginx/conf.d/default.conf中的fastcgi_pass unix:/run/php-fpm/www.sock;路径是否正确。不同 PHP 版本生成的 socket 路径可能不同。 - SELinux:这是最大的坑。CentOS 系列默认开启 SELinux。如果 Nginx 无法连接后端或读取网站目录,先别急着改代码,检查 SELinux 状态:
getenforce # 如果是 Enforcing,尝试临时设为 Permissive 测试 setenforce 0如果问题解决,说明是 SELinux 策略限制。使用
audit2allow生成自定义策略,而不是直接关闭 SELinux(生产环境严禁关闭)。
如果你选 Apache (LAMP):
- Mod_php 已死:CentOS Stream 不再提供
mod_php作为默认选项。你必须使用php-fpm配合 Apache 的proxy_fcgi模块。- 启用模块:
sudo dnf install mod_php # 或者手动启用 sudo a2enmod proxy_fcgi setenvif sudo a2enconf php-fpm - 配置虚拟主机时,记得指向正确的 FPM 端口或 socket。
- 启用模块:
- MPM 模式:Apache 默认使用 prefork MPM,这在处理高并发时有内存瓶颈。对于现代 Web 应用,建议切换到 event 或 worker MPM,但这需要重新编译或调整配置,且需确保所有 PHP 扩展都线程安全(Thread Safe)。
3. 数据库:MariaDB 还是 MySQL?
CentOS Stream 默认仓库主要提供 MariaDB。MySQL 官方源需要单独添加。
- MariaDB 10.5+:默认安装即可。注意配置文件
/etc/my.cnf.d/server.cnf。 - 字符集:务必在
[mysqld]段落下明确指定:character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci否则中文乱码会让你怀疑人生。
- 权限与安全:CentOS Stream 的 MariaDB 安装包会自动运行
mysql_secure_installation脚本提示吗?不会。你需要手动初始化 root 密码并删除匿名用户。sudo mysql_secure_installation
4. 防火墙与网络
- firewalld:CentOS Stream 默认启用 firewalld。
- 开放端口:
sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https sudo firewall-cmd --reload
- 开放端口:
- 云厂商安全组:别忘了去阿里云/AWS/腾讯云控制台开端口。这是新手最常犯的错——本地能 ping 通,但浏览器打不开,因为云厂商的安全组没放行。
5. 开机自启与服务管理
- systemd 单元文件:确保所有服务都设置为开机自启:
sudo systemctl enable nginx mariadb php-fpm sudo systemctl start nginx mariadb php-fpm - 检查状态:使用
systemctl status <service>查看是否有报错。特别是 PHP-FPM,如果启动失败,日志通常在/var/log/php-fpm/error.log。
6. 常见坑点总结
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | Nginx 连不上 PHP-FPM | 检查 socket 路径是否匹配;检查 PHP-FPM 是否运行;检查 SELinux |
| 403 Forbidden | 权限不足 | 检查 /var/www/html 所有者是否为 nginx 或 apache;检查 SELinux |
| PHP 函数缺失 | 扩展未安装 | 确认安装的 PHP 模块名称(如 php-mbstring 而非 php-mb) |
| 数据库连接拒绝 | 绑定地址限制 | 检查 my.cnf 中 bind-address 是否为 127.0.0.1 或 ::1 |
| 页面显示源码 | 未解析 PHP | Nginx 未配置 fastcgi_pass;Apache 未加载 PHP 模块 |
7. 最后建议
- 备份配置:在安装任何新软件前,复制一份原始配置文件。
- 日志为王:遇到问题,先看日志!
- Nginx:
/var/log/nginx/error.log - Apache:
/var/log/httpd/error_log - PHP-FPM:
/var/log/php-fpm/error.log - MariaDB:
/var/log/mariadb/mariadb.log
- Nginx:
- 考虑容器化:如果你只是为了开发或测试,直接用 Docker 跑 LNMP/LAMP 镜像会更简单、隔离性更好,避免污染系统环境。生产环境如果追求稳定性,建议迁移到 Rocky Linux 或 AlmaLinux(这些是 CentOS 的替代品,基于 RHEL 源码重建,更稳定)。
记住,CentOS Stream 不是为长期静态服务器设计的,它是为快速迭代和测试设计的。如果你的业务需要“设好就不管”的稳定性,请慎重考虑其作为生产主机的角色。
云计算HECS