服务器:
fe1.web.bj1.luomor.com,系统 CentOS Stream 10,目标搭建一套支持老项目(依赖 MySQL5.6)的 LNMP 环境,全程记录遇到的报错、原因和最终解决方案。
前言
CentOS Stream 10 和老 CentOS7 差异很大:包源、默认组件、安全策略都变了。很多传统教程不能直接照搬,尤其没有原生 MySQL5.6 包,官方 Redis 替换成 Valkey,Nginx 新版语法变更,再加上容器网桥 IP 权限坑,踩了一连串问题,整理成文方便后续复用。
一、基础主机名设置
# 永久设置主机名
hostnamectl set-hostname fe1.web.bj1.luomor.com
# 同步hosts,避免sudo告警
vi /etc/hosts
127.0.0.1 fe1.web.bj1.luomor.com fe1
# 刷新shell
exec bash
二、数据库选型:两条路线 MySQL / MariaDB
Stream10 官方源自带 MariaDB,没有 Oracle MySQL。
路线 A:MariaDB(兼容 MySQL 协议,新项目推荐)
dnf install -y mariadb-server mariadb
systemctl enable --now mariadb
mariadb-secure-installation
路线 B:原版 MySQL 8.4 LTS(Oracle 官方源)
MySQL8.0 已经 EOL,Stream10 使用 el10 源,不能用 el9 包。
# 添加官方源
dnf install -y https://repo.mysql.com/mysql84-community-release-el10-1.noarch.rpm
dnf install -y mysql-community-server
systemctl enable --now mysqld
# 获取初始密码
grep 'temporary password' /var/log/mysqld.log
踩坑 1:ERROR 1819 密码策略不满足
MySQL8.x 默认密码策略 MEDIUM,要求长度≥8,大小写 + 数字 + 特殊符号。
- 生产:直接使用强密码;
- 内网测试可临时关闭密码校验组件:
UNINSTALL COMPONENT 'file://component_validate_password';
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的密码';
踩坑 2:需要 MySQL5.6(重点!)
CentOS Stream10 没有原生 MySQL5.6 RPM,glibc/openssl 版本不兼容,不能直接 yum 安装。 ✅ 最优方案:Podman 容器运行 mysql:5.6(放弃 Docker,Stream10 原生 Podman 更稳定)
# 安装podman
dnf install -y podman
坑点:默认桥模式下,容器访问源 IP 是网桥网关(172.17.0.1 / 172.18.0.1),不是宿主机 127.0.0.1,会报 Host not allowed。 根治方案:使用
--network=host宿主机网络模式
停止旧容器,host 网络启动 MySQL5.6:
podman stop mysql56
podman rm mysql56
podman run -d \
--name mysql56 \
--restart=always \
--network=host \
-e MYSQL_ROOT_PASSWORD='Luomor@2026' \
-v /data/mysql56:/var/lib/mysql \
mysql:5.6
host 模式后,PHP 连接 127.0.0.1:3306,来源 IP 就是本机,直接复用 xxx@127.0.0.1 账号,不再需要给 172.x 网段授权。
附加授权踩坑:
ERROR 1045 Access denied:账号允许的 host 和实际来源 IP 不匹配ERROR 1396 Operation CREATE USER failed:账号已经存在,MySQL5.6 直接用GRANT ... IDENTIFIED BY,不要重复 CREATE USER
-- MySQL5.6授权示例
GRANT ALL PRIVILEGES ON dbname.* TO 'lm_web'@'127.0.0.1' IDENTIFIED BY '你的密码';
FLUSH PRIVILEGES;
三、PHP8.2(Remi SCL 并行版本,多 PHP 共存)
Stream10 默认源没有高版本 PHP,使用 Remi 源的 SCL 包,安装路径在 /opt/remi/php82/,不和系统 PHP 冲突。
# 前置源
dnf install -y epel-release
dnf install -y https://rpms.remirepo.net/enterprise/remi-release-10.rpm
# 安装全套 + mysqlnd扩展
dnf install -y php82-php php82-php-fpm php82-php-cli php82-php-mysqlnd php82-php-opcache php82-php-curl php82-php-gd php82-php-mbstring php82-php-xml php82-php-zip
# 启动自启
systemctl enable --now php82-php-fpm
- 配置目录:
/opt/remi/php82/root/etc/ - pool 监听默认
127.0.0.1:9000 - 注意:直接敲
php -v是系统默认版本,切换 8.2:
scl enable php82 bash
php -v
- 对接 Redis/Valkey 扩展:
dnf install -y php82-php-pecl-redis
systemctl restart php82-php-fpm
目录权限说明
站点目录权限 drwxrwxr-x luomor luomor(775)。 两种方案适配 PHP-FPM 写入:
- php-fpm pool 运行用户改为 luomor;
- nginx/fpm 用户加入 luomor 用户组;
不建议直接 777 公网站点。
四、Nginx 配置踩坑:http2 语法废弃警告
告警日志:
nginx: [warn] the "listen ... http2" directive is deprecated
❌ 旧写法(废弃)
listen 443 ssl http2;
✅ 新版 Nginx 正确写法,拆成独立指令:
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
校验重载:
nginx -t
systemctl reload nginx
PHP 站点基础 fastcgi 配置:
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
五、缓存服务:Valkey(替代 Redis)
CentOS Stream10 官方移除 Redis,上游切换为 Valkey,协议完全兼容 Redis,php-redis 扩展直接可用。
dnf install -y epel-release
dnf install -y valkey
systemctl enable --now valkey
- 配置文件
/etc/valkey/valkey.conf - 默认端口 6379,仅本地监听
bind 127.0.0.1 - 连接命令:
valkey-cli ping
如果一定要原版 Redis,可以启用 Remi 的 redis 模块安装。
六、Docker 补充踩坑记录
尝试安装 docker-ce 时提示 No match for argument: docker-ce,原因是没有添加 docker 官方源。
另外一个坑:停止 docker.service 提示
Stopping docker.service, but its triggering units are still active: docker.socketdocker.socket 是 socket 激活单元,只要 socket 还在,执行 docker 命令就会自动拉起服务。
# 同时停止服务+socket
systemctl stop docker.service docker.socket
# 彻底禁用开机
systemctl disable --now docker.service docker.socket
结论:Stream10 建站优先使用 Podman,原生支持,无 socket 激活这类额外坑。
七、整体环境清单汇总
表格
| 组件 | 方案 | 备注 |
|---|---|---|
| Nginx | 系统 /remi nginx | http2 语法改动 |
| PHP | php82 SCL(remi) | 多版本共存,/opt/remi |
| 数据库新业务 | MySQL8.4 / MariaDB | 原生包,推荐 |
| 老项目依赖 MySQL5.6 | Podman –network=host 容器 | 解决网桥 IP 权限问题 |
| 缓存 | Valkey | Redis 兼容替代 |
| 容器引擎 | Podman | Stream10 原生,优先于 Docker |
八、通用安全建议(公网 web 机)
- MySQL/Valkey 默认只监听 127.0.0.1,不要直接放行公网 3306/6379;
- 尽量不使用
user@%全局授权; - MySQL8 生产环境保留密码策略,不要关闭;
- 站点目录最小权限原则,慎用 777;
- MySQL5.6 容器使用 host 网络模式是老项目最简解法,避免网桥 IP 飘忽不定带来的权限报错。
九、常见报错速查表
表格
| 报错 | 原因 | 解决办法 |
|---|---|---|
| 1819 | MySQL8 密码策略不满足 | 强密码 / 测试机卸载校验组件 |
| 1045 | 账号密码正确,但来源 IP 不匹配 | 授权对应访问 host,或改用 host 网络 |
| 1396 | CREATE USER 账号已存在 | 直接 GRANT,不要重复创建 |
| 1130 Host xxx not allowed | 来源 IP 没有授权 | 授权网段 /host 网络模式 |
| nginx http2 warn | 语法过时 | 拆分 listen 和 http2 on; |
| No match docker-ce | 缺少 docker 源 | 添加 docker repo 或者直接用 podman |