CentOS Stream 10 建站环境搭建踩坑实录|Nginx + PHP8.2 + MySQL5.6 (Podman) + Redis/Valkey

9次阅读
没有评论

服务器: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 网段授权。

附加授权踩坑:

  1. ERROR 1045 Access denied:账号允许的 host 和实际来源 IP 不匹配
  2. 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 写入:

  1. php-fpm pool 运行用户改为 luomor;
  2. 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.socket docker.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 机)

  1. MySQL/Valkey 默认只监听 127.0.0.1,不要直接放行公网 3306/6379;
  2. 尽量不使用 user@% 全局授权;
  3. MySQL8 生产环境保留密码策略,不要关闭;
  4. 站点目录最小权限原则,慎用 777;
  5. 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
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码