Centos7 上使用 WordPress 搭建了一个小站,使用 Nginx 做服务器,配置环节一切正常,最后站点也可以正常访问,但是在安装插件的时候出现了 无法创建文件夹的错误。google 一番,都是说 WordPress 文件权限设置不对,但是我已经将所有 文件夹权限设置为 755 文件权限设置为 644。

直到我看到了这个 https://wordpress.stackexchange.com/questions/302778/installation-failed-could-not-create-directory-centos-7

才找到根源所在 : SELinux.

  • 检查 SELinux 是否开启 ,输入getenforce,如果 输出了 Enforcing, 则说明 SELinux 是开启的,而它有可能是导致上述问题的原因。
  • 切换到 WordPress 的目录,执行以下两条命令:
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
  • 使用 如下命令锁定整个 WordPress 目录的 所有 SELinux 强制执行
chcon -t httpd_sys_content_t /path/to/wordpress/ -R
  • 设置 SELinux 允许适当的访问权限
cd /path/to/wordpress/
chcon -t httpd_sys_rw_content_t wp-config.php
chcon -t httpd_sys_rw_content_t wp-content -R
  • 重启 nginx 服务,在浏览器中访问站点,发现插件已经可以正常安装。

鸟哥在 http://cn.linux.vbird.org/linux_basic/0440processcontrol_5.php 中阐述了原因

在委任式存取控制的配置下,我们的程序能够活动的空间就变小了!举例来说, WWW 服务器软件的达成程序为 httpd 这支程序,而默认情况下, httpd 仅能在 /var/www/ 这个目录底下存取文件,如果 httpd 这个程序想要到其他目录去存取数据时,除了守则配置要开放外,目标目录也得要配置成 httpd 可读取的模式 (type) 才行喔!限制非常多!所以,即使不小心 httpd 被 cracker 取得了控制权,他也无权浏览 /etc/shadow 等重要的配置档喔!

我的 WordPress 没有放在 /var/www 这个目录下,所以默认的 httpd 是无法访问我配置的 WordPress 目录的,需要对目标目录进行配置。配置过程如上。

备注:

千万不要直接关闭 SELinux 来解决这个问题。

吐槽:

买了一台腾讯云的服务器,centos7 系统,发现 SELinux 竟然是默认关闭的。。。

参考链接