Apache在用户的主目录中被拒绝访问,错误代码为13。

42

我的朋友的网站一直很正常,直到他将文档根目录从/var/www/xxx移动到 /home/user/xxx

通过Web浏览器访问该站点时,Apache会给出13个权限被拒绝的错误消息。

该站点配置为虚拟目录。所有Apache配置都没有更改(除了目录更改)

我们尝试过 chmod 777 /home/user/xxx,以及 chown apache /home/user/xxx。但它们都没有起作用。

用户的主目录上是否设置了某种安全功能?服务器操作系统为CentOS(Godaddy VPS)。

非常感谢您的任何帮助!

谢谢!


直到你提到它,我才知道这个 =) 我猜我会试一试。为什么他们要保留两个(或许更多?)网站呢?集中那些分类不是更好吗? - Dave
@Dave:stackoverflow.com 是用于编程问题的;serverfault.com 是用于系统管理/服务器问题的;superuser.com是用于一般的“高级用户”和其他杂项计算机相关问题的。这帮助人们专注于自己的专业领域。 - Josh
这个问题(以及它的答案)能否迁移到ServerFault上?这是一个很好的问题,为我解决了一个问题。如果它没有关闭,我还会添加一些答案。 - Danny Staple
我留下了一个标记,请求迁移到服务器故障。 - Dave
9个回答

92

原来我们还需要对用户的父目录进行 chmod 755 的操作,除了 xxx 之外。


3
谢谢你<3 - Petter Thowsen
也遇到了这个问题,我按照这里的步骤操作:http://serverfault.com/questions/124800/how-to-setup-linux-permissions-for-the-www-folder 最终失去了其他人的目录执行权限,导致我无法访问该文件夹。为了让Apache可以读取,我对该目录运行了“sudo chmod o+x /var/www”。 - shaunhusain
我一直在苦思冥想两个小时,从未想过检查用户主目录的权限。谢谢 Dave! - Marius Stuparu

37

我正在使用CentOS 5.5,对我来说,是SElinux与之冲突了,我忘记检查它了。您可以通过以下方式暂时禁用它:

echo 0 > /selinux/enforce

希望能对某些人有所帮助


9
这肯定会对那些完全不关心selinux的人有所帮助。我建议只是稍微更改您的selinux设置。例如,运行以下命令将使用户能够设置一个虚拟主机在他们的个人目录中运行:setsebool -P httpd_enable_homedirs 1。 - shaune
你很聪明...... 哈哈.... - Ishan Liyanage
这是魔法!非常感谢。 - Spartan

13

SELinux是该问题的原因......

TException: 错误:TSocket:无法连接到localhost:9160(权限被拒绝[13]) 为了解决此问题,您需要更改一个SELinux布尔值(这将自动持久存在于重新启动之间)。您可能还想重新启动httpd以重置代理工作进程,尽管这并不是严格要求的。

setsebool -P httpd_can_network_connect 1

或者

(13) 权限被拒绝

错误13表示文件系统权限问题。也就是说,由于错误的权限设置,Apache被拒绝访问文件或目录。一般来说,这并不意味着Apache配置文件存在问题。

为了提供文件服务,Apache必须获得操作系统授予的适当权限才能访问那些文件。特别地,httpd.conf中指定的User或Group必须能够读取所有要提供服务的文件并搜索包含这些文件的目录,以及所有父目录直到文件系统的根目录。

unix-like系统上资源的典型权限,如果它们不属于httpd.conf中指定的User或Group,则为644 -rw-r--r--常规文件和755 drwxr-x-r-x目录或CGI脚本。您可能还需要在支持这些权限的操作系统上检查扩展权限(例如SELinux权限)。

一个例子

假设您在unix-like系统上访问文件/usr/local/apache2/htdocs/foo/bar.html时收到了权限被拒绝的错误消息。

首先检查文件的现有权限:

cd /usr/local/apache2/htdocs/foo ls -l bar.htm

如果需要,请修复它们:

chmod 644 bar.html

然后对目录和每个父目录(/usr/local/apache2/htdocs/foo,/usr/local/apache2/htdocs,/usr/local/apache2,/usr/local,/usr)执行相同的操作:

ls -la chmod +x . cd ..

一直重复到根目录

在一些系统上,可以使用实用工具 namei 来列出路径中每个组件的权限以帮助查找权限问题:

namei -m /usr/local/apache2/htdocs/foo/bar.html

如果所有标准权限都正确,但仍然遇到“Permission Denied”错误,则应检查扩展权限。例如,您可以使用命令 setenforce 0 关闭 SELinux 并检查问题是否解决。如果是这样,可以使用 ls -alZ 查看 SELinux 权限,并使用 chcon 来修复它们。

