首页 > 代码库 > Apache配置文件httpd.conf
Apache配置文件httpd.conf
通过yum安装的httpd,默认情况下其配置文件为/etc/httpd/conf/httpd.conf, 以及/etc/httpd/conf.d/*.conf。
配置文件主要有三部分组成
[root@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就不能使用了
配置文件的语法
指令是不区分大小写的,但是约定,指令单词的首字母大写。但是指令的值可能会区分大小写,而且有些指令可以重复使用多次。
配置文件的语法测试
[root@localhost ~]# service httpd configtest # 实际上就是调用 httpd -t OR [root@localhost ~]# httpd -t [root@localhost ~]# service httpd reload # 重新读取配置文件 [root@localhost ~]# service httpd restart # 重启服务
注意:大多数配置修改后,使用service httpd reload即可生效;但是修改了监听地址和端口则需要重启服务才能生效。
1、设置监听地址和端口
语法: Listen [IP:]PORT
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}
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定义的路径
[root@localhost ~]# httpd -M # 列出已经装载的所有DSO及非DSO模块 [root@localhost ~]# httpd -l # 列出支持使用的非DSO模块
5、设置站点名称
语法:ServerName www.example.com:80
注意:如果设置这项,在启动apache的时候 apache会去试图反解当前主机监听的IP地址去得到主机名 如果反解不出来就会报错。并使用127.0.0.1。
解决办法:
启动这个选项并设置站点名称
添加监听地址对应的主机名 host记录
# vi /etc/hosts 172.16.100.1 www.example.com www
6、配置站点根目录
# 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、配置访问属性
<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哪一个为默认法则;
写在后面的为默认法则;
写在前面的指令,没有显示定义的,即受后面指令控制。
例子:
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哪个为默认法则:写在后面的为默认法则,即deny,意味着写在前面的指令没有明确定义的即后面的控制。
以第二行为例,如果allow后面没有明确说明,则除此条规则外全部都是deny。
例子:
1、仅允许这个网段的IP访问
<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from 192.168.11.0/24 </Directory>
2、只禁止某个IP段的主机访问,其他全部放行
<Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride None Order deny,allow deny from 192.168.11.0/24 </Directory>
8、定义默认主页
DirectoryIndex index.html index.html.var #默认主页为index.html,会依次向后查询
9、配置日志功能
# 错误日志 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、配置路径别名
Alias /icons/ "/var/www/icons/" #意味着访问http://Server_IP/icons/时,其页面文件来自于/var/www/icons/这个位置
11、设定默认字符集
AddDefaultCharset UTF-8
12、告知 Apache 如何解析特定的扩展名
比如apache解析 PHP
AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
但是php官方站点提到:
为了避免潜在的危险,例如上传或者创建类似 exploit.php.jpg 的文件并被当做 PHP 执行,我们不再使用 Apache 的 AddType 指令来设置。参考下面的例子,你可以简单的将需要的扩展名解释为 PHP。我们演示为增加.php。
<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>
或者,你也想将 .php,.php2,.php3,.php4,.php5,.php6,以及 .phtml 文件都当做 PHP 来运行,我们无需额外的设置,仅需按照下面这样来:
<FilesMatch "\.ph(p[2-6]?|tml)$"> SetHandler application/x-httpd-php </FilesMatch>
然后,可以将 .phps 文件由 PHP 源码过滤器处理,使得其在显示时可以高亮源码,设置如下:
<FilesMatch "\.phps$"> SetHandler application/x-httpd-php-source </FilesMatch>
本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1532126