Twitter Subscribe to PHP Blog RSS Feed Email RSS

Ubuntu更改Apache DocumentRoot的403错误分析

添加评论 2011年4月17日
可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明

Ubuntu下更改 Apache DocumentRoot到用户目录,出现 403 错误

403 Forbidden
Forbidden
You don’t have permission to access / on this server

多数情况下,这个消息的出现多数是由于DocumentRoot 的相关配置错误

# 这一部分定义网站或虚拟主机的根目录
DocumentRoot /var/www

# 这个一部分给出前面定义根目录的访问权限和所有特性,因此,两部分的变更是同步的

<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>

我将 DocumnetRoot 定义的目录更改为 /home/user/public_html(假定用户名为user),<Directory…部分也作出相应的更改,按照以往的经验,这样就已经可以了。但是在Ubuntu Server10.04上遭遇了403 Forbidden。按我的想法<Directory…部分就是赋予访问网站的用户访问/home/user/public_html目录的权限,这又是哪里的权限限制了?由于想不到别的可能性,所以“Google it”。

综合搜索结果最有力的说法是赋予 /home/user/public_html Apache 运行用户 www-data 的组权限:

$sudo chown user:www-data /home/user/public_html

然而故障依旧,查阅了很多英文论坛的帖子,多数是这个说法,我有点无助了。最后决度自己仔细分析,由于仍然可以肯定是目录访问权限的问题,是不是Ubuntu给了 /var/www 特定的权限,或者是给 /home/user 目录设定了特殊的权限。于是我尝试将 DocumentRoot 定义到 /usr/www 来测试是否给了 /var/www 特定的权限,没有收到403错误,因此排除,然后才想到查阅 /home/user 的权限

ls -ld /home/user

反馈的权限是700,原来新装Ubuntu 除了 root 用户外,第一个默认用户 user 被设为私有用户,其他用户(包括Apahe的运行用户 www-data )没有进入 /home/user 的权限,即使我将/home/user/public_html赋予给 www-data 组,也会收到 403。

我想到的解决办法有二:

一是赋予其他用户进入 /home/user 目录的权限
sudo chmod a+x /home/user

二是新建一个普通用户(不属于 admin 组),专门用于存放虚拟主机的文档,通过adduser新建的用户默认 home 目录的权限为 755 ,自然不会出现上述问题。

因为默认安装的用户 user 在admin组,可以使用 sudo 命令,开放目录保护提高了风险,而新增的普通用户不存在这个问题,因此个人考虑第二种方法更加实用。不知道你们有没有更适当的办法。

中文搜索与英文搜索

这里不得不提一下中文搜索和英文搜索。因为我的英文阅读速度还没有母语那么顺畅,因此一些急于找到结果的问题还是先用中文关键词搜索,但是即使是准确性较高的Google SE,也避免不了受”天下文章一大抄“的影响,对于这种例如“ubuntu 更改 apache documentroot”的搜索,会出来一大堆一模一样的文章,这还不是要命的,某些人自己都弄不明白,直接将貌似的、自认为的解决办法发表,例如有人说将
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
添加
Order allow,deny
allow from all
兄弟你可真要命,特意将服务器整个系统目录(根目录)暴露出来,给攻击者大开城门。即使是在本地做开发,这样也是大错。更有甚者将这样的错误文章抄袭过去,让整个中文技术网络充斥着这样的错误。

还有虽说不算操作错误,但是对原理涉及不透的,不明白配置文件的含义,比如:

把 apache2.conf 翻了好几遍,连DocumentRoot都搜不到
然后再仔细的看apache2.conf
终于发现有这么一句:
Include /etc/apache2/sites-enabled/
然后打开这个目录,看到一个 000-default
打开一看,全明白了。
改吧:
DocumentRoot /media/sda3/wwwroot

上述的情况在英文搜索(在Google进行全英文关键字的搜索)的情况下就好多了,绝大部分内容都是在论坛里找到,或者专门答疑的站点、邮件列表。即使存在类似,也能看到不同的观点,至少没有充斥大量的错误观点。

