设为首页 收藏本站
查看: 2225|回复: 0

[经验分享] Apache配置文件httpd.conf

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-7-30 08:49:41 | 显示全部楼层 |阅读模式
通过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回送给客户端的响应头域是否包含关于服务器相关的描述信息。
wKiom1PXBjzz1L7uAADvJVWEepY584.jpg
注意:此设置将作用于整个服务器,而且不能在虚拟主机的层次启用或禁用。

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记录

1
2
# vi /etc/hosts
172.16.100.1   www.example.com   www



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>






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-22909-1-1.html 上篇帖子: Saltstack系列之二——Targeting 下篇帖子: ubuntu 12.04安装配置SaltStack 配置文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表