update:

偶然看到了 apache的更新说明,直接贴个地址过来吧。

http://httpd.apache.org/docs/2.4/upgrading.html


最近想把web开发目录从/var/www/转移到/home/user/webroot目录,并配置基于域名的apache2虚拟主机,结果遇到各种403错误,非常郁闷。最终在Scrat同学的帮助下,终于找到问题所在,于是在此记录。

我使用的apache版本是Server version: Apache/2.4.6 (Ubuntu),这是ubuntu安装的默认版本,低版本如apache2.2可能不存在这个问题(因为以前用2.2就没遇到这样的情况)。

0x01 Ubuntu配置apache2的前置知识

使用apt-get安装的apache2与直接编译安装版本略有不同,其配置文件不在是httpd.conf,而是/etc/apache2/apache2.conf。

而其虚拟主机的位置的配置文件也不在是vhost之类的,而是sites-avilable/xxx.conf。默认的localhost为000-default.conf,按照这个配置文件,配置一份demo.conf,就完成了虚拟主机的配置工作。

配置参考http://wiki.ubuntu.org.cn/Apache虚拟主机指南,这是Ubuntu的中文维基百科。推荐配置如下:

1
2
3
4
5
6
7
<VirtualHost *:80>
ServerName edunuke.example.com
ServerAdmin edunuke@mail.example.com
DocumentRoot "/var/www/edunuke/"
ErrorLog "/var/log/apache2/edunuke_errors.log"
CustomLog "/var/log/apache2/edunuke_accesses.log" common    
</VirtualHost>

可以看到推荐的配置是/var/www/的子目录。

按照000-default.conf的配置,填写完整的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<VirtualHost *:80>
        ServerName demo
  
        ServerAdmin xbzbing@163.com
        DocumentRoot /home/user/webroot
        <Directory /home/user/webroot>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                Allow from all
        </Directory>
  
        ErrorLog ${APACHE_LOG_DIR}/demo_error.log
        CustomLog ${APACHE_LOG_DIR}/demo_access.log combined
</VirtualHost>

很多时候的403错误都是<Directory>标签没有配置Allow from all,因为默认是Deny from all。

(注意,这里的Allow from all的配置项目属于2.2.x及以下版本才有,2.4.x已经不需要这个配置了)

然后使用命令a2ensite demo来使demo启用,再使用service apache2 reload来使配置生效。

别忘了修改/etc/hosts文件,使demo指向127.0.0.1。

原理上说到这里已经配置完毕,应该可以直接访问了,但是,一大波403正在靠近。。。。。

0x02问题来了

如果按照维基百科的配置,将目录选择在/var/www/目录或者子目录的话,完全无压力可以跑。但是换到/home/user/webroot之类的地方就出现403错误。

看错误日志,具体信息为:

1
AH00035: access to / denied (filesystem path '/home/user/webroot') because search permissions are missing on a component of the path

这说明在/home/user/webroot的路径上,存在一个目录权限设置有问题,导致拒绝访问。

1、修改/home/user/权限。

因为默认情况下该目录是700,apache2是无法访问的。

修改为711即可。

2、修改/home/user/webroot权限。

chmod 755 -R /home/user/webroot/

让webroot及其子目录拥有755权限,将一些特殊目录设置777,如assets目录,runtime目录等,这个根据程序修改。

权限修改完毕,请求依然是403。

1
AH01630: client denied by server configuration: /home/user/webroot/

看来是服务器配置问题啊。可是在网上搜了不少文章,都没有提到这个事情。

悲剧折腾了两天,重装,换目录也不行,哪怕换到/var/webroot/也还是不行,一一对比了/var/www和/home/user/webroot的权限设定,也没有问题啊,很纠结。

这时候叫来了Scrat同学,经过一阵瞎折腾,在修改了/etc/apache2/apache2.conf文件后的一个配置后居然可以了。

1
2
3
4
5
6
<Directory />
        #Options FollowSymLinks
        #AllowOverride None
        #Require all denied
        #我也忘记当时他改了什么,大概是把demo.conf中的<Directory>复制过来了
</Directory>

(PS这不是正确的方法,正确的方法见后续)

注释掉了这里的东西,写入了不知道从哪里找来的几行配置,居然访问通过了。

说实话,我觉得apache通过a2ensite/a2dissite这类命令来控制虚拟主机,是架构上先进的体现,没想到配置虚拟主机还得修改apache2文件。。。。郁闷。。

晚上回去我又仔细看了看这个配置文件,发现是自己傻逼了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>
  
<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

注释已经说了,这是防止访问根目录以外的目录做的特殊安全设定,默认情况下除了/usr/share和/var/www外,其他目录都apache服务器都不能访问。要使/home/user/webroot可以访问,就要增加一个类似的访问请求项目:

1
2
3
4
<Directory /home/user/webroot>
        AllowOverride None
        Require all granted
</Directory>

OK,这下达到原先的目标了。

但是这还没完,难道增加一个虚拟主机就得修改一次apache2.conf文件?真不能通过a2enssite无缝增加一个虚拟主机?

