在 CentOS 8.2(已停止维护,强烈建议升级至 CentOS Stream 8/9 或 AlmaLinux/Rocky Linux 8+)上安装 Nginx + PHP + MySQL(实际推荐 MariaDB)建站环境,需注意:
✅ CentOS 8.2 自带 dnf(替代 yum),默认仓库已启用 EPEL;
⚠️ MySQL 官方 RPM 不直接支持 CentOS 8(因依赖冲突),Red Hat 生态推荐使用 MariaDB(完全兼容、开箱即用);
⚠️ PHP 默认版本为 7.2(较旧),生产环境建议升级至 PHP 7.4 或 8.0+(需启用 PowerTools/CRB 及 EPEL 扩展源)。
以下为安全、稳定、符合 Red Hat 最佳实践的完整步骤(含基础安全加固与常见问题规避):
✅ 前置准备(以 root 执行)
# 1. 更新系统并安装基础工具
dnf update -y
dnf install -y epel-release dnf-utils vim wget curl net-tools
# 2. 启用 CodeReady Builder (CRB) 仓库(原 PowerTools)——提供编译依赖和新版 PHP
dnf config-manager --set-enabled crb
# 3. 安装常用依赖(避免后续编译失败)
dnf groupinstall -y "Development Tools"
🌐 一、安装 Nginx(官方稳定版)
# 添加官方 Nginx 仓库(确保最新稳定版,非系统默认的旧版)
cat > /etc/yum.repos.d/nginx.repo << 'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=https://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
# 清理缓存并安装
dnf clean all
dnf install -y nginx
# 启动并设开机自启
systemctl enable --now nginx
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
# 验证:curl http://localhost 或访问服务器 IP,应见 "Welcome to nginx!"
💡 提示:Nginx 默认配置位于
/etc/nginx/nginx.conf,站点配置建议放在/etc/nginx/conf.d/*.conf
🐘 二、安装 MariaDB(MySQL 的完全兼容替代)
# CentOS 8 默认仓库提供 MariaDB 10.3(稳定可靠)
dnf install -y mariadb-server mariadb
# 启动并设开机自启
systemctl enable --now mariadb
# 运行安全初始化(设置 root 密码、禁用匿名用户等)
mysql_secure_installation
# 按提示操作:y → 设置强密码 → y → y → y → y
# 验证连接
mysql -u root -p -e "SELECT VERSION();"
⚠️ 注意:若必须用 Oracle MySQL,请从 dev.mysql.com 下载 RHEL 8 兼容 RPM(如
mysql80-community-release-el8-*.noarch.rpm),但需手动解决依赖(如libtirpc),不推荐新手使用。
☕ 三、安装 PHP 7.4(推荐 LTS 版本,比系统默认 7.2 更安全)
# 启用 EPEL + CRB 后,安装 PHP 7.4(来自 EPEL)
dnf install -y php php-fpm php-mysqlnd php-gd php-xml php-mbstring php-json php-opcache
# 配置 PHP-FPM(关键!)
sed -i 's/^user = apache/user = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/^group = apache/group = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/;listen.owner = nobody/listen.owner = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/;listen.group = nobody/listen.group = nginx/' /etc/php-fpm.d/www.conf
sed -i 's/;listen.mode = 0660/listen.mode = 0660/' /etc/php-fpm.d/www.conf
# 启动 PHP-FPM
systemctl enable --now php-fpm
✅ 验证 PHP:创建测试文件
echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/info.php chown nginx:nginx /usr/share/nginx/html/info.php访问
http://你的IP/info.php,确认显示 PHP 信息页(注意:上线前务必删除!)
🔧 四、配置 Nginx 支持 PHP(FastCGI)
编辑默认站点配置:
vim /etc/nginx/conf.d/default.conf
替换 location / 块为以下内容(支持 .php 解析 + 防止文件泄露):
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
# 处理 PHP 请求
location ~ .php$ {
root /usr/share/nginx/html;
fastcgi_pass 127.0.0.1:9000; # 或 unix:/run/php-fpm/www.sock(更高效)
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 禁止访问敏感文件
location ~ /.(ht|git|svn|bak|swp)$ {
deny all;
}
}
✅ 推荐使用 Unix Socket(性能更好):
将fastcgi_pass改为:fastcgi_pass unix:/run/php-fpm/www.sock;
并确保/etc/php-fpm.d/www.conf中listen = /run/php-fpm/www.sock已取消注释且权限正确(已通过前面 sed 设置)。
重载配置:
nginx -t && systemctl reload nginx
🧪 五、测试建站环境(WordPress 示例)
# 安装 unzip(解压 WordPress)
dnf install -y unzip
# 下载并解压 WordPress(中文版)
cd /usr/share/nginx/html
rm -rf *
wget https://cn.wordpress.org/latest-zh_CN.zip
unzip latest-zh_CN.zip
mv wordpress/* . && rmdir wordpress
chown -R nginx:nginx /usr/share/nginx/html/
# 创建 WordPress 数据库(替换 YOUR_DB_NAME, YOUR_DB_USER, YOUR_PASSWORD)
mysql -u root -p -e "
CREATE DATABASE wp_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'StrongPass123!';
GRANT ALL PRIVILEGES ON wp_db.* TO 'wp_user'@'localhost';
FLUSH PRIVILEGES;
"
# 访问 http://你的IP 开始 WordPress 安装向导
🔐 六、基础安全加固(必做!)
# 1. 禁用 PHP 显示错误(生产环境)
sed -i 's/expose_php = On/expose_php = Off/' /etc/php.ini
sed -i 's/display_errors = On/display_errors = Off/' /etc/php.ini
# 2. 限制 Nginx 用户权限
echo "user nginx;" > /etc/nginx/nginx.conf.d/user.conf
# 3. 启用 SELinux(CentOS 8 默认启用,确认状态)
sestatus # 应为 enabled & enforcing
# 若需允许 Nginx 连接网络(如远程 DB):
setsebool -P httpd_can_network_connect 1
# 4. 配置防火墙仅开放必要端口
firewall-cmd --permanent --remove-service=dhcpv6-client # 移除无关服务
firewall-cmd --reload
📌 常见问题与解决方案
| 问题 | 原因 | 解决 |
|---|---|---|
502 Bad Gateway |
PHP-FPM 未运行 / socket 权限错误 | systemctl status php-fpm;检查 /var/log/php-fpm/www-error.log;确认 listen.owner/group = nginx |
Access denied for user |
MySQL 用户权限或 host 错误 | 创建用户时用 'wp_user'@'localhost'(非 %),或检查 skip-networking 是否关闭 |
File not found(PHP) |
root 路径不匹配或 SCRIPT_FILENAME 错误 |
确保 Nginx root 与 fastcgi_param SCRIPT_FILENAME 中路径一致 |
| SELinux 阻止访问 | setsebool -P httpd_can_network_connectdb 1(若连远程 DB) |
ausearch -m avc -ts recent | audit2why 查具体原因 |
🚨 重要提醒(安全与合规)
- ❌ CentOS 8 已于 2021-12-31 终止支持(EOL),不再接收安全更新 → 立即迁移至 CentOS Stream 8/9、AlmaLinux 8/9 或 Rocky Linux 8/9。
- ✅ 生产环境务必:
- 使用 Let’s Encrypt 配置 HTTPS(
certbot --nginx) - 设置强密码(数据库、PHPMyAdmin 等)
- 定期备份数据库(
mysqldump -u user -p db_name > backup.sql) - 禁用未使用的 PHP 模块(如
php-ldap,php-snmp)
- 使用 Let’s Encrypt 配置 HTTPS(
需要我为你生成:
- ✅ 自动化部署脚本(bash)
- ✅ SSL + HTTPS + HTTP/2 配置指南
- ✅ WordPress 一键安装 + 安全加固清单
- ✅ 迁移到 Rocky Linux 9 的平滑升级方案?
欢迎随时提出 👇
CLOUD云枢