![Selinux 在 CentOS 6.3 中阻止 wordpress](https://linux22.com/image/799143/Selinux%20%E5%9C%A8%20CentOS%206.3%20%E4%B8%AD%E9%98%BB%E6%AD%A2%20wordpress.png)
我使用命令将 wordpress 3.5 安装到 CentOS 6.3:
yum install wordpress
并启动了 httpd。现在我可以在 apache 日志中看到以下错误:
PHP 致命错误:require_once():无法在 /usr/share/wordpress/wp-includes/class-feed.php 第 4 行打开所需的‘/usr/share/wordpress/wp-includes/class-simplepie.php’(include_path=‘.:/usr/share/pear:/usr/share/php’),引用者: http://www.mycompany.com/wp-admin/
我猜这是因为 SELinux:
ls -Z /usr/share/wordpress/wp-includes/class-simplepie.php
lrwxrwxrwx. root root system_u:object_r:usr_t:s0 class-simplepie.php -> /usr/share/php/php-simplepie
ls -Z /usr/share/php/php-simplepie
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 autoloader.php
drwxr-xr-x. root root unconfined_u:object_r:user_home_t:s0 SimplePie
-rw-r--r--. root root unconfined_u:object_r:user_home_t:s0 SimplePie.php
我想知道是否有办法让它工作而不禁用 SELinux?
答案1
您的文件似乎具有错误的 SELinux 安全上下文。当我安装软件包php-simplepie
(它似乎来自 EPEL)并检查这些文件时,它们都具有 类型usr_t
,而不是user_home_t
。
尝试修复安全标签:
restorecon -r -v /usr/share/php/php-simplepie
答案2
如果您想验证它是 SElinux,请使用 setenforce 0 关闭 SE linux 或检查 audit.log。我认为它在 /var/log/audit/audit/log 中,但我不能 100% 确定。一旦您确定它是 SELinu,您就可以重新打开 SElinux。
如果是 SElinux,那么要做的就是semanage
设置 selinux 策略,以便所有 PHP 内容所在的目录httpd_sys_rw_content_t
semanage fcontext -a -t httpd_sys_rw_content_t </path/to/php/dir>
然后将该策略应用于restorecon
目录及其子文件/目录:
restorecon -R </path/to/php/dir>
如果semanage/restorecon
尚未安装,请安装该policycoreutils-python
包。
顺便说一句,如果您想查看策略中的默认文件上下文,您可以这样做:
semanage fcontext -l
但是它可能不是 SELinux。我相信大多数 redhat 发行版上的 apache 不会遵循符号链接(尽管我认为你收到了一条错误,上面说了不遵循符号链接的情况),因此你可能需要添加:
Options FollowSymLinks
进入 apache 配置并重新启动 apache。
当然,也可能是 selinux 和不遵循符号链接。
答案3
这是我为我们的开发人员创建的一个小 shell 脚本。这样,每次他们推出 WordPress 时就不必记住所有要做的事情。您的文件结构几乎肯定会有所不同,因此需要进行一些修改。请随时提出改进建议。SELinux 不是我的专长,但我正在学习它。
#!/bin/sh
# License: Public Domain
# satisfies SELinux context requirements for a WordPress site
# To operate properly on CentOS, etc.
#Figure out what directory to apply this to and strip any trailing /
if [ -d $1 ]; then
site=${1%/}
else
site=`pwd`
fi
#Check to make sure the setting of $site is sane and fail if not
if [ ! -d $site/httpdocs/wp-content ]; then
echo "ERROR: This does not appear to be an appropriate directory."
echo ${site}
echo "Please specify directory for the site like /var/www/html/myssite as the only argument"
exit 1
fi
#For visual appeal mostly
content=$site/httpdocs/wp-content
#Setup the contexts
chcon -R -v -t public_content_rw_t $content/plugins/ $content/themes/ $content/uploads/ $site/logs/
semanage fcontext -a -t httpd_sys_rw_content_t $site/httpdocs/
semanage fcontext -a -t httpd_sys_rw_content_t $site/httpsdocs/
semanage fcontext -a -t httpd_sys_rw_content_t $site/logs/
#Apply the contexts
restorecon -R $site/logs/
restorecon -R $site/httpdocs/
restorecon -R $site/httpsdocs/