Ubuntu 下 Apache 配置目录及文件分析

我学习 FreeBSD的时间远多于Ubuntu,因此系统目录、配置文件结构,觉得传统的类Unix系统(如BSD)对系统目录、配置文件的结构更加严谨,清晰,而习惯于此,就会对Linux文件系统产生凌乱之感(也不止是我,许多用过两类系统的人发表过类似的看法),不过这里是针对系统层面,对于应用程序层面,也有某些Linux发行版更好的一面,比如Apache配置目录。Ubuntu来源于Debian,延续了一些很好的特性,像Apache的配置目录 /etc/apache2,就很清晰地分组了实用的配置文件

apache2.conf  envvars     magic           mods-enabled  sites-available
conf.d        httpd.conf  mods-available  ports.conf    sites-enabled

目前在apache实现虚拟主机是一种非常常用的做法,因此作为网络性很强的Debian/Ubuntu直接将Apache以虚拟主机的形式配置

apache2.conf 作为主配置文件,将一些基本不需要改动的部分设置放在其中,另外将其他部分的配置文件和模块以Include的方式包含进来

以下是部分示例:

# Include module configuration:
Include /etc/apache2/mods-enabled/*.load
Include /etc/apache2/mods-enabled/*.conf

# Include all the user configurations:
Include /etc/apache2/httpd.conf

# Include ports listing
Include /etc/apache2/ports.conf

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/

默认情况下,httpd.conf 为空,是给管理员用来自定义通用内容的,即是说如果你全部的虚拟主机存在统一的某一项配置,可以设置在这里。

mods-available 目录列出了所有已安装的模块,但是这个目录并没有包含在apache2.conf,因为是否启用,取决于模块是否存在于mods-enabled 目录,mods_enabled目录都是软链接,要激活模块,并不需要自己去创建软链接,可以使用Debian/Ubuntu的特有命令 a2enmod module_name,禁用模块使用 a2dismod module_name。这种方式无疑更加快捷,因为常规的Apache配置模块需要在主配置文件httpd.conf查找相关模块行,取消注释和注释达到相应的效果。

sites-available 与 mods-available 同原理,是添加虚拟主机的地方,其下的 default 文件是默认的第一个虚拟主机,通过 $sudo cp default example.com,再编辑example.com(假设建立example.com的虚拟站点并禁用默认的站点),作出相应的修改与配置,然后执行

sudo a2dissite default && sudo a2ensite example.com
#无需重启重新加载配置文件,前面的模块启用与禁用是需要执行重启的
sudo /etc/init.d/apache2 reload

sites-available 下可以添加大量的虚拟主机,而是否启用取决与你是否将其启用于 sites_enabled,这样就无法反复地在配置文件中做删除与添加的操作,只需要执行启用或者禁用命令。

sites-available 下的 default-ssl 文件就是是否将站点启用ssl的一个配置示例,可以理解为不同与 default的一个独立的虚拟主机。

BTW
希望在中文技术文档圈里,可以少一些抄袭和不加思索的错误的转载,对于基础的常规问题,最好能附上新的观点,让初学者在资料的搜寻里更加轻松。

评论

  1. 台灣工程師阿宏

    問題有解嗎?我安裝wordpress,前台有出來,輸入wp-admin/後,還是出現
    Forbidden

    You don’t have permission to access /wp-admin/ on this server.
    Apache/2.2.22 (Ubuntu) Server at news.networkmagazine.com.tw Port 80

  2. frePerl

    如果不是上述我说的服务器配置的特殊原因,你查看下wp-admin/这个目录的权限值,或者是否在.htaccess有何特殊配置

  3. kimoslif

    非常感谢,找了很多资料,都没有解决,看你的文章解决了,谢谢~

  4. 小金鱼儿

    谢谢……虽然问题还是没有解决……但是你的回答真好。