在极少数情况下,这可能是由其他问题引起的,比如 apache2.conf 文件中其他地方的文件权限问题。例如,WSGIScriptAlias 指令没有映射到实际文件。错误消息可能不准确地指出哪个文件无法读取。

不要将文件或目录设置为 777 模式,即使是“只是为了测试”,即使是“测试服务器”。测试服务器的目的是在安全环境中做正确的事情,而不是试图逃避错误。它只会告诉您问题是否出现在实际存在的文件中。


谢谢,httpd_can_network_connect 是我需要在CentOS上启用SoapClient的东西。 - zpon

8

不确定您是否已经解决了问题,但请检查您的httpd.conf文件。

查看您的用户/组设置。通常会设置为:

User www Group www

如果是这样,请将其更改为您的名称/组:

User Greg group staff


这实际上解决了问题,这些错误不会那么容易消失。太棒了! - pal4life
1
对于 Ubuntu 12.04 系统上的 apache2,我发现文档中指出 # 这些需要在 /etc/apache2/envvars 中设置 - CrandellWS
对我有用!唯一有效的解决方案。 - reisdev
对我来说非常有效! - enchance

3

Apache的错误日志将会解释为什么您会获得"permission denied"权限被拒绝。此外,serverfault.com 是一个更好的论坛来解决这样的问题。

如果错误日志只是说"permission denied"权限被拒绝,那么请使用web服务器正在运行的用户进行su操作,然后尝试从相关文件中读取内容。例如:

sudo -s
su - nobody
cd /
cd /home
cd user
cd xxx
cat index.html

看看是否有其中一个给出了“权限被拒绝”的错误。

是的,我们查看了错误日志。它只显示了(13)权限被拒绝。有没有一些参数可以设置以启用更多的调试输出? - Dave

3

你不能在httpd.conf中设置日志级别为debug吗?(我使用的是FreeBSD)

编辑usr/local/etc/apache22/httpd.conf文件

修改日志级别:

'LogLevel: 控制记录到error_log中的消息数量。 可能的值包括:debug、info、notice、warn、error、crit、alert、emerg。'

尝试将其更改为debug,然后重新检查错误日志。


谢谢,现在错误日志是:(13)权限被拒绝:/home/user/.htaccess pcfg_openfile: 无法检查htaccess文件,请确保它可读。 - Dave
我尝试搜索特定于该错误的解决方案。但是,大多数解决方案涉及将文件chmod为正确的权限(这已经完成了)。其中一些说它涉及前端扩展。但是,我们从未使用过它...... - Dave

2

可能是SELinux的问题。检查相应的日志文件(/var/log/messages?- 我已经有一段时间没有使用RedHat派生版了)以查看是否阻止了访问。


谢谢你的帮助。我尝试查看 /var/log/messages;里面有很多文件:messages、messages.1.gz、messages.2.gz,一直到 messages.14.gz。/var/log/messages 是空的,我解压缩后其他文件也是空的... - Dave
SELinux正在阻止/usr/sbin/httpd对文件error.log进行追加访问。 - Ricky Levi

0

错误:

[error] [client 127.0.0.1] (13)权限被拒绝:无法打开密码文件:/home/XXX/svn/svn_password

信息:

##SELinux安全上下文文件标签
#httpd_sys_content_t 用于具有.html和.htm扩展名的常规静态网页的类型。
#httpd_sys_script_ro_t CGI脚本读取文件和目录所需的类型。
#httpd_sys_script_ra_t 与httpd_sys_script_ro_t类型相同,但还允许CGI脚本向文件追加数据。
#httpd_sys_script_rw_t 具有此类型的文件可以以任何方式(包括删除)由CGI脚本更改。
#httpd_sys_script_exec_t 执行CGI脚本所需的类型

解决方案:

[root@localhost]# perror 13 操作系统错误代码13:权限被拒绝 [root@localhost]# chown apache.apache /home/XXX/svn/ -R [root@localhost]# semanage fcontext -a -t httpd_sys_script_rw_t "/home/XXX/svn(/.*)?" [root@localhost]# restorecon -R -v /home/XXX/svn/ [root@localhost]# restorecon reset /home/XXX/svn/ context [root@localhost]# ls -dZ /home/XXX/svn/ drwxr-xr-x. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 /home/XXX/svn/ [root@localhost]# ls -dZ /home/XXX/svn/svn_password -rwxr-xr-x. apache apache system_u:object_r:httpd_sys_rw_content_t:s0 /home/XXX/svn/svn_password [root@localhost]#

-2

你除了更改目录权限,还更改了个别文件的权限吗?

chmod -R 777 /home/user/xxx

3
不应该对公开可访问的文件执行chmod 777操作。 - 6bytes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接