|
通过yum安装的httpd,默认情况下其配置文件为/etc/httpd/conf/httpd.conf, 以及/etc/httpd/conf.d/*.conf。
配置文件主要有三部分组成
1
2
3
4
| [iyunv@localhost ~]# grep 'Section' /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
|
- Global Environment 全局环境配置,决定Apache服务器的全局参数
- Main server configuration 主服务配置,相当于是Apache中的默认Web站点,如果我们的服务器中只有一个站点,那么就只需在这里配置就可以了。
- Virtual Hosts 虚拟主机,虚拟主机不能与Main Server主服务器共存,当启用了虚拟主机之后,Main Server就不能使用了
配置文件的语法
指令是不区分大小写的,但是约定,指令单词的首字母大写。但是指令的值可能会区分大小写,而且有些指令可以重复使用多次。
配置文件的语法测试
1
2
3
4
5
6
| [iyunv@localhost ~]# service httpd configtest # 实际上就是调用 httpd -t
OR
[iyunv@localhost ~]# httpd -t
[iyunv@localhost ~]# service httpd reload # 重新读取配置文件
[iyunv@localhost ~]# service httpd restart # 重启服务
|
注意:大多数配置修改后,使用service httpd reload即可生效;但是修改了监听地址和端口则需要重启服务才能生效。
1、设置监听地址和端口
语法: Listen [IP:]PORT
1
2
| Listen 80 # 监听在本机所有网卡的80端口
Listen 192.168.11.101:8080 # 只监听192.168.11.101网卡的8080端口
|
注意:Listen指令可以重复使用,如果需要监听多个端口,则必须写多行Listen指令
2、配置服务器HTTP响应头
语法:ServerTokens Major|Minor|Minimal|ProductOnly|OS|Full
说明:此指令控制Server回送给客户端的响应头域是否包含关于服务器相关的描述信息。
注意:此设置将作用于整个服务器,而且不能在虚拟主机的层次启用或禁用。
3、设置保持长连接
KeepAlive配置的含义:对于HTTP/1.1的客户端来说,将会尽量的保持客户的HTTP连接,通过一个连接传送多份HTTP请求响应。这样对于客户端来说,可以提高50%左右的响应时间,而于服务器端来说则降低了更多个连接的开销。不过这个依赖于客户端是否想保持连接。IE默认是保持连接的,当你打开100个图片的网站时,IE有可能只打开2个连接,通过这两个连接传送数据,而不是开100个连接。
语法:keepAlive {on | off}
1
2
3
| MaxKeepAliveRequests 数字 # 一个连接最多可以发送多少次请求
KeepAliveTimeout 数字(单位为秒) # 连接超时时间
# KeepAliveTimeout 为持久连接保持的时间,也就是说,在这此连接结束后开始计时,多长时间内没有重新发送HTTP请求,就断掉连接。默认设置为5秒,这个值可以大点,但不能太大,否则会出现同时等候过多连接,导致多的内存被占用。
|
在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。
KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。
那么我们考虑3种情况:
1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript. 文件,多个 css 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript. 文件,一个图片文件。
3。 用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。
对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive
下面我来分析一下原因。
在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?
先看看理论分析。
打开 KeepAlive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关闭会关闭 TCP 连接,那么在关闭连接之前,必然会有一个 Apache 进程对应于该用户而不能处理其他用户,假设 KeepAlive 的超时时间为 10 秒种,服务器每秒处理 50 个独立用户访问,那么系统中 Apache 的总进程数就是 10 * 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗 2G 内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。
如果关闭 KeepAlive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么 Apache 的总进程数就是 50 * 3 = 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了 150 次 TCP 的握手和关闭的操作,因此又会多消耗一些 CPU 资源。
在看看实践的观察。
我在一组大量处理动态网页内容的服 务器中,起初打开 KeepAlive 功能,经常观察到用户访问量大时Apache进程数也非常多,系统频繁使用交换内存,系统不稳定,有时负载会出现较大波动。关闭了 KeepAlive 功能后,看到明显的变化是: Apache 的进程数减少了,空闲内存增加了,用于文件系统Cache的内存也增加了,CPU 的开销增加了,但是服务更稳定了,系统负载也比较稳定,很少有负载大范围波动的情况,负载有一定程度的降低;变化不明显的是:访问量较少的时候,系统平均 负载没有明显变化。
总结一下:
在内存非常充足的服务器上,不管是否关闭 KeepAlive 功能,服务器性能不会有明显变化;
如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭 KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定。
补充:
关于是否应该关闭 KeepAlive 选项,我觉得可以基于下面的一个公式来判断。
在理想的网络连接状况下, 系统的 Apache 进程数和内存使用可以用如下公式表达:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
换成中文:
总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数
需要特别说明的是:
[平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果 [每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。
基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。
4、DSO模块加载
语法:LoadModule 模块名称 模块路径
注意:可以使用绝对路径和相对路径,相对路径为ServerRoot定义的路径
1
2
| [iyunv@localhost ~]# httpd -M # 列出已经装载的所有DSO及非DSO模块
[iyunv@localhost ~]# httpd -l # 列出支持使用的非DSO模块
|
5、设置站点名称
语法:ServerName www.example.com:80
注意:如果设置这项,在启动apache的时候 apache会去试图反解当前主机监听的IP地址去得到主机名 如果反解不出来就会报错。并使用127.0.0.1。
解决办法:
- 启动这个选项并设置站点名称
- 添加监听地址对应的主机名 host记录
6、配置站点根目录
1
2
3
4
5
| # DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"
|
7、配置访问属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| <Directory "/var/www/html">
Options #以下为选项,一般是写成一行,这里为了方便归类,写成竖排
Indexes #缺少主页时,允许将目录中的所有文件以列表的方式发回给用户(危险)
FollowSymLinks #允许跟随符号连接所指向的原始文件(危险)
none #所有都不启用
all #所有都启用
ExecCGI #允许使用mod_cgi模块执行CGI脚本
Includes #允许使用mod_include模块实现服务器端包含(SSI)
MultiViews #允许使用mod_negotiation实现内容协商
SymLinksIfOwnerMatch #在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件
# AllowOverride controls what directives may be placed in .htaccess files.
# 控制哪些指令可以应用在.htaccess文件中,也就是.htaccess中的配置能否覆盖主配置文件中的指令
AllowOverride
None #
Option #
FileInfo #
AuthConfig #
Limit #
Order allow,deny #这两行都是基于IP访问控制的, 后面一项是默认选项(这里是deny)
Allow from all
</Directory>
|
作用:限制访问站点资源的客户端来源,即设置允许或拒绝访问服务器资源的来源主机。
配置指令:
Order allow,deny|deny,allow
Allow from all|IP地址|网络号 # 定义允许列表
Deny from all|IP地址|网络号 # 定义拒绝列表
指令说明:Order指令是用来定义allow和deny哪一个为默认法则;
写在后面的为默认法则;
写在前面的指令,没有显示定义的,即受后面指令控制。
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Order allow,deny
Allow from 172.16.0.0/16 # 仅允许这个网段内的客户端访问
Order deny,allow
Deny from 172.16.0.0/16 # 仅拒绝这个网段内的客户端访问
Order allow,deny
Allow from 172.16.0.0/16
Deny from 172.16.100.7 # 最长匹配原则 172.16.100.7是被拒绝的
Order allow,deny
Allow from all
Deny from 10.0.0.1 # 阻止一个IP
Deny from 192.168.0.0./24 # 阻止一个IP网段
|
参数说明:
Order定义allow和deny哪个为默认法则:写在后面的为默认法则,即deny,意味着写在前面的指令没有明确定义的即后面的控制。
以第二行为例,如果allow后面没有明确说明,则除此条规则外全部都是deny。
例子:
1、仅允许这个网段的IP访问
1
2
3
4
5
6
| <Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from 192.168.11.0/24
</Directory>
|
2、只禁止某个IP段的主机访问,其他全部放行
1
2
3
4
5
6
| <Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Order deny,allow
deny from 192.168.11.0/24
</Directory>
|
8、定义默认主页
1
2
| DirectoryIndex index.html index.html.var
#默认主页为index.html,会依次向后查询
|
9、配置日志功能
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| # 错误日志
ErrorLog logs/error_log
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#combined日志模版
LogFormat "%h %l %u %t \"%r\" %>s %b" common #common日志模版
LogFormat "%{Referer}i -> %U" referer #rederer日志模版
LogFormat "%{User-agent}i" agent #agent日志模版
# 访问日志
CustomLog logs/access_log combined #这里使用的是combined的模版
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时的远程用户名,没有认证时为-
%t: 收到请求时的时间;
%r: 请求报文的起始行;
%>s: 响应状态码;
%b: 响应报文的长度,单位为字节
%{Header_Name}i: 记录指定请求报文首部的内容
|
10、配置路径别名
1
2
| Alias /icons/ "/var/www/icons/"
#意味着访问http://Server_IP/icons/时,其页面文件来自于/var/www/icons/这个位置
|
11、设定默认字符集
1
| AddDefaultCharset UTF-8
|
12、告知 Apache 如何解析特定的扩展名
比如apache解析 PHP
1
2
| AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
|
但是php官方站点提到:
为了避免潜在的危险,例如上传或者创建类似 exploit.php.jpg 的文件并被当做 PHP 执行,我们不再使用 Apache 的 AddType 指令来设置。参考下面的例子,你可以简单的将需要的扩展名解释为 PHP。我们演示为增加.php。
1
2
3
| <FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
|
或者,你也想将 .php,.php2,.php3,.php4,.php5,.php6,以及 .phtml 文件都当做 PHP 来运行,我们无需额外的设置,仅需按照下面这样来:
1
2
3
| <FilesMatch "\.ph(p[2-6]?|tml)$">
SetHandler application/x-httpd-php
</FilesMatch>
|
然后,可以将 .phps 文件由 PHP 源码过滤器处理,使得其在显示时可以高亮源码,设置如下:
1
2
3
| <FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
|
|
|