Apache 配置文件解释

我是业余 Web 开发,平时主要是做算法,大概每隔几个月会搭一个网站。服务器用的是 Apache,每次配置的时候,都奉行拿来主义,从别的地方把 httd.conf 以及 .htaccess 文件内容复制过来,对配置只知道个大概,没有深入学习。

周末做新项目的时候,专门去 Apache 官网阅读了一下 User Guide,发现还是很好懂的,以前很多的疑惑都解开了。这篇文章我整理一下 Apache 配置架构,给以后的我复习用。

Apache 配置架构

Apache 本身的架构是一个核心+外围的 Module,它的配置也遵循这个结构,本文介绍 Apache 的核心配置,以及 mod_wsgimod_rewrite 两个模块。

基本语法

Apache 的配置位于 /etc/apache2/httpd.conf 或者 apache2.conf 之类的地方,具体路径各个平台不同。每条配置都是一个指令 (directive) :

指令名(如Listen) 配置值(如80)

利用 Include 指令,配置文件还可以包含其它的配置文件或文件夹。

作用域(Directory, Location, VirtualHost, .htaccess)

大部分指令都可以作用于某个特定的路径,这个路径可以用本机文件系统路径表示(Directory),也可以用网络位置表示(Location),这两种表示方式很多时候可以互换,不过最好用本机路径,这样安全一点,因为多个 Location 都可以到达同一个位置。

Directory 的配置是递归传播的。

作用域上的配置是经过 merge 后生效的,merge 的优先级是:
1. <Directory> (except regular expressions) and .htaccess done simultaneously (with .htaccess, if allowed, overriding <Directory>)
2. <DirectoryMatch> (and <Directory "~">)
3. <Files> and <FilesMatch> done simultaneously
4. <Location> and <LocationMatch> done simultaneously
5. <If>
配置按照出现的顺序处理,不过对于 Directory,处理顺序是 最短->最长,例如,<Directory "/var/web/dir"> 会先于 <Directory "/var/web/dir/subdir"> 处理,如果多个 Directory 指令作用于同一路径,那么后处理的会覆盖到前处理的上面。(Apache有些逻辑是 first match,例如 Alias,有些是后面覆盖前面)

如果一个 Directory 设定了 AllowOverride All,那么它还可以用 .htaccess 中的配置来覆盖。

VirtualHost 根据访问者使用的域名(name based)或者访问的 IP 地址(IP based),使用特定的配置,这样可以实现一个服务器 Host 多个网站。VirtualHost 的配置会覆盖全局配置。

mod_wsgi

mod_wsgi 通过 WSGIScriptAlias 这个指令,把某些指令路由给 Python 脚本处理,和 Alias 一样,第一个 Match 的生效。

mod_wsgi的两种工作模式

mod_rewrite

<IfModule mod_rewrite.c >
    RewriteEngine On
    # 拼 URL 时使用的前缀
    RewriteBase /
    # test string 可以用一堆常量,例如 %{REQUEST_URI} 
    # CondPattern 可以是正则表达式,也可以是一些其它的 test,例如文件是否存在
    # 默认是 AND,可以换成 [OR]
    RewriteCond TestString CondPattern [OR]
    # 支持 backref
    RewriteRule Pattern Substitution [flags]
</IfModuel>