在 CentOS 8.2 上部署 WordPress,防火墙和 SELinux 的配置是确保服务安全且可访问的关键环节。CentOS 8 系列默认使用 firewalld作为防火墙管理工具,并强制启用 SELinux(Security-Enhanced Linux)。如果配置不当,WordPress 将无法加载图片、无法更新插件或出现 500/403 错误。
以下是基于生产环境最佳实践的详细配置步骤:
一、防火墙配置 (Firewalld)
CentOS 8 默认已安装并启用 firewalld。我们需要开放 HTTP (80) 和 HTTPS (443) 端口,以便用户通过浏览器访问网站。
1. 检查防火墙状态
systemctl status firewalld
如果未运行,请启动它:
systemctl start firewalld
systemctl enable firewalld
2. 开放 Web 服务端口
推荐使用 --permanent 参数永久添加规则,然后重载防火墙以生效。
方案 A:直接开放 http 和 https 服务(推荐)
这是最简洁的方式,firewalld 会自动处理对应端口。
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
方案 B:仅开放特定端口(如自定义端口)
如果你不使用标准 80/443 端口,需手动指定:
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --reload
3. 验证规则
firewall-cmd --list-all
确保输出中包含 services: http https 或 ports: 80/tcp 443/tcp。
二、SELinux 配置
SELinux 是 CentOS 的安全核心模块。对于 WordPress,必须允许 Apache/Nginx 进程读取网站文件、写入上传目录以及连接外部网络(如调用 API 或发送邮件)。
注意:不建议在生产环境中完全禁用 SELinux(即设置为 Permissive 或 Disabled),这会降低系统安全性。正确做法是设置合适的布尔值(Booleans)。
假设你使用的是 Apache + PHP-FPM(LAMP 栈常见组合):
1. 确认当前模式
getenforce
正常应为 Enforcing。如果是 Permissive,说明 SELinux 处于警告模式,部分策略可能未生效。
2. 设置关键 SELinux Boolean 值
以下命令用于允许 Web 服务器执行 WordPress 所需的操作:
# 允许 Apache 读写网站内容目录(包括 wp-content/uploads 等)
setsebool -P httpd_unified_write 1
setsebool -P httpd_read_user_content 1
# 允许 Apache 连接到数据库(MySQL/MariaDB)
setsebool -P httpd_can_network_connect_db 1
# 允许 Apache 发送电子邮件(如需使用 wp_mail 功能)
setsebool -P httpd_can_sendmail 1
# 允许 Apache 执行 CGI 脚本(如果使用某些插件可能需要)
setsebool -P httpd_enable_cgi 1
# 允许 Apache 与后端X_X通信(如果使用 Nginx 反向X_X)
setsebool -P httpd_can_network_relay 1
参数说明:
-P:持久化设置,重启后依然有效。httpd_*:针对 Apache 的上下文标签。若使用 Nginx,请将前缀改为nginx_*。
3. 修复文件上下文(Context)
如果将 WordPress 文件放置在非标准路径(如 /var/www/html 以外的目录),需要手动设置正确的 SELinux 上下文。
标准路径(无需额外操作)
如果 WordPress 安装在 /var/www/html/wordpress,默认上下文通常已正确。
自定义路径示例
假设你将 WordPress 放在 /data/web/wp:
# 设置目录类型为 httpd_sys_content_t(只读)
chcon -Rv -t httpd_sys_content_t /data/web/wp
# 如果需要写入权限(如 uploads, cache),设置为 httpd_sys_rw_content_t
chcon -Rv -t httpd_sys_rw_content_t /data/web/wp/wp-content
更规范的做法是使用 semanage 永久绑定类型:
yum install policycoreutils-python-utils -y # CentOS 8 中提供 semanage 命令
semanage fcontext -a -t httpd_sys_rw_content_t "/data/web/wp/wp-content(/.*)?"
restorecon -Rv /data/web/wp/wp-content
4. 验证 SELinux 状态
getenforce
sestatus
三、常见问题排查
1. WordPress 无法上传图片?
- 防火墙:确认
firewall-cmd --list-all中有https或http。 - SELinux:检查是否设置了
httpd_sys_rw_content_t到wp-content/uploads目录。 - 权限:确保 Web 服务器用户(如
apache或www-data)对目录有写权限:chown -R apache:apache /var/www/html/wordpress/wp-content chmod -R 755 /var/www/html/wordpress/wp-content
2. 插件/主题更新失败?
- 通常是文件系统权限或 SELinux 阻止了写入操作。
- 检查 SELinux 日志:
ausearch -m avc -ts recent | grep httpd - 根据日志提示调整布尔值或上下文。
3. 页面显示 500 Internal Server Error?
- 查看 Apache 错误日志:
tail -f /var/log/httpd/error_log - 同时检查 SELinux 审计日志:
tail -f /var/log/audit/audit.log | grep denied
四、补充建议:云厂商安全组
在阿里云、腾讯云、华为云等国内云平台部署时,除了操作系统内部的 firewalld,还需在云控制台的 安全组(Security Group) 中放行 TCP 80 和 443 端口。否则,即使系统防火墙开放,外部流量仍会被云平台拦截。
总结
| 项目 | 操作要点 |
|---|---|
| 防火墙 | 使用 firewall-cmd --permanent --add-service={http,https} 并 reload |
| SELinux | 保持 Enforcing,设置 httpd_can_network_connect_db, httpd_can_sendmail 等布尔值 |
| 文件权限 | 确保 Web 用户对 wp-content 有写权限,必要时设置 httpd_sys_rw_content_t |
| 云平台 | 同步配置安全组规则 |
遵循以上步骤,即可在 CentOS 8.2 上安全、稳定地运行 WordPress。
CLOUD云枢