httpd2.4.6配置文件解释说明

本文httpd版本为:2.4.6

ServerRoot

先来看一下httpd.conf配置文件中的ServerRoot默认定义:

# cat /etc/httpd/conf/httpd.conf |egrep ^ServerRoot
ServerRoot "/etc/httpd"

这里我们看到 ServerRoot 后面跟的是一个目录路径,再来看一下这个目录路径里都有些什么吧。

# tree /etc/httpd
/etc/httpd
├── conf
│   ├── httpd.conf
│   ├── httpd.conf.bak
│   ├── httpd.conf.rpmsave
│   └── magic
├── conf.d
│   ├── autoindex.conf
│   ├── php.conf
│   ├── README
│   ├── userdir.conf
│   ├── virhosts.conf
│   └── welcome.conf
├── conf.modules.d
│   ├── 00-base.conf
│   ├── 00-dav.conf
│   ├── 00-lua.conf
│   ├── 00-mpm.conf
│   ├── 00-proxy.conf
│   ├── 00-systemd.conf
│   ├── 01-cgi.conf
│   └── 10-php.conf
├── logs -> ../../var/log/httpd
├── modules -> ../../usr/lib64/httpd/modules
└── run -> /run/httpd
# ll /run/httpd/
total 8
-rw-r--r--. 1 root root 8 Feb 27 03:27 authdigest_shm.96049
drwx------. 2 apache apache 40 Feb 24 11:32 htcacheclean
-rw-r--r--. 1 root root 6 Feb 27 03:27 httpd.pid

可以看出这是一个保存配置文件的目录,还有3个链接文件,分别是日志目录,模块目录和运行时PID文件目录。默认为安装目录,不需更改。

配置语法:ServerRoot directory-path

如: ServerRoot "/usr/local/apache-2.4.6"(编译安装情况下)

注意,此指令中的路径最后不要加 / 。

Listen

指定服务器监听的IP和端口。默认情况下Apache会在所有IP地址上监听。Listen是Apache2.0以后版本必须设置的指令,如果在配置文件中找不到这个指令,服务器将

无法启动。

语法:Listen [IP-address:]portnumber [protocol]

Listen指令指定服务器在那个端口或地址和端口的组合上监听接入请求。如果只指定一个端口,服务器将在所有地址上监听该端口。如果指定了地址和端口的组合,服务器将在指定地址的指定端口上监听。可选的protocol参数在大多数情况下并不需要,若未指定该参数,则将为443端口使用默认的https 协议,为其它端口使用http协议。

使用多个Listen指令可以指定多个不同的监听端口和/或地址端口组合。

默认为:Listen 80

如果让服务器接受80和8080端口上请求,可以这样设置:

Listen 80

Listen 8080

如果让服务器在两个确定的地址端口组合上接受请求,可以这样设置:

Listen 192.168.2.1:80

Listen 192.168.2.2:8080

如果使用IPV6地址,必须用方括号把IPV6地址括起来:

LoadModule

