httpd配置⽂件f规则说明和⼀些基本指令
本⽂主要介绍的是httpd的配置⽂件,包括⼀些最基本的指令、配置规则、配置合并规则。以下指令完全来⾃官⽅⼿册以及我⾃⼰的总结和整理。
1.1 httpd命令和apachectl命令
[root@xuexi ~]# httpd -h
Usage: httpd [-D name] [-d directory] [-f file]
[-C "directive"] [-c "directive"]
[-k start|restart|graceful|graceful-stop|stop]
[-v] [-V] [-h] [-l] [-L] [-t] [-T] [-S] [-X]
Options:
-D name            : 定义⼀个在< IfDefine name >中使⽤的name,以此容器中的指令
-d directory      : 指定ServerRoot
-f file            : 指定配置⽂件
-C "directive"    : 指定在加载配置⽂件前要处理的指令(directive)
-c "directive"    : 指定在加载配置⽂件后要处理的指令
-e level          : 显⽰httpd启动时的⽇志调试级别
-E file            : 将启动信息记录到指定⽂件中
-v                : 显⽰版本号
-V                : 显⽰编译配置选项
-h                : 显⽰帮助信息
-l                : 显⽰已编译但⾮动态编译的模块,即静态编译的模块
-L                : 显⽰静态模块可⽤的指令列表
-t -D DUMP_VHOSTS  : 显⽰虚拟主机的设置信息
-
t -D DUMP_RUN_CFG : 显⽰运⾏参数
-S                : 等价于-t -D DUMP_VHOSTS -D DUMP_RUN_CFG。在调试如何解析配置⽂件时⾮常⾮常有⽤
-t -D DUMP_MODULES : 显⽰所有已被加载的模块,包括静态和动态编译的模块
-M                : 等价于-t -D DUMP_MODULES
-t                : 检查配置⽂件语法
-T                : 不检查DocumentRoot,直接启动
-X                : 调试模式,此模式下httpd进程依赖于终端
-k                : 管理httpd进程,接受start|restart|graceful|graceful-stop|stop
apachectl命令和httpd命令基本相同。httpd接受的选项,apachectl都接受。但apachectl还可以省略"-k"选项直接管理httpd进程。
apachectl [-k] start:按照默认路径,读取默认配置⽂件,并启动httpd。
apachectl [-k] stop:关闭httpd进程。
apachectl [-k] restart:重启httpd进程。
apachectl [-k] graceful-stop:graceful stop,表⽰让已运⾏的httpd进程不再接受新请求,并给他们⾜够的时间处理当前正在处理的事情,处理完成后才退出。所以在进程退出前,⽇志⽂件暂时不会关闭,正在进⾏的连接暂时不会断开。
apachectl [-k] graceful:graceful restart,即graceful-stop+start。
apachectl [-k] configtest:语法检查。
在systemd环境下,还可以使⽤apacectl status或systemctl status httpd查看httpd进程的详细信息。
1.2 配置⽂件规则和常见指令
httpd的核⼼体现在配置⽂件,各种功能都通过配置⽂件来实现。使⽤rpm包安装的httpd默认配置⽂件为/etc/httpd/f。可以使
⽤httpd -f config_path指定要加载的配置⽂件。
配置⽂件中全是⼀些指令配置,每个指令都是某个模块提供的。以下是配置⽂件的⼀些规则:
指令⽣效⽅式是从上往下读取,这⼀点⾮常⾮常重要。很多指令的位置强烈建议不要改变,例如Include conf.d/*.conf指令建议不要移动位置。
"#"开头的⾏为注释⾏,只能⾏头注释,不能⾏中注释。
对⼤⼩写不敏感,但是建议指令名称采⽤"驼峰式"命名。例如ServerRoot,DocumentRoot。
⼀⾏写不下的可以使⽤"\"续⾏,但是"\"后不能有任何字符,包括空格也不允许。
指令配置格式为"Directive value",例如"ServerRoot /etc/httpd",如果value中包含特殊字符或空格,则必须使⽤双引号包围。
由于可以通过Include指令包含其他配置⽂件,⼜⽀持各种路径的容器,所以在httpd启动时会先进⾏配置⽂件的合并。理解合并规则⾮常重要,具体见。
1.2.1 Listen指令
设置监听套接字。设置⽅式很简单,包括以下⼏种情况:
# 监听两个端⼝
Listen 80
Listen 8000
# 监听套接字绑定在给定地址和端⼝上
Listen 192.170.2.1:80
Listen 192.170.2.5:8000
1.2.2 ServerRoot指令
该指令设置httpd的安装位置,也就是常称之为的basedir,在此⽬录下应该具有module、logs等⽬录。rpm安装的httpd的ServerRoot默认为/etc/httpd,编译安装的ServerRoot路径由"--prefix"选项指定,例如/usr/local/apache。
[root@xuexi ~]# ls -l /usr/local/apache/
total 52
drwxr-xr-x  2 root root  4096 Sep 2720:46 bin
drwxr-xr-x  2 root root  4096 Sep 2720:46 build
drwxr-xr-x  2 root root  4096 Sep 2720:46 cgi-bin
drwxr-xr-x  3 root root  4096 Sep 2720:46 error
drwxr-xr-x  2 root root  4096 Sep 3011:33 htdocs
drwxr-xr-x  3 root root  4096 Sep 2720:46 icons
drwxr-xr-x  2 root root  4096 Sep 2720:46include
drwxr-xr-x  2 root root  4096 Sep 3001:40 logs
drwxr-xr-x  4 root root  4096 Sep 2720:46 man
drwxr-xr-x 14 root root 12288 Jul  701:38 manual
drwxr-xr-x  2 root root  4096 Sep 2720:46 modules
这个指令很关键,安装好apache后⼀般不会去做任何修改,因为很多指令的路径以及相对路径都是基于此路径的。严格地说,除了⽹络路径,基本上所有本地⽂件系统类的路径只要不是绝对路径,相对路径都基于此路径展开。
例如,当指定"ServerRoot /usr/local/apache"时,下⾯⼏个指令中描述的本地路径,等号前⾯的采⽤的都是相对路径,等号右边的都是他们等价的绝对路径写法。
DocumentRoot "htdocs"                    = DocumentRoot "/usr/local/apache/htdocs"
LoadModule dir_module modules/mod_dir.so = LoadModule dir_module /usr/local/apache/modules/mod_dir.so
ErrorLog "logs/error_log"                = ErrorLog /usr/local/apache/logs/error_log
Alias /net_path local_fs_path            = Alias /net_path /usr/local/apache/local_fs_path
Include conf.f                = Include /usr/local/apache/conf.f
但注意,容器< Directory PATH >的PATH⼀般设置为⽂件系统的绝对路径,因为它是路径匹配性质的。但它仍可以使⽤相对路径时,此时它相对的是根⽂件系统的"/",⽽⾮ServerRoot。
所以,这个指令强烈不建议做任何修改,修改是很简单,但是牵⼀发⽽动全⾝。
1.2.3 DocumentRoot指令
如果说,ServerRoot是httpd中本地⽂件相对路径的根,那么DocumentRoot就是⽹络路径相对路径的根。顾名思义,DocumentRoot是⽂档的根⽬录,这个⽂档的意思是展现在⽹络上的⽂档。使⽤rpm包安装的httpd的DocumentRoot默认值为"/var/www",编译安装的httpd,其DocumentRoot默认为"PREFIX/htdocs",也就是"$ServerRoot/htdocs"。
设置DocumentRoot后,将需要在⽹络上访问的⽂件都放进此⽬录下即可。
例如,假设httpd所在主机IP为192.168.100.14,DocumentRoot使⽤默认的/usr/local/apache/htdocs,那么下⾯⼏个URL中,左边的是浏览器中输⼊的值,右边的是其访问的服务器上的资源路径。
192.168.100.14/index.html        ==> /usr/local/apache/htdocs/index.html
192.168.100.14/index.php          ==> /usr/local/apache/htdocs/index.php
192.168.100.14/subdir/index.html  ==> /usr/local/apache/htdocs/subdir/index.html
192.168.100.14/subdir/index.php  ==> /usr/local/apache/htdocs/subdir/php
1.2.4 DirectoryIndex指令
该指令设置的是"当搜索的URL中的路径使⽤了"/"结尾时,httpd将搜索该指令所指定的⽂件响应给客户端"。也就是说,当url表⽰搜索的是⽬录时,将查该⽬录下的DirectoryIndex。注意,很多时候如果没有给定尾部的"/",httpd的dir_module模块会⾃⾏加上"/",当然,是否补齐尾随的"/",也是可以控制的,见指令。DirectoryIndex的设置格式为:
DirectoryIndex disabled | local-url [local-url]
例如,当设置"DirectoryIndex index.html"时,如果在浏览器中输⼊下⾯左边的⼏个URL,httpd将响应右边对应的⽂件。
192.168.100.14          ==> $DocumentRoot/index.html
192.168.100.14/newdir/  ==> $DocumentRoot/newdir/index.html
可以指定多个index⽂件,它们将按顺序从左向右依次查,并返回第⼀个到的index⽂件。例如:
<IfModule dir_module>
DirectoryIndex index.php index.html /mydir/index.html
</IfModule>
可以使⽤多个DirectoryIndex指令进⾏追加设置,它等价于单⾏设置多个值,例如下⾯的设置等价于DirectoryIndex index.php index.html:
DirecotryIndex index.php
DirectoryIndex index.html
如果要替换某个值,则直接修改或使⽤disabled关键字禁⽤其前⾯的Directoryindex。例如禁⽤index.php,只提供index.html的索引。
DirectoryIndex index.php
DirectoryIndex disabled
DirectoryIndex index.html
但注意,"disabled"关键字必须独⾃占⽤⼀个DirectoryIndex指令,否则它将被解析成字⾯意思,也就是说将其当作⼀个index⽂件响应给客户端。DirectoryIndex指令可以设置在Server、Virtual host、Loc
ation和Directory上下⽂。所以,当设置在location或Directory容器中时,它将覆盖全局设置。例如,当DocumentRoot为/usr/local/apache/htdocs时:
DirectoryIndex index.php
<directory /usr/local/apache/htdocs/newdir>
DirectoryIndex index.html
</directory>
# 或者
<location /newdir>
DirectoryIndex index.html
</location>
当DirectoryIndex提供的索引⽂件都不存在时,将根据Options中的Indexes选项设置决定是否列出⽂件列表,除⾮是提供⽂件下载,否则出于安全考虑,这个选项是强烈建议关闭的。例如以下设置为打开,
<directory /usr/local/apache/htdocs/newdir>
Options Indexes
DirectoryIndex index.html
</directory>
1.2.5 ServerName和ServerAlias
ServerName⽤于唯⼀标识提供web服务的主机名,只有在基于名称的虚拟主机中该指令才是必须提供的。也就是说,如果不是在基于名称的虚拟主机中,可以任意指定该指令的值,只要你认为它能唯⼀标识你的主机。但如果不设置该指令,那么httpd在启动时,将会反解操作系统的IP地址。
唯⼀标识主机的⽅式,也即ServerName的语法为:
ServerName {domain-name|ip-address}[:port]
例如,在主机web.longshuai上提供了⼀个httpd web服务,如果还想使⽤www.longshuai提
供同样的服务,还想效率更⾼点,则在设置DNS别名后再配置:
ServerName www.longshuai
ServerAlias⽤于定义ServerName的别名。如果在定义ServerName之后再定义ServerAlias,那么ServerName和ServerAlias没有任何区别。当然,为了区分基于名称的虚拟主机,还是必须要定义ServerName。
例如,下⾯⼏个ServerName和ServerAlias是完全等价的。
<VirtualHost *:80>
ServerName  ample
陈乔恩家庭背景
ServerAlias ample server2
ServerAlias *.example
# ...
</VirtualHost>
1.2.6 Include指令
在httpd启动时,⾸先会解析配置⽂件。httpd⽀持include指令来包含其他⽂件,在解析配置⽂件时会进⾏配置合并。
⽀持通配符"*"、"?"和"[]",但它们不能匹配斜线"/",如有必要,它们会按照⽂件名的字母顺序依次进⾏加载。如果include指令中指定包含⼀个⽬录,则会按照字母顺序加载该⽬录内的所有⽂件,这⽐较容易出错,因为有些时候会产⽣⼀些临时⽂件或⾮配置类的⽂件。
例如:
Include /usr/local/apache/f
Include /usr/local/apache/conf/vhosts/*.conf
可以使⽤绝对路径,也可以使⽤相对路径,如果使⽤相对路径,则它相对于ServerRoot。
Include f
Include conf/vhosts/*.conf
如果include包含的⽂件不存在时,将报错。这时可以使⽤IncludeOptional指令进⾏加载,这表⽰存在则加载,不存在就算了。例如下⾯的第⼀条指令中,如果vhosts下没有⼦⽬录,或者⼦⽬录中没有".conf"⽂件都将失败,⽽第⼆条指令则不会。
Include conf/vhosts/*/*.conf
IncludeOptional conf/vhosts/*/*.conf
1.2.7 Define和UnDefine指令
该指令⽤于定义参数或定义向后全局⽣效的变量。语法格式为:
Define param [value]
当只给定⼀个param时,表⽰定义⼀个参数,这个参数⽤于< IfDefine param >容器进⾏判断,只有定义了的参数param,该容器才返回真,其内封装的指令才⽣效。它的等价⾏为是在httpd启动时(必须是启动时),使⽤"-D"选项定义参数。例如下⾯两个⽅法是等价的:
# startup command
shell> httpd -DMyName ......
# in config
Define MyName
当给定了两个参数,即还指定了value时,将表⽰定义⼀个变量,该变量具有向后全局性。也就是说,定义在某个虚拟主机中的变量在后⾯的另⼀个虚拟主机中也有效。引⽤变量时,使⽤${var}的⽅式。注意,变量名中不能包含冒号":"。
例如:
<IfDefine !TEST>
Define ample
</IfDefine>
DocumentRoot"/var/www/${servername}/htdocs"
使⽤UnDefine指令则是取消Define定义的参数或变量。语法为UnDefine param。
1.2.8 VirtualHost指令
⽆疑,这是最重要的指令之⼀。⽤于封装⼀组指令只作⽤于指定主机名或IP地址的虚拟主机上。
语法格式为:
<VirtualHost addr[:port] [addr[:port]] ...> ... </VirtualHost>
其中addr部分可以是以下⼏种情况:
虚拟主机的IP地址
虚拟主机IP地址对应的FQDN(不推荐)
字符"*",匹配任意IP地址
字符串"_default_",是"*"的别名
读取配置文件失败例如:
<VirtualHost 10.1.2.3:80>
ServerAdmin ample
DocumentRoot"/www/ample"
ample
ErrorLog"ample-error_log"
TransferLog"ample-access_log"
</VirtualHost>
需要为虚拟主机指定ServerName,否则它将会从主配置继承。对于基于名称的虚拟主机,ServerName更是不可缺少,否则将继承操作系统的FQDN。
当⼀个请求到达时,将按照最佳匹配进⾏主机匹配:通配的内容越少,优先级越⾼,也就越佳。例如"192.168.100.14:80"的优先级⾼于"*:80"。如果基于名称的虚拟主机⽆法匹配上,则采⽤虚拟主机列表中的第⼀个虚拟主机作为响应主机。如果所有虚拟主机都⽆法匹配上,则采⽤从主配置段落中的主机,如果主配置段落中注释了DocumentRoot,则返回对应的错误。
具体配置⽅法,见。
1.2.9 Options和AllowOverride指令
Options启⽤或禁⽤指定⽬录下的某些特性。有效值包括:All、None、ExecCGI、FollowSymLinks、Includes、IncludesNOEXEC、Indexes、MultiViews、SymLinksIfOwnerMatch。
不指定options时,默认为all。⼀般除了提供下载服务会开启⼀个Indexes选项,其他选项都会关掉,即使⽤:
Options None
AllowOverride指令⽤于控制是否读取".htaccess"配置⽂件。
如何设置这个指令要看具体情况,有以下⼏种值,此外还可以设置为all和none,表⽰启⽤、禁⽤所有特性。
AuthConfig:基于⽤户认证时设置该值,此时将可以使⽤AuthGroupFile, AuthName, AuthType, AuthUserFile, equire等认证相关指令。
FileInfo:控制⽂档类型时使⽤该值,此时将可以使⽤ErrorDocument, SetHandler,以及⼀些URL重写的指令。
Indexes:控制⽬录索引时使⽤该值,此时可以使⽤AddIcon, DirectoryIndex。
Limit:是否允许使⽤order、allow、deny指令,这三个指令已经废弃,⽬前还存在是为了兼容⽼版本。
例如下⾯的指令使得在使⽤⾮认证类和索引控制类指令时,将产⽣服务器类的错误。
AllowOverride AuthConfig Indexes
1.2.10 Require指令
见。
1.2.11 长连接相关指令
KeepAlive指令⽤于开启和关闭长连接功能。
KeepAlive on/off
在没有开启长连接时,客户端每请求⼀个资源都需重新建⽴⼀次TCP连接,⽽使⽤了长连接后,客户端只需在最初请求⼀次TCP连接,之后就可以使⽤同⼀个TCP连接发送其他的http请求。长连接的状态是指在服务端处理完某⼀个请求后,它⽴即进⼊长连接状态以保持TCP连接不断开,等待客户端再次发送请求。
但长连接⾃⾝的缺陷是会⼀直占⽤着连接不释放,所以必须得给出⼀个长连接的超时时间。这个超时时间由KeepAliveTimeout指令控制,进⼊长连接后如果在此时间间隔内客户端还没有发送新请求,则TCP连接⾃动断开。如果在长连接状态下,客户端再次发送了请求,则服务端处理请求,并在处理完请求后⼜再次进⼊长连接状态并计算KeepAliveTimeout。
此外,还可以通过指令MaxKeepAliveRequests控制每个长连接下的TCP连接的能接受的最⼤请求数。⽆疑,这个值应该设置的⼤⼀些,设置为0表⽰⽆限制。这个指令是从数量的⾓度控制长连接的TCP应该何时断开。例如,在长连接超时时间内接受同⼀个客户端的500个请求才断开,然后该客户端再有新的请求只能重新建⽴TCP连接。
MaxKeepAliveRequests500
1.3 容器类指令
路径和条件判断容器包括:
< Directory >、< DirectoryMatch >
< Files >、< FilesMatch >
< Location >、< LocationMatch >
< IfModule >
< IfDefine >
< IfVersion >
< if >
< elseif >
< else >
陈雅婷
1.3.1 容器< Directory >和< Files >
还包括它们的正则匹配容器< DirectoryMatch >、< FilesMatch >。
< Directory >容器的作⽤是"对于匹配到的⽬录,封装⼀组指令,这些指令只作⽤于该⽬录以及它的⼦⽬录中的⽂件"。注意,< Directory >容器通常都是⽤绝对路径,即< Directory /PATH/to/DIR >,如果使⽤相对路径,则它相对于根⽂件系统的"/"。例如< directory newdir >等价于< directory /newdir >。
例如:
<Directory "/">
AllowOverride none
require all denied
</Directory>
<Directory "/usr/local/apache/htdocs">
require all granted
</Directory>
第⼀个容器表⽰拒绝所有对"/"下内容的访问,包括⼦⽬录中的⽂件,这个根是根⽂件系统的根,⽽不是ServerRoot。⽽第⼆个容器则表⽰允
许/usr/local/apache/htdocs⽬录下⽂件的访问。
由此可以想象得出,出于安全考虑,应该总是先将⽗⽬录进⾏限制,再在需要放宽权限的⼦⽬录中指定特定的权限。正如上⾯的设置,将最顶级⽬录"/"完全限制,然后在⼩范围的htdocs⽬录中放⾏。
再看< Files >容器,它针对的是某个或某些特定的能被匹配上的⽂件。它匹配的范围是它所在的上下⽂。
例如,下⾯的指令如果写在server上下⽂,那么将对任意private.html⽂件拒绝。
<Files private.html>
require all denied
</Files>
⽽如果将其写在< directory >容器中,则只对该⽬录容器中的所有private.html⽣效。由于< directory >会递归到⼦⽬录中,所以⼦⽬录中的private.html也会拒绝,但⾮private.html将被允许。
<Directory "/usr/local/apache/htdocs">
require all granted
<Files private.html>
require all denied
</Files>
</Directory>
< directory >和< files >容器可以使⽤通配符,"*"表⽰任意字符,"?"表⽰任意单个字符,"[]"表⽰范围,如[a-z]、[0-9],但是这些通配符都不能匹配"/"。所以要跨⽬录匹配时,必须显式指定各个⽬录的"/"符号。
例如,<directory /*/public.html>⽆法匹配/home/user/public.html,但directory /home/*/public.html可以匹配。
它还可以使⽤正则表达式匹配,只需使⽤⼀个"~"符号即可。这时和使⽤< DirectoryMatch >、< FilesMatch >是⼀样的,只不过Match类指令不需要使⽤"~"符号。
例如,下⾯的设置。其中后两个Directory容器是等价的。
# 匹配不区分⼤⼩写的gif/jpg/jpeg/png
<FilesMatch "\.(?i:gif|jpe?g|png)$">
Require all denied
</FilesMatch>
<Directory ~ "^/usr/local/apache/htdocs/[0-9]{3}">
DirectoryIndex digest.html
</Directory>
<DirectoryMatch "^/usr/local/apache/htdocs/[0-9]{3}">
梁朝伟和汤唯是真做
DirectoryIndex digest.html
</DirectoryMatch>
需要注意的是,httpd采⽤的pcre库提供的perl兼容正则。以下是官⽅⼿册提供的⼀个⽰例,使⽤的命名捕获语法,它将匹配/var/www/combined/⽬录下的⼀级⼦⽬录,但不进⾏递归。将每个匹配到的结果保存到命名的分组sitename中,并通过环境变量"MATCH_capturename"进⾏引⽤,其中capturename必须转为⼤写字母,因为它就是这样赋值的。
<DirectoryMatch "^/var/www/combined/(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</DirectoryMatch>
⽬前已经不能使⽤未命名的后向引⽤,例如$0,$1...。在URL重写时,正则语法⾄关重要,像grep/sed/awk中天然⽀持的基础正则和扩展正则语法虽然能解决⼤部分问题,但想要实现复杂的需求,只能使⽤语义丰富、完整的正则,如pcre提供的正则。
1.3.2 容器< Location >
该容器和< Directory >、< Files >容器差不多,都是对满⾜匹配条件的路径封装⼀组指令,这些指令只⽣效于这些能匹配的路径。但是< Location >和< Directory >、< Files >最⼤的区别是:前者匹配的⽬标是WebSpace,即匹配URL中的路径,⽽后两者匹配的是本地⽂件系统的路径。
<Location "/newdir">
......
</Location>
location⽀持三种匹配模式:
精确匹配:location的模式和URL中的路径部分精确对应。
加尾随斜线:location的模式中加了尾随斜线时,将匹配该⽬录⾥⾯的内容。
⽆尾随斜线:location的模式中没有尾随斜线时,将匹配该⽬录和⽬录⾥⾯的内容。
例如,下⾯两个容器,第⼀个将匹配/private1、/private1/和/,但不能匹配/private1other,⽽第⼆个将匹配/private2/和/,但不能匹配/private2和/private2other。
<Location "/private1">
......
</Location>
<Location "/private2/">
......
</Location>
location和sethandler指令⼀起使⽤时很⽅便。例如,开启状态信息页⾯:
<Location "/server-status">
SetHandler server-status
Require all granted
</Location>
同样,除了⽀持"*"、"?"、"[]"的通配符匹配,还⽀持"~"和LocationMatch指令的正则匹配。⽅法见上⾯的< Directory >容器。
1.3.3 < IfDefine >、< IfModule >和< IfVersion >条件判断
这三个容器都是条件判断容器,且都只在httpd启动时进⾏判断,判断为真,则封装在其内的指令⽣效,否则忽略。且都可以在条件前加⼀个"!"以实现条件的否定,⽽且都可以嵌套以实现更复杂的配置。
< IfModule >容器是指当启动时加载了某模块时,该容器内的指令⽣效。可以是静态加载的模块,或者
使⽤LoadModule指令加载的,但如果这样的话,加载对应模块的LoadModule指令必须在< IfModule >指令之前。例如:
LoadModule status_module modules/mod_status.so
<IfModule "status_module">
<Location "/server-status">
阿弟前女友SetHandler server-status
Require all granted
</Location>
</IfModule>
< IfDefine param >容器⽤于判断参数param是否已经定义,如果定义了,则条件为真,封装在其内的指令⽣效,否则忽略。加上感叹号则表⽰取反,例如< IfDefine !param >。
鞋店名大全
那么如何定义参数呢?有两种⽅法:使⽤httpd命令的"-D"选项;使⽤Define指令。
例如,在使⽤httpd启动时,加上⼀个"-D"选项定义MyName参数。
httpd -DMyName ......
或者在配置⽂件中使⽤Define指令进⾏定义,但必须在< IfDefine >容器之前定义。例如:
Define MyName
< IfDefine >可以进⾏嵌套。例如下⾯是官⽅的⼀个⽰例: