概述
本章,您将学习到 Apache httpd 当中配置文件 httpd.conf 的内容。
以下为相关的必要说明:
- 以 "#" 开头的行为注释行
- 配置文件中的配置项被称为 配置指令,其采用的是大驼峰式命名法(每一个单词的首字母都采用大写字母),配置指令的值被称为 指令参数
- 指令参数大部分都不区分大小写,若指令参数是目录路径、文件路径、用户名、用户组名、正则表达式,则区分大小写
- 部分配置指令的指令参数可以被相关命令行工具的选项和选项值覆盖
- 除了常规的配置指令以及指令参数外,在 httpd.conf 中还会见到一种标签对式的配置结构,常见如 IfModule 标签对、Directory 标签对。在官方文档中,这种配置结构被称为 配置段(Configuration Sections),其将一组相关的指令封装在一起,使其仅在特定条件、特定目录或特定文件范围内生效,由于这种结构像容器一样包裹着内部的指令,因此在社区和技术讨论中,也常被形象地称为 容器
常见配置指令
-
ServerRoot指令- Apache httpd 的安装位置,由于采用的是编译安装,因此指令参数默认为 "/usr/local/apache2/" -
Mutex指令 - 用户配置互斥机制的指令,主要用来解决多进程/多线程环境下对共享资源的竞争访问问题,指令参数默认为 "default:logs"。Apache httpd是一个能同时处理多个请求的 Web 服务器,它会有很多 "子进程" 或 "线程" 一起工作。当多个请求同时到达时,它们可能会争抢同一个网络连接,就像很多人同时想进一扇门,很容易发生冲突。Mutex 指令的作用,就是给这扇门配上一把 "互斥锁",确保同一时间,只有一个子进程或线程去处理这个连接,其他人必须排队等待,这样就可以避免混乱和冲突,让服务器稳定运行 -
Listen指令 - 监听的端口,指令参数默认为 "80"。指令参数还支持带 IPv4 和 IPv6 地址,比如 "192.168.100.20:80" 和 "[2001:db8::a00:20ff:fea7:ccea]:80" -
LoadModule指令 - 用来加载那些 .so 的模块,该指令的语法为LoadModule module_name file_path。其中 module_name 是指模块的内部名称(标识符),通常由模块开发者定义;file_path 用来指定 .so 模块文件(支持相对路径,也支持绝对路径),比如LoadModule mpm_event_module modules/mod_mpm_event.so -
IfModule配置段 - 用于条件判断的配置段,其语法格式为:<IfModule [!]module-file|module-identifier> ... </IfModule>- ! - 可选,取反的意思,表示只有当指定模块没有载入时,配置段内的指令才会生效
- module-file - 表示编译模块时的文件名,例如 mod_rewrite.c
- module-identifier - 模块的内部名称(标识符)
比如:
<IfModule unixd_module> User daemon Group daemon </IfModule> -
ServerAdmin指令 - 电子邮件地址,用来报告服务器问题。该地址会出现在某些 Web 服务器生成的页面上 -
ServerName指令 - Web 服务器的名称,必须修改。当 Web 服务器位于局域网中,可以填写 IP 地址、主机名;当 Web 服务器位于广域网时,需要填写为域中的主机名(域指的是你向厂商申请的域,比如rockylinux.org,主机名指的是域中的一个主机名,比如wiki.rockylinux.org) -
Directory配置段 - 主要作用是给 Web 服务器的不同文件夹设置不同规则的权限,语法为:<Directory directory-path> ... </Directory>其中 directory-path 有几种形式:
- 完整路径 - 指定目录的绝对路径,比如
"/var/www/html" - 带通配符的完整路径 - 支持常见的 UNIX 风格的通配符,如
?、*、[]、[-]、[^]等,比如"/home/*/public_html" - 带正则表达式的路径 - 在路径前面加上
~即可开启扩展正则表达式支持。比如~ "^/www/(.+/)*[0-9]{3}"
比如:
<Directory /> AllowOverride none Require all denied </Directory> - 完整路径 - 指定目录的绝对路径,比如
-
DocumentRoot指令 - 指定网页目录的路径,指令参数如"/usr/local/apache2/htdocs" -
Files配置段 - 对基于文件名进行控制的配置段,语法为:<Files filename> ... </Files>其中 filename 有几种形式:
- 普通文件名 - 如
"private.html" - 带通配符的文件名 - 如
".ht*" - 带正则表达式的文件名 - 在文件名前附加一个 ~ 字符,即可使用正则表达式进行匹配,如
~ "\.(gif|jpe?g|png)$"
- 普通文件名 - 如
-
ErrorLog指令 - 指定错误日志文件存放位置,默认的指令参数是"logs/error_log" -
LogLevel指令 - 指定日志的优先级,默认的指令参数为warn优先级从低到高排序(重要性从低到高):
名称 说明 debug一般调试信息 info基本通知信息 notice具有一定重要性的一般信息 warn警告消息,此类信息不能影响操作系统或服务的正常操作 error错误消息,可能会影响操作系统和服务的正常操作 crit比 error更严重的临界状态alert比 crit更严重的警报状态,系统管理员需要立即处理emerg系统通常不可用的紧急状态 日志优先级越低,记录的内容越详细,严重性越低(重要性越低)。日志优先级越高,记录的内容越少,问题越严重(重要性越高)。当指定了某个优先级时,所有高于它的信息也会被记录。例如,设置为
LogLevel info时,notice和warn级别的信息也会被记录。 -
MIMEMagicFile指令 - 指定一个 "魔术文件" 的路径,该文件包含了通过检查文件内容前几个字节来判定文件 MIME 类型的规则。如MIMEMagicFile conf/magic -
ErrorDocument指令 - 定义当服务器遇到错误或异常情况时,向客户端展示什么样的内容。其语法为:ErrorDocument error-code action- error-code:HTTP 状态码,常见的有 404(未找到)、403(禁止访问)、500(服务器内部错误)等
-
action:定义发生错误后的响应行为,可以是本地文件路径 、文本消息以及外部 URL 的其中一个形式,如
ErrorDocument 404 /errors/404.html ErrorDocument 403 "Sorry, access denied" ErrorDocument 500 http://backup.example.com/error.html
-
MaxRanges指令 - 限制服务器愿意返回给客户端的 HTTP 范围请求的数量。当客户端发送的 HTTP 请求中包含 Range 头(用于请求文件的某个部分而非整个文件,例如断点续传),如果请求的范围数量超过了 MaxRanges 设定的限制,服务器将忽略范围请求,直接返回完整的资源内容。默认情况下服务器最多允许返回 200 个范围,即MaxRanges 200 -
Include指令 - 用来加载其他目录当中以 .conf 结尾的扩展配置文件,如Include conf/extra/httpd-info.conf
配置段中的指令说明
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
含义:当 unixd_module 这个模块被加载时,其内部的指令才会生效。unixd_module 是 UNIX 和 GNU/Linux 平台上负责处理用户身份切换的核心模块。
User指令 - 指定子进程以哪个用户身份运行Group指令 - 指定子进程以哪个用户组身份运行
<Directory />
AllowOverride none
Require all denied
</Directory>
含义:给文件系统的根目录设置禁止访问的控制,这是保证安全的基础,即先对整个文件系统关门上锁,再为特定目录单独开放。
AllowOverride指令 - .htaccess 规则文件中允许的指令类型。指令参数为 none,表示完全忽略 .htaccess 文件,不允许任何覆盖。关于这个 .htaccess 规则文件,后面会介绍-
Require指令 - 访问控制指令,用于检查用户是否被允许访问资源。其语法为Require [not] entity-name [entity-value] ...- not - 可选,表示取反
- entity-name - 授权类型
- entity-value - 具体的授权值
常见的授权类型如下:
类型 说明 示例配置 all granted 允许所有请求访问 Require all granted all denied 拒绝所有请求访问 Require all deniedip 基于 IP 地址控制 Require ip 192.168.1.0/24host 基于主机名控制 Require host example.comuser 基于用户名控制 Require user alice bobgroup 基于用户组控制 Require group adminmethod 基于 HTTP 方法控制 Require method GET POST默认情况下,在同一个 Directory 配置段中,多个
Require行之间的关系为逻辑与
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
含义:为 Apache httpd 的网页目录设置访问控制。
-
Options指令 - 为特定目录启用或禁用一些服务器功能,语法为Options [+|-]option [[+|-]option] ...。在 Directory 配置段中,指令参数有:指令参数 说明 None 禁用所有功能 ALL 启用除 MultiViews 之外的所有功能 Indexes 当目录下没有索引文件时,自动生成并显示文件列表 FollowSymLinks 允许服务器跟踪该目录下的符号链接(软链接) SymLinksIfOwnerMatch 仅当目标文件或目录与链接属于同一用户时,才允许跟踪符号链接 ExecCGI 允许在该目录下执行 CGI 脚本 Includes 允许使用 SSI (Server-side includes) IncludesNOEXEC 允许使用 SSI (Server-side includes),但禁用 #exec cmd和#exec cgiMultiViews 允许使用 mod_negotiation 进行内容协商的 "多视图"
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
含义:当 dir_module 这个模块被加载时,执行被包裹的 DirectoryIndex 指令。DirectoryIndex index.html 指定默认索引文件为 index.html
<Files ".ht*">
Require all denied
</Files>
含义:所有以 .ht 开头的文件都被禁止请求访问,如常见且重要的 .htaccess 和 .htpasswd 文件是不能被客户端进行请求和访问的。
.htaccess 文件
Apache httpd 当中的一个分布式配置文件,全称是 "Hypertext Access"。按照官方的说法,当登录的用户对主配置文件 httpd.conf 无修改权限时,才需要使用到 .htaccess 文件,其提供了一种按目录进行配置更改的方式。在文件内容上,.htaccess 文件内容中的指令与 httpd.conf 使用相同的语法。
Q:什么时候才需要使用到这个文件?
当您对主配置文件 httpd.conf 无修改权限时,才需要使用到 .htaccess 文件
Q:.htaccess 应该存放在什么位置?
通常而言,它被存放在网页的根目录下(/usr/local/apache2/htdocs/)。若存放在网页根目录下,则作用范围为当前目录以及子目录;若子目录也存放着另外一个 .htaccess 文件且有相同的指令,则 Apache httpd 会以最后读取到的内容为准。
Q:在主配置文件 httpd.conf 中,应该如何控制 .htaccess 文件的行为?
您需要在 Directory 配置段中使用 AllowOverride 指令,语法为 AllowOverride All|None|directive-type [directive-type] ...,该指令的指令参数有:
- None - 完全忽略 .htaccess 文件
- All - 允许 .htaccess 文件使用所有具有 .htaccess 作用域的指令
- FileInfo - 允许使用控制文档类型的指令,如
ErrorDocument、SetHandler,mod_rewrite 模块的RewriteEngine、RewriteRule等 - AuthConfig - 允许使用认证授权相关的指令,如
AuthDBMGroupFile、AuthDBMUserFile、AuthGroupFile、AuthName、AuthType、AuthUserFile、Require等 - Indexes - 允许使用控制目录索引的指令,如
AddDescription、AddIcon、AddIconByEncoding、AddIconByType、DefaultIcon、DirectoryIndex、FancyIndexing、HeaderName、IndexIgnore、IndexOptions、ReadmeName等 - Options - 允许使用
Options和XBitHack指令,控制特定目录的功能。










