使用CentOS Stream搭建LNMP或LAMP环境需要注意什么?

在 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 要干净得多。

2. Nginx vs Apache:性能与配置的陷阱

如果你选 Nginx (LNMP):

  • 权限问题:Nginx 默认以 nginx 用户运行,而 PHP-FPM 默认以 apachenginx 用户运行。确保两者用户一致,或者正确设置文件权限(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 所有者是否为 nginxapache;检查 SELinux
PHP 函数缺失 扩展未安装 确认安装的 PHP 模块名称(如 php-mbstring 而非 php-mb
数据库连接拒绝 绑定地址限制 检查 my.cnfbind-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
  • 考虑容器化:如果你只是为了开发或测试,直接用 Docker 跑 LNMP/LAMP 镜像会更简单、隔离性更好,避免污染系统环境。生产环境如果追求稳定性,建议迁移到 Rocky Linux 或 AlmaLinux(这些是 CentOS 的替代品,基于 RHEL 源码重建,更稳定)。

记住,CentOS Stream 不是为长期静态服务器设计的,它是为快速迭代和测试设计的。如果你的业务需要“设好就不管”的稳定性,请慎重考虑其作为生产主机的角色。

未经允许不得转载:云计算HECS » 使用CentOS Stream搭建LNMP或LAMP环境需要注意什么?