答案是肯定的,其实还是demo.conf配置问题,需要增加一个配置项目:Require all granted。

完整的配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<VirtualHost *:80>
        ServerName demo
  
        ServerAdmin xbzbing#163.com
        DocumentRoot /home/user/webroot
        <Directory /home/user/webroot>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Require all granted
        </Directory>
  
        ErrorLog ${APACHE_LOG_DIR}/demo_error.log
        CustomLog ${APACHE_LOG_DIR}/demo_access.log combined
</VirtualHost>

Ubuntu配置apache2.4配置虚拟主机遇到的问题的更多相关文章

  1. ubuntu下安装配置apache2(含虚拟主机配置)

    在Ubuntu14.14中安装apache 安装指令: sudo apt-get install apache2 安装结束后: 产生的启动和停止文件是: /etc/init.d/apache2 启动: ...

  2. ubuntu apache2配置详解(含虚拟主机配置方法)

    ubuntu apache2配置详解(含虚拟主机配置方法) 在Windows下,Apache的配置文件通常只有一个,就是httpd.conf.但我在Ubuntu Linux上用apt-get inst ...

  3. Ubuntu下apache2安装配置(内含数字证书配置)

    Ubuntu下apache2安装配置(内含数字证书配置)安装命令:sudo apt-get updatesudo apt-get install apache2 配置1.查看apache2安装目录命令 ...

  4. ubuntu 启用apache2 虚拟机配置

    Ubuntu 启用apache2 虚拟机配置 http://jingyan.baidu.com/article/5d6edee20b78e999eadeecf7.html

  5. nginx配置基于域名的虚拟主机

    其实基于域名和基于ip的虚拟主机配置是差不多的,在配置基于ip的虚拟主机上我们只需要修改几个地方就能变成基于域名的虚拟主机,一个是要修改域名,一个是host文件直接看代码 [root@localhos ...

  6. ubuntu下的apache的虚拟主机的配置

    ubuntu下的虚拟主机的配置相对window下的虚拟主机配置有些许不同. 对于要新建的虚拟主机,我们可以有如下几个步骤: 1.在/etc/apache2/sites-available/目录下新建一 ...

  7. apache2.4.X虚拟主机配置

    1,用记事本打开apache目录下httpd文件(如:D:\wamp\bin\apache\apache2.2.8\conf),找到如下模块       # Virtual hosts     #In ...

  8. ubuntu下apache2 安装 配置 卸载 CGI设置 SSL设置

    一.安装.卸载apache2      apache2可直接用命令安装           sudo apt-get install apache2      卸载比较麻烦,必须卸干净,否则会影响ap ...

  9. macOS --- 配置基于域名的虚拟主机

    在终端运行 sudo vi /Applications/XAMPP/xamppfiles/etc/httpd.conf,打开apache配置文件. 在httpd.conf中找到"#Inclu ...

随机推荐

  1. 【模拟】Friday the Thirteenth

    题目描述 Is Friday the 13th really an unusual event?That is, does the 13th of the month land on a Friday ...

  2. Xamarin XAML语言教程使用使用Progress属性设置当前进度

    Xamarin XAML语言教程使用使用Progress属性设置当前进度 开发者除了可以在XAML中使用Progress属性设置进度条的当前进度外,还可以在代码隐藏文件中使用Progress属性来设置 ...

  3. java有自动垃圾回收机制

    当垃圾收集器判断已经没有任何引用指向对象的时候,会调用对象的finalize方法来释放对象占据的内存空间~ java中垃圾回收以前听老师讲好像是内存满了他才去做一次整体垃圾回收,在回收垃圾的同时会调用 ...

  4. Linux的软连接和硬连接

    1.Linux链接概念 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [硬连接] 硬连接指通过索引 ...

  5. Jenkins的安装方法(Windows/Linux)

    前提:要确定本机全部安装了JDK 一.先说官方的安装方式 打开网址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+Jenkins,会留意 ...

  6. 待签名参数按照字段名的ascii码从小到大排序

    public static String getSign(Map<String, String> params) { Map<String, String> sortMap = ...

  7. [Android Traffic] 调整定时更新的频率(C2DM与退避算法)

    转载自: http://blog.csdn.net/kesenhoo/article/details/7395253 Minimizing the Effect of Regular Updates[ ...

  8. django admin后台编辑页面 显示数据公式

    先用django markdownx进行实时预览, 然后在 /Library/Python/2.7/site-packages/django/contrib/admin 这个目录下,加入 <sc ...

  9. 网易云音乐PC客户端加密API逆向解析

    1.前言 网上已经有大量的web端接口解析的方法了,但是对客户端的接口解析基本上找不到什么资料,本文主要分析网易云音乐PC客户端的API接口交互方式. 通过内部的代理设置,使用fiddler作为代理工 ...

  10. dmz主机就是DNAT功能的体现

    端口映射和DMZ是提供内网和外网映射的,具体各自如下:DMZ:就相当于DNAT(Destination NAT),只对目的IP地址做地址转换.也就是说,收到目的IP为自己WAN口的包,统统转发给内网的 ...