Include conf.modules.d/*.conf

2.4.6版本中所有模块加载采用了配置文件,使用Include conf.modules.d/*.conf这条指令来加载模块,这也是httpd高度模块化的一个表现。

来看一下conf.module.d/10-php.conf

# cat /etc/httpd/conf.modules.d/10-php.conf
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
<IfModule prefork.c>
LoadModule php5_module modules/libphp5.so
</IfModule>

LoadModule语法:LoadModule module filename

那么10-php.conf这个文件是怎么来的呢,经过测试当你yum install php的时候会自动在这个目录下生成这个配置文件,当yum remove php时会自动删除这个文件。

user group

User apache
Group apache

User:设置实际提供服务的子进程的用户。为了使用这个指令,服务器必须以root身份启动和初始化。如果你以非root身份启动服务器,子进程将不能够切换至非特权用户,并继续以启动服务器的原始用户身份运行。如果确实以root用户启动了服务器,那么父进程将仍然以root身份运行。

用于运行子进程的用户必须是一个没有特权的用户,这样才能保证子进程无权访问那些不想为外界所知的文件,同样的,该用户亦需没有执行那些不应当被外界执行的程序的权限。强烈建议专门为Apache子进程建立一个单独的用户和组。一些管理员使用nobody用户,但是这并不能总是符合要求,因为可能有其他程序也在使用这个用户。

Group:设置提供服务的Apache子进程运行时的用户组。为了使用这个指令,Apache必须以root初始化启动,否则在切换用户组时会失败,并继续以初始化启动时的用户组运行。

# pstree root
systemd─|
├─httpd───6*[httpd]

可以看到httpd父进程以root身份启动后生成了6个子进程。

# ps aux |grep httpd
root 1784 0.0 0.5 308440 12012 ? Ss 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1785 0.0 0.3 310636 8712 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1786 0.0 0.2 310524 6688 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1787 0.0 0.2 310524 6688 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1788 0.0 0.2 310524 6456 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1789 0.0 0.2 310524 6688 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND
apache 1790 0.0 0.2 310524 6456 ? S 18:29 0:00 /usr/sbin/httpd -DFOREGROUND

通过ps命令看到6个子进程的运行身份是apache

ServerName

ServerName:设置服务器用于辨识自己的主机名和端口号。

语法:ServerName fully-qualified-domain-name[:port]

当没有指定ServerName时,服务器会尝试对IP地址进行反向查询来推断主机名。如果在ServerName中没有指定端口号,服务器会使用接受请求的那个端口。

为了加强可靠性和可预测性,建议使用ServerName显式的指定一个主机名和端口号。

如果使用的是基于域名的虚拟主机,在段中的ServerName将是为了匹配这个虚拟主机,在"Host:"请求头中必须出现的主机名。

例如:

# cat /etc/httpd/conf.d/virhosts.conf
#virtual host 1
<VirtualHost 192.168.138.200:80>
ServerName www1.frank.com
DocumentRoot "/var/www/vhosts/www1"
ErrorLog "/var/log/httpd/www1/error_log"
CustomLog "/var/log/httpd/www1/access_log" combined
</VirtualHost>

Directory

<Directory>和</Directory>用于封装一组指令,使之仅对某个目录及其子目录生效。

语法:<Directory Directory-path> ... </Directory>

Directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串。在通配符字符串中,"?"匹配任何单个的字符,"*"匹配任何字符序列。也可以使用"[]"来确定字符范围。在"~" 字符之后也可以使用正则表达式。

如果有多个(非正则表达式)配置段符合包含某文档的目录(或其父目录),那么指令将以短目录优先的规则进行应用,并包含.htaccess文件中的指令。

正则表达式将在所有普通配置段之后予以考虑。所有的正则表达式将根据它们出现在配置文件中的顺序进行应用。

<Directory>指令不可被嵌套使用,也不能出现在<Limit>或<LimitExcept>配置段中。

# cat conf/httpd.conf |egrep -v "^#|\s{4}#" |grep -Ev "^$"
<Directory />
AllowOverride none
Require all denied
</Directory>
<Directory "/var/www">
AllowOverride None
Require all granted
</Directory>
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

AllowOverride:确定允许存在于.htaccess文件中的指令类型。

语法:AllowOverride All|None|directive-type [directive-type] ...

  • 如果此指令被设置为None ,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess文件。

  • 当此指令设置为All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中。

directive-type可以是下列各组指令之一:

  • AuthConfig  允许使用与认证授权相关的指令

  • FileInfo  允许使用控制文档类型的指令、控制文档元数据的指令、mod_rewrite中的指令、mod_actions中的Action指令

  • Indexes  允许使用控制目录索引的指令

  • Limit  允许使用控制主机访问的指令

Options[=Option,...]  允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令使用哪些选项。

AllowOverride仅在不包含正则表达式的配置段中才是有效的。在<Location>, <DirectoryMatch>, <Files>配置段中都是无效的。

Order:控制默认的访问状态与Allow和Deny指令生效的顺序。

Ordering取值范围是以下几种范例之一:

  • Deny,Allow  Deny指令在Allow指令之前被评估。默认允许所有访问。任何不匹配Deny指令或者匹配Allow指令的客户都被允许访问。

  • Allow,Deny  Allow指令在Deny指令之前被评估。默认拒绝所有访问。任何不匹配Allow指令或者匹配Deny指令的客户都将被禁止访问。

  • Mutual-failure  只有出现在Allow列表并且不出现在Deny列表中的主机才被允许访问。这种顺序与"Order Allow,Deny"具有同样效果,不赞成使用。

关键字只能用逗号分隔,它们之间不能有空格,在所有情况下每个Allow和Deny指令语句都将被评估。

Allow:控制哪些主机可以访问服务器的该区域。可以根据主机名、IP地址、 IP地址范围或其他环境变量中捕获的客户端请求特性进行控制。

语法:Allow from all|host|env=env-variable [host|env=env-variable] ...

这个指令的第一个参数总是"from",随后的参数可以有三种不同形式:如果指定"Allow from all",则允许所有主机访问,按照下述Deny和Order指令的配置;若要只允许特定的主机或主机群访问服务器,host可以用下面任何一种格式来指定:一个(部分)域名、完整的IP地址、部分IP地址、网络/掩码、网络/nnn无类别域间路由规格;第三种参数格式允许对服务器的访问由环境变量的一个扩展指定,指定"Allow from env=env-variable"时,如果环境变量env-variable存在则访问被允许,使用由mod_setenvif提供的指令,服务器用一种基于客户端请求的弹性方式提供了设置环境变量的能力。因此,这条指令可以用于允许基于像User-Agent(浏览器类型)、Referer或其他 HTTP请求头字段的访问。

Deny:控制哪些主机被禁止访问服务器的该区域。可以根据主机名、IP地址、 IP地址范围或其他环境变量中捕获的客户端请求特性进行控制。

语法:Deny from all|host|env=env-variable [host|env=env-variable] ...

此指令的参数设置和Allow指令完全相同。

DirectoryIndex:当客户端请求一个目录时寻找的资源列表。

语法:DirectoryIndex Local-url [Local-url] ...

Local-url(%已解码的)是一个相对于被请求目录的文档的URL(通常是那个目录中的一个文件)。可以指定多个URL,服务器将返回最先找到的那一个,比如:

DirectoryIndex index.html index.php

DocumentRoot

指定网站文件存放的目录路径,通常配置在主配置文件中,或虚拟主机文件中。

语法:DocumentRoot directory-path

在没有使用类似Alias这样的指令的情况下,服务器会将请求中的URL附加到DocumentRoot后面以构成指向文档的路径。

如果directory-path不是绝对路径,则被假定为是相对于ServerRoot的路径。

指定DocumentRoot时不应包括最后的"/"。

上一篇:Laravel 开启跨域请求


下一篇:C#模拟HTTP请求并发送二进制