在CentOS 8.2上部署WordPress如何设置防火墙和SELinux?

在 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 httpsports: 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 中有 httpshttp
  • SELinux:检查是否设置了 httpd_sys_rw_content_twp-content/uploads 目录。
  • 权限:确保 Web 服务器用户(如 apachewww-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云枢 » 在CentOS 8.2上部署WordPress如何设置防火墙和SELinux?