Apache配置与应用

Apache HTTP Server之所以受到众多企业的青睐,得益于其代码开源、跨平台、功能 模块化、可灵活定制等诸多优点,不仅性能稳定,在安全性方面的表现也十分出色。

Apache 连接保持

HTTP 是属于应用层的面向对象协议,基于 TCP协议之上的可靠传输。每次在进行 HTTP 连接之前,需要先进行TCP连接,在HTTP连接结束后要对TCP连接进行终止,每个TCP连接都需要进行三次握手与四次断开。HTTP协议不会对之前发生过的请求和响应进行管理,所以建立与关闭连接对于 HTTP 而言会消耗更多的内存与 CPU 资源。能不能允许通过同一个TCP连接发出多个请求,从而减少与多个连接相关的延迟,解决办法就是连接保持。

对于 HTTP/1.1,就是尽量地保持客户端的连接,通过一个连接传送多个 HTTP 请求响 应,对于客户端可以提高50%以上的响应时间,对于服务器可以降低资源开销。 Apache通过设置配置文件httpd.conf中相关的连接保持参数开启与控制连接保持功能。

KeepAlive

决定是否打开连接保持功能,后面接 OFF 表示关闭,接 ON 表示打开, 可以根据网站的并发请求量决定是否打开,即在高并发时打开连接保持功能,并发量不高时 关闭此功能。

KeepAliveTimeout

表示一次连接多次请求之间的最大间隔时间,即两次请求之间超过该时间连接就会自动断开,从而避免客户端占用连接资源。

MaxKeepAliveRequests

用于设置在一次长连接中可以传输的最大请求数量,超过此最大请求数量就会断开连接,最大值的设置决定于网站中网页的内容,一般设置数量会多于网站中所有的元素。

Apache 的访问控制

为了更好地控制对网站资源的访问,可以为特定的网站目录添加访问授权。这里介绍客户机地址限制、用户授权限制,这两种访问控制方式都应用于 httpd.conf 配置文件中 的目录区域 …… 范围内。

客户机地址限制

通过 Require 配置项,可以根据客户端的主机名或IP地址来决定是否允许客户端访问。 在 httpd服务的主配置文件的、、、配置段中均可以 使用 Require 配置项来控制客户端的访问。使用 Require 配置项时,需要设置客户端地址以构成完整的限制策略,地址形式可以是 IP 地址、网络地址、主机名或域名。当Require配置项之后为“all”时,表示匹配任意地址。限制策略的格式如下所示。

  • Require all granted:允许所有主机访问;
  • Require all denied:拒绝所有主机访问;
  • Require local:仅允许本地主机访问;
  • Require [not] host <主机名或域名列表>:允许或拒绝指定主机或域名访问;
  • Require [not] ip :允许或拒绝指定 IP 地址网络访问。

通常情况下,网站服务器是对所有客户机开放的,网页文档目录并未做任何限制,因此 使用的是“Require all granted”的策略,表示允许从任何客户机访问,策略格式如下所示。

  1. <Directory "/usr/local/httpd/htdocs">
  2. …… //省略部分内容
  3. Require all granted
  4. </Directory>

定义限制策略时,多个不带“not”的Require配置语句之间是“或”的关系,即任意一条 Require 配置语句满足条件均可访问。若既出现了不带“not”的Require 配置语句,又出现了带“not”的Require配置语句,则配置语句之间是“与”的关系,即同时满足所有Require配置 语句才能访问。

需要使用“仅允许”的限制策略时,应使用Require配置语句明确设置允许策略,只允许 一部分主机访问。例如,若只希望 IP 地址为 173.17.17.2 的主机能够访问,目录区域应做 如下设置。

  1. <Directory "/usr/local/httpd/htdocs/wwwtest">
  2. …… //省略部分内容
  3. Require ip 173.17.17.2
  4. </Directory>

反之,需要使用“仅拒绝”的限制策略时,灵活使用 Require 与 Require not 配置语句设 置拒绝访问策略,仅禁止一部分主机访问。在使用 not 禁止访问时要将其置于 容器中,并在容器中设置相应的限制策略。例如,若只希望禁止来自两个内网网段192.168.0.0/24和192.168.1.0/24的主机访问,但允许其他任何主机访问,可以使用如下限制策略。

  1. <Directory "/usr/local/httpd/htdocs/wwwroot">
  2. …… //省略部分内容
  3. <RequireAll>
  4. Require all granted
  5. Require not ip 192.168.0.0/24 192.168.1.0/24
  6. </RequireAll>
  7. </Directory>

注:

  • 在此元素中包含的规则,拒绝优先执行
  • 在此元素中包含的规则,允许优先执行

用户授权限制

httpd 服务器支持使用摘要认证(Digest)和基本认证(Basic)两种方式。使用摘要认 证需要在编译httpd之前添加“–enable-auth-digest”选项,但并不是所有的浏览器都支持摘要认证;而基本认证是httpd服务的基本功能,不需要预先配置特别的选项。

基于用户的访问控制包含认证(Authentication)和授权(Authorization)两个过程。认证是指识别用户身份的过程,授权是指允许特定用户访问特定目录区域的过程。下面将以 基本认证方式为例,添加用户授权限制。

1、创建用户认证数据文件

httpd 的基本认证通过校验用户名、密码组合来判断是否允许用户访问。授权访问的用 户账号需要事先建立,并保存在固定的数据文件中。使用专门的 htpasswd 工具程序,可以 创建授权用户数据文件,并维护其中的用户账号。

使用 htpasswd 工具时,必须指定用户数据文件的位置,添加“-c”选项表示新建立此文 件。例如,执行以下操作可以新建数据文件/usr/local/httpd/conf/.awspwd,其中包含一个名 为 webadmin 的用户信息。

  1. [root@www conf]# cd /usr/local/httpd/
  2. [root@www httpd]# htpasswd -c /usr/local/httpd/conf/.awspwd webadmin
  3. New password:
  4. Re-type new password:
  5. Adding password for user webadmin
  6. [root@www httpd]# cat /usr/local/httpd/conf/.awspwd
  7. webadmin:$apr1$QcjNNVJc$TnHWCIRTqWl6gGR09FiNR/

若省略“-c”选项,则表示指定的用户数据文件已经存在,用于添加新的用户或修改现有用户的密码。例如,需要向.awspwd 数据文件中添加一个新用户 kcce 时,可以执行以下操作。

  1. [root@www httpd]# htpasswd /usr/local/httpd/conf/.awspwd kcce
  2. New password:
  3. Re-type new password:
  4. Adding password for user kcce
  5. [root@www httpd]# cat /usr/local/httpd/conf/.awspwd
  6. webadmin:$apr1$QcjNNVJc$TnHWCIRTqWl6gGR09FiNR/
  7. kcce:$apr1$9qGWySUq$n3DX283f1I5iPQBzg.lEc1

2、添加用户授权配置

有了授权用户账号以后,还需要修改httpd.conf配置文件,在特定的目录区域中添加授 权配置,以启用基本认证并设置允许哪些用户访问。例如,若只允许.awspwd数据文件中的任一用户访问系统,可以执行以下操作。

  1. [root@www ~]# vim /usr/local/httpd/conf/httpd.conf
  2. …… //省略部分内容
  3. <Directory "/usr/local/httpd/htdocs">
  4. …… //省略部分内容
  5. AuthName "DocumentRoot"
  6. AuthType Basic
  7. AuthUserFile /usr/local/httpd/conf/.awspwd
  8. Require valid-user
  9. </Directory>
  10. [root@www ~]# systemctl restart httpd //重启服务使配置生效

在上述配置内容中,相关配置项的含义如下。

  • AuthName:定义受保护的领域名称,该内容将在浏览器弹出的认证对话框中显示。
  • AuthType:设置认证的类型,Basic 表示基本认证。
  • AuthUserFile:设置用于保存用户账号、密码的认证文件路径。
  • require valid-user:要求只有认证文件中的合法用户才能访问。其中,valid-user 表示所有合法用户,若只授权给单个用户,可改为指定的用户名(如 webadmin)。

3、验证用户访问授权

当访问系统时,浏览器会首先弹出认证对话框,只有输入正确的用户名和密码后才能查看日志分析报告,否则将拒绝访问。

Apache优化管理 - 图1

Apache 日志分割

随着网站的访问量越来越大,默认情况下Apache服务器产生的单个日志文件也会越来 越大,如果不对日志进行分割,那么如果日志文件占用磁盘空间很大的话势必会将整个日志文件删除,这样也丢失了很多对网站比较宝贵的信息,而这些日志可以用来进行访问分析、网络安全监察、网络运行状况监控等。 另外,如果服务器遇到故障时,运维人员要打开日志文件进行分析,打开的过程会消耗 很长时间,也势必会增加处理故障的时间。因此管理好这些海量的日志对网站的意义很大,我们会将Apache的日志进行按每天的日期自动分割。下面介绍两种方法均可实现。

1、Apache 自带 rotatelogs 分割工具

首先我们将 Apache主配置文件httpd.conf打开,配置网站的日志文件转交给 rotatelogs 分割处理。

  1. [root@www httpd]# vim /usr/local/httpd/conf/httpd.conf
  2. ErrorLog "|/usr/local/bin/rotatelogs -l /usr/local/httpd/logs/error_%Y%m%d.log 86400"
  3. CustomLog "|/usr/local/bin/rotatelogs -l /usr/local/httpd/logs/access_%Y%m%d.log 86400" common
  4. [root@www httpd]# systemctl restart httpd.service
  5. [root@www httpd]# ll logs/
  6. total 76
  7. -rw-r--r-- 1 root root 411 Jul 13 22:08 access_20190713.log
  8. -rw-r--r--. 1 root root 35226 Jul 11 23:00 access_log
  9. -rw-r--r-- 1 root root 259 Jul 13 22:07 error_20190713.log
  • 其中 ErrorLog 行是错误日志,不用太多关注,一般不会记录错误的访问,-l 表示使用 本地时间代替UTC时间作为时间基准。
  • CustomLog 行是定义访问日志格式,86400的单位是秒,表示一天,即每天生成一个新的日志文件。

2、使用第三方工具 cronolog 分割

cronolog主要和Web服务器配置使用,可以将日志文件按时间分割,易于管理和分析。

安装:

  1. [root@www httpd]# yum install cronolog -y

配置:

  1. [root@www httpd]# vim /usr/local/httpd/conf/httpd.conf
  2. ErrorLog "|/usr/sbin/cronolog /usr/local/httpd/logs/%Y/%m/%d/error_%Y%m%d.log"
  3. CustomLog "|/usr/sbin/cronolog /usr/local/httpd/logs/%Y/%m/%d/access_%Y%m%d.log" common
  4. [root@www httpd]# systemctl restart httpd.service
  5. [root@www httpd]# tree -C logs/
  6. logs/
  7. ├── 2019
  8. └── 07
  9. └── 13
  10. └── access_20190713.log

AWStats 日志分析

在 httpd 服务器的访问日志文件access_log中,记录了大量的客户机访问信息,通过分析这些信息,可以及时了解Web站点的访问情况,如每天或特定时间段的访问 IP 数量, 点击量最大的页面等。本节将介绍如何安装 AWStats 日志分析系统,以完成自动化的日志分析与统计工作。

1、部署AWStats分析系统

AWStats是使用Perl语言开发的一款开源日志分析系统,它不仅可用来分析Apache 网 站服务器的访问日志,也可以用来分析 Samba、Vsftpd、IIS 等服务的日志信息。结合crond等计划任务服务,可以对不断增长的日志内容定期进行分析。

1. 安装AWStats软件包

awstats 软件包的安装非常简单,只需将软件包解压到httpd服务器中的/usr/local/目录下即可。

  1. [root@www ~]# wget https://prdownloads.sourceforge.net/awstats/awstats-7.7.tar.gz
  2. [root@www ~]# tar zxvf awstats-7.7.tar.gz
  3. [root@www ~]# mv awstats-7.7 /usr/local/awstats

2. 为要统计的站点建立配置文件

AWStats 系统支持统计多个网站的日志文件,通常以网站名称来区分不同的站点。因此,在执行日志文件分析之前,需要为每个Web站点建立站点统计配置文件,借助于 AWStats系统提供的awstats_configure.pl脚本可以简化创建过程。执行脚本之后将会进入一个交互式的配置过程,将会检查 awstats 的安装目录、httpd服务的配置文件路径、日志记录格式等系统环境,并提示用户指定站点名称、设置配置文件路径。

  1. [root@www ~]# cd /usr/local/awstats/tools/
  2. [root@www tools]# ./awstats_configure.pl
  3. ----- AWStats awstats_configure 1.0 (build 20140126) (c) Laurent Destailleur -----
  4. This tool will help you to configure AWStats to analyze statistics for
  5. one web server. You can try to use it to let it do all that is possible
  6. in AWStats setup, however following the step by step manual setup
  7. documentation (docs/index.html) is often a better idea. Above all if:
  8. - You are not an administrator user,
  9. - You want to analyze downloaded log files without web server,
  10. - You want to analyze mail or ftp log files instead of web log files,
  11. - You need to analyze load balanced servers log files,
  12. - You want to 'understand' all possible ways to use AWStats...
  13. Read the AWStats documentation (docs/index.html).
  14. -----> Running OS detected: Linux, BSD or Unix
  15. -----> Check for web server install
  16. Enter full config file path of your Web server.
  17. Example: /etc/httpd/httpd.conf
  18. Example: /usr/local/apache2/conf/httpd.conf
  19. Example: c:\Program files\apache group\apache\conf\httpd.conf
  20. Config file path ('none' to skip web server setup):
  21. > /usr/local/httpd/conf/httpd.conf #输入Apache主配置文件
  22. -----> Check and complete web server config file '/usr/local/httpd/conf/httpd.conf'
  23. Warning: You Apache config file contains directives to write 'common' log files
  24. This means that some features can't work (os, browsers and keywords detection).
  25. Do you want me to setup Apache to write 'combined' log files [y/N] ? y #是否将Apache日志格式设置成combined
  26. Add 'Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"'
  27. Add 'Alias /awstatscss "/usr/local/awstats/wwwroot/css/"'
  28. Add 'Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"'
  29. Add 'ScriptAlias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"'
  30. Add '<Directory>' directive
  31. AWStats directives added to Apache config file.
  32. -----> Update model config file '/usr/local/awstats/wwwroot/cgi-bin/awstats.model.conf'
  33. File awstats.model.conf updated.
  34. -----> Need to create a new config file ?
  35. Do you want me to build a new AWStats config/profile
  36. file (required if first install) [y/N] ? y #是否创建一个新的AWStats配置文件
  37. -----> Define config file name to create
  38. What is the name of your web site or profile analysis ?
  39. Example: www.mysite.com
  40. Example: demo
  41. Your web site, virtual server or profile name:
  42. > www.shengzhe.com #Apache网站的域名
  43. -----> Define config file path
  44. In which directory do you plan to store your config file(s) ?
  45. Default: /etc/awstats
  46. Directory path to store config file(s) (Enter for default):
  47. >
  48. -----> Create config file '/etc/awstats/awstats.www.shengzhe.com.conf'
  49. Config file /etc/awstats/awstats.www.shengzhe.com.conf created.
  50. -----> Restart Web server with '/sbin/service httpd restart'
  51. Redirecting to /bin/systemctl restart httpd.service
  52. -----> Add update process inside a scheduler
  53. Sorry, configure.pl does not support automatic add to cron yet.
  54. You can do it manually by adding the following command to your cron:
  55. /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=www.shengzhe.com
  56. Or if you have several config files and prefer having only one command:
  57. /usr/local/awstats/tools/awstats_updateall.pl now
  58. Press ENTER to continue...
  59. A SIMPLE config file has been created: /etc/awstats/awstats.www.shengzhe.com.conf
  60. You should have a look inside to check and change manually main parameters.
  61. You can then manually update your statistics for 'www.shengzhe.com' with command:
  62. > perl awstats.pl -update -config=www.shengzhe.com
  63. You can also read your statistics for 'www.shengzhe.com' with URL:
  64. > http://localhost/awstats/awstats.pl?config=www.shengzhe.com
  65. Press ENTER to finish...

3、后续配置工作

Apache 2.4 以上版本,因为重新定义了访问权限,所以需要将自动生成的 awstats 访问权限进行相应修改。同时,加载 CGI 模块。

  1. [root@www httpd]# vim /usr/local/httpd/conf/httpd.conf
  2. ErrorLog "|/usr/local/bin/rotatelogs -l /usr/local/httpd/logs/error_%Y%m%d.log 86400"
  3. CustomLog "|/usr/sbin/cronolog /usr/local/httpd/logs/%Y/%m/%d/access_%Y%m%d.log " combined
  4. <IfModule !mpm_prefork_module>
  5. LoadModule cgid_module modules/mod_cgid.so
  6. </IfModule>
  7. <IfModule mpm_prefork_module>
  8. LoadModule cgi_module modules/mod_cgi.so
  9. </IfModule>
  10. <Directory "/usr/local/awstats/wwwroot">
  11. Options None
  12. AllowOverride None
  13. #Order allow,deny
  14. #Allow from all
  15. Require all granted
  16. </Directory>
  17. [root@www httpd]# systemctl restart httpd

4、修改站点统计配置文件

为站点www.shengzhe.com建立好配置文件以后,还需要对其做进一步的修改。修改的内容主要包括指定要分析的Web日志文件和指定用来存放统计数据的目录。

  1. [root@www ~]# vim /etc/awstats/awstats.www.shengzhe.com.conf
  2. LogFile="/usr/local/httpd/logs/%YYYY-0/%MM-0/%DD-0/access_%YYYY-0%MM-0%DD-0.log"
  3. DirData="/var/lib/awstats"
  4. [root@www tools]# mkdir /var/lib/awstats

5、执行日志分析,并设置cron计划任务

使用 AWStats 提供的awstats_updateall.pl脚本,可以更新所有站点(根据站点配置文 件)的日志统计数据。执行该脚本时,系统将会自动分析新增的日志内容,并将分析结果更 新到统计数据库中。

  1. [root@www ~]# /usr/local/awstats/tools/awstats_updateall.pl now
  2. Running '"/usr/local/awstats/wwwroot/cgi-bin/awstats.pl" -update -config=www.shengzhe.com -configdir="/etc/awstats"' to update config www.shengzhe.com
  3. Create/Update database for config "/etc/awstats/awstats.www.shengzhe.com.conf" by AWStats version 7.7 (build 20180105)
  4. From data in log file "/usr/local/httpd/logs/2019/07/14/access_20190714.log"...
  5. Phase 1 : First bypass old records, searching new record...
  6. Direct access after last parsed record (after line 8)
  7. Jumped lines in file: 8
  8. Found 8 already parsed records.
  9. Parsed lines in file: 9
  10. Found 0 dropped records,
  11. Found 0 comments,
  12. Found 0 blank records,
  13. Found 0 corrupted records,
  14. Found 0 old records,
  15. Found 9 new qualified records.

由于 Web 日志文件的内容是在不断更新的,为了及时反馈网站访问情况,日志分析工 作也需要定期、自动地执行。通过crond服务可设置计划任务,一般建议每五分钟执行一次日志分析任务。

  1. [root@www ~]# crontab -e
  2. */5 * * * * /usr/local/awstats/tools/awstats_updateall.pl now

2、访问 AWStats 分析系统

访问站点http://192.168.154.142/awstats/awstats.pl?config=www.shengzhe.com后,即可看到AWStats日志分析系统的统计页面,该页面分别按访问时间、用户来源、所用浏览器等类别列出各种详细的网站访问情况,若此处访问出现 403 Forbidden 错误,关闭 selinux 即可正常访问。

Apache优化管理 - 图2

在该页面中,拖动窗口右侧的滚动条即可查看整个分析报告内容;或者单击左侧导航栏 中的链接,可以选择查看其中的部分内容。

在“按参观时间”类别下,可以查看每小时、每天、每周、每月的网站访问次数、网页数、文件数等信息。

在“浏览器统计”类别下,可以查看用户的参观时间、所用的操作系统、浏览器版本、搜 索本网站的关键词等相关信息。

在访问 AWStats 系统时,需要指定awstats目录、脚本位置、统计目标等信息,这样 既不便于记忆,输入时也比较麻烦。为了简化操作,可以在Web根目录下建立一个自动跳转的HTML网页。

  1. [root@www ~]# vim /usr/local/httpd/htdocs/awb.html
  2. <html>
  3. <head>
  4. </head>
  5. <body>
  6. <a href='http://192.168.154.142/awstats/awstats.pl?config=www.shengzhe.com'>awstats</a>
  7. </body>
  8. </html>

Apache网页优化

在使用Apache作为Web服务器的过程中,只有对Apache服务器进行适当的优化配置,才能让Apache发挥出更好的性能;反过来说,如果Apache的配置非常糟糕,Apache可能无法正常为我们服务。因此,根据实际的应用需求对Apache服务器的配置进行一定的优化是必不可少的。

一、Apache网页优化

介绍Apache的网页压缩和网页缓存技术,对于提升Apache的性能提升有非常明显的效果。

网页压缩

网站的访问速度是由多个因素所共同决定的,这些因素包括应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的一个因素是Apache本身的响应速度,因此当运维人员为网站性能所苦恼时,第一个需要着手进行处理的便是尽可能的提升Apache的执行速度,可以使用网页压缩提升应用程序的速度。而且非常重要的是,它完全不需要任何的成本,只不过是会让服务器CPU占用率稍微提升一两个百分点或者更少。

1、gzip介绍

gzip是一种流行的文件压缩算法,现在的应用十分广泛,尤其是在Linux平台。当应用gzip压缩到一个纯文本文件时,效果是非常明显的,大约可以减少70%以上的文件大小。利用Apache中的gzip模块,我们可以使用gzip压缩算法来对Apache服务器发布的网页内容进行压缩后再传输到客户端浏览器。这样经过压缩后实际上降低了网络传输的字节数,最明显的好处就是可以加快网页加载的速度,节省流量,改善用户的浏览体验。

2、HTTP压缩的过程

Web服务器接收到浏览器的HTTP请求后,检查浏览器是否支持HTTP压缩(Accept-Encoding 信息),如果浏览器支持HTTP压缩,Web服务器检查请求文件的后缀名, 如果请求文件是HTML、CSS等静态文件,Web服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件。如果请求文件的压缩文件不存在,Web服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件;如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件。如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中。

3、Apache的压缩模块

Apache1.x系列没有内建网页压缩技术,使用的是额外的第三方mod_gzip模块来执行压缩。而Apache2.x官方在开发的时候,就把网页压缩考虑进去,内建了mod_deflate这个模块,用以取代mod_gzip。两者都是使用的gzip压缩算法,它们的运作原理是类似的。

mod_deflate压缩速度略快而mod_gzip的压缩比略高。一般默认情况下,mod_gzip会比mod_deflate多出4%~6%的压缩量。

一般来说mod_gzip对服务器CPU的占用要高一些。mod_deflate是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate需要较少的资源来压缩文件。这意味着在高流量的服务器,使用mod_deflate可能会比mod_gzip加载速度更快。简而言之,如果网站访问量较小,想要加快网页的加载速度,就使用 mod_gzip。虽然会额外耗费一些服务器资源,但也是值得的。如果网站访问量较大、使用的是共享虚拟主机,且所分配系统资源有限,那么使用mod_deflate 将会是更好的选择。

另外,从Apache 2.0.45开始,mod_deflate模块可使用DeflateCompressionLevel 指令来设置压缩级别。该指令的值可为1至(压缩速度最快,最低的压缩质量)9(最慢的压缩速度,压缩率最高)之间的整数,其默认值为6(压缩速度和压缩质量较为平衡的值)。这个简单的变化更是使得mod_deflate可以轻松媲美mod_gzip的压缩。

4、mod_deflate模块

  1. 检查是否安装了mod_deflate模块
  1. [root@www filters]# httpd -D DUMP_MODULES | grep deflate
  1. 安装mod_deflate模块
  1. #进入下载的源码包模块目录中
  2. [root@www filters]# cd /usr/src/httpd-2.4.39/modules/filters
  3. [root@www filters]# apxs -i -a -c mod_deflate.c
  4. [root@www filters]# systemctl restart httpd
  5. [root@www filters]# httpd -D DUMP_MODULES | grep deflate
  6. deflate_module (shared)

apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。

因此,要使用这个扩展机制,你的平台必须支持DSO特性,而且Apache httpd 必须内建了mod_so模块。apxs工具能自动探测是否具备这样的条件,你也可以自己用这个命令手动探测:

  1. [root@www httpd]# httpd -l
  2. Compiled in modules:
  3. core.c
  4. mod_so.c
  5. http_core.c

该命令的输出列表中应该有mod_so.c模块。如果所有这些条件均已具备,则可以很容易地借助apxs安装你自己的DSO模块以扩展Apache服务器的功能。

  • -i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录中。
  • -a 此选项自动增加一个LoadModule行到httpd.conf文件中,以激活此模块,或者,如果此行已经存在,则启用之。
  • -A 与-a选项类似,但是它增加的LoadModule命令有一个井号前缀(#),即此模块已经准备就绪但尚未启用。
  • -c 此选项表示需要执行编译操作
  1. 编辑配置文件,启用压缩
  1. [root@www httpd]# vim /usr/local/httpd/conf/httpd.conf
  2. LoadModule deflate_module modules/mod_deflate.so
  3. <IfModule mod_deflate.c>
  4. AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript
  5. DeflateCompressionLevel 9
  6. SetOutputFilter DEFLATE
  7. </IfModule>
  8. [root@www httpd]# systemctl restart httpd

第一行代表对什么样的内容启用gzip压缩,第二行代表压缩级别,第三行代表启用deflate模块对本站点的输出进行gzip压缩。
4. 测试压缩是否生效

Apache优化管理 - 图3

网页缓存

网页缓存是将一部分经常不会改变和变动很少的页面缓存,下次浏览器再次访问这些页面时,不需要再次去下载这些页面,从而提高了用户的访问速度。

Apache的mod_expires模块会自动生成页面头部信息中的Expres标签和Cache-Control标签,客户端浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求,从而降低客户端的访问频率和次数,达到减少不必要的流量和增加访问速度的目的。

配置mod_expires模块的步骤:

  1. 检查mod_expires模块是否安装
  1. [root@www ~]# apachectl -D DUMP_MODULES | grep expires
  2. [root@www ~]#

如果显示deflate_expires (shared),表示已经安装。
\2. 安装mod_expires模块

  1. [root@www metadata]# cd /usr/src/httpd-2.4.39/modules/metadata/
  2. [root@www metadata]# apxs -i -a -c mod_expires.c
  3. [root@www metadata]# systemctl restart httpd
  4. [root@www metadata]# apachectl -D DUMP_MODULES | grep expires
  5. expires_module (shared)
  1. 配置mod_expires模块启用
  1. [root@www httpd]# vim conf/httpd.conf
  2. LoadModule expires_module modules/mod_expires.so
  3. <IfModule mod_expires.c>
  4. ExpiresActive On
  5. ExpiresDefault "access plus 60 seconds"
  6. </IfModule>
  7. [root@www httpd]# systemctl restart httpd

ExpiresDefault和ExpiresByType指令同样能够用易懂的语法格式进行定义:

  • ExpiresDefault “ [plus] {}”
  • ExpiresByType type/encoding “ [plus] {}”

其中是下列之一:

  • access
  • now (等价于’access ‘)
  • modification

plus关键字是可选的。必须是整数,是下列之一:

  • years
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds

有效期可以通过增加””子句进一步调整:

  • ExpiresByType text/html “access plus 1 month 15 days 2 hours”
  • ExpiresByType image/gif “modification plus 5 hours 3 minutes”

注意,如果你使用基于最后修改日期的设置,”Expires:”头将不会被添加到那些并非来自于磁盘文件的内容。这是因为这些内容并不存在”最后修改时间”的属性。

  1. <IfModule mod_expires.c>
  2. #GIF有效期为1个月(秒数)
  3. ExpiresByType image/gif A2592000
  4. ExpiresByType image/jpeg A2592000
  5. ExpiresByType image/png A2592000
  6. ExpiresByType image/x-icon A2592000
  7. ExpiresByType application/x-javascript A604800
  8. ExpiresByType text/plain A604800
  9. #HTML文档的有效期是最后修改时刻后的一星期
  10. ExpiresByType text/html M604800
  11. </IfModule>
  • “M”表示源文件的最后修改时刻,
  • “A”表示客户端对源文件的访问时刻。
  • 后面的时间则以秒计算
  1. 测试缓存是否生效

Apache优化管理 - 图4


二、Apache安全优化

Apache 的默认配置除了性能可以优化外,还需要对安全性进行相应的配置。 默认配置能保证服务器正常提供服务,但Apache作为一个软件,必然也会存在一些漏洞,尽可能的降低潜在的风险,是管理员必须掌握的内容。

隐藏版本信息

测试默认Apache的状态信息

  1. [root@www httpd]# curl -I http://192.168.154.142
  2. HTTP/1.1 200 OK
  3. Date: Mon, 15 Jul 2019 14:19:44 GMT
  4. Server: Apache/2.4.39 (Unix) PHP/7.2.19 #版本详细信息
  5. Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
  6. ETag: "2d-432a5e4a73a80"
  7. Accept-Ranges: bytes
  8. Content-Length: 45
  9. Cache-Control: max-age=60
  10. Expires: Mon, 15 Jul 2019 14:20:44 GMT
  11. Content-Type: text/html
  1. 主配置中启用httpd-default.conf
  1. [root@www httpd]# vim conf/httpd.conf
  2. # Various default settings
  3. Include conf/extra/httpd-default.conf
  1. 修改httpd-default.conf
  1. [root@www httpd]# vim conf/extra/httpd-default.conf
  2. ServerTokens Prod
  3. ServerSignature Off
  4. [root@www httpd]# systemctl restart httpd
  1. 重新测试
  1. [root@www httpd]# curl -I http://192.168.154.142
  2. HTTP/1.1 200 OK
  3. Date: Mon, 15 Jul 2019 14:26:43 GMT
  4. Server: Apache #没有版本信息了
  5. Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
  6. ETag: "2d-432a5e4a73a80"
  7. Accept-Ranges: bytes
  8. Content-Length: 45
  9. Cache-Control: max-age=60
  10. Expires: Mon, 15 Jul 2019 14:27:43 GMT
  11. Content-Type: text/html

如果你需要彻底将版本之类的信息进行改头换面,你就需要在编译之前做准备或者进行从新编译了。在重新编译时,修改源码包下include目录下的ap_release.h文件

  1. #define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服务的供应商名称
  2. #define AP_SERVER_BASEPROJECT "Apache HTTP Server" #服务的项目名称
  3. #define AP_SERVER_BASEPRODUCT "Apache" #服务的产品名
  4. #define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
  5. #define AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
  6. #define AP_SERVER_PATCHLEVEL_NUMBER 39 #补丁级别
  7. #define AP_SERVER_DEVBUILD_BOOLEAN 0

修改成自己想要的,然后编译安装之后,对方就彻底不知道你的版本号了。

配置防盗链

一般来说,我们浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个Http请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行,如果发现其中还有图片,那么客户端的浏览器会再次发送一条Http请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面要经过多次发送Http请求才能够被完整的显示。

基于这样的机制,就会产生盗链问题:如果一个网站中没有其页面中所说图片信息,那么它完全可以链接到其他网站的图片信息上。这样,没有任何资源的网站利用了别的网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益, 另一方面又加重了服务器的负担。

http标准协议中有专门的Referer字段记录,它的作用如下:

  • 可以追溯上一个入站地址是什么。
  • 对于资源文件,可以跟踪到包含显示它的网页地址是什么,因此所有防盗链方法都是基于这个Referer字段。

Apache防盗链需要安装mod_rewrite模块

  1. 检查模块是否安装
  1. [root@www ~]# apachectl -M | grep rewrite
  2. [root@www ~]#
  1. 安装mod_rewirte模块
  1. [root@www modules]# cd /usr/src/httpd-2.4.39/modules/mappers/
  2. [root@www mappers]# apxs -i -a -c mod_rewrite.c
  3. [root@www mappers]# systemctl restart httpd
  4. [root@www mappers]# apachectl -M | grep rewrite
  5. rewrite_module (shared)
  1. 调整Apache配置文件
  1. [root@www httpd]# vim conf/httpd.conf
  2. LoadModule rewrite_module modules/mod_rewrite.so
  1. 配置防盗链

mod_rewrite模块主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言,可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。

基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能。

基于目录级的(.htaccess),要注意一点就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。

开启rewrite功能后,需要设置RewriteCond指令,它定义了匹配规则,如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule指令,如果不匹配,则后面的规则不会执行;RewriteRule则定义需要重定向到的路径。

第一种方法:

  1. #配置在全局配置文件中
  2. RewriteEngine On
  3. RewriteCond %{HTTP_REFERER} !^$
  4. RewriteCond %{HTTP_REFERER} !^http://shengzhe.com/.*$ [NC]
  5. RewriteCond %{HTTP_REFERER} !^http://shengzhe.com$ [NC]
  6. RewriteCond %{HTTP_REFERER} !^http://www.shengzhe.com/.*$ [NC]
  7. RewriteCond %{HTTP_REFERER} !^http://www.shengzhe.com$ [NC]
  8. RewriteRule .*\.(gif|jpg|swf)$ http://www.shengzhe.com/about/nolink.png[R,NC,L]

第二种方法:

  1. <Directory "/usr/local/httpd/htdocs">
  2. …略…
  3. AllowOverride ALL //改为 ALL
  4. …略…
  5. RewriteEngine On //加入 mode_rewrite 模块内容
  6. RewriteCond %{HTTP_REFERER} !^http://kxr.com/.*$ [NC]
  7. RewriteCond %{HTTP_REFERER} !^http://kxr.com$ [NC]
  8. RewriteCond %{HTTP_REFERER} !^http://www.kxr.com/.*$ [NC]
  9. RewriteCond %{HTTP_REFERER} !^http://www.kxr.com/$ [NC]
  10. RewriteRule .*\.(gif|jpg|swf)$ http://www.kxr.com/error.png
  11. </Directory>
  1. rewrite相关选项的解释
  • RewriteEngine On #启用rewrite,要想rewrite起作用,必须要写上
  • RewriteCond test-string condPattern #写在RewriteRule之前,可以有1或N条,用于测试rewrite的匹配条件
  • RewriteRule Pattern Substitution #规则
  • %{HTTP_REFERER}:服务器变量,HTTPReferer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTP Referer 中统计出每天有多少用户点击我主页上的链接访问他的网站。
  • [NC] 指的是不区分大小写
  • [R] 强制重定向redirect
  • 字母[L]表示如果能匹配本条规则,那么本条规则是最后一条(Last),忽略之后的规则
  • RewriteCond %{HTTP_REFERER} !^$ 上面这一行意在允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。
  • RewriteCond %{HTTP_REFERER} !benet.com/.$ [NC]
    RewriteCond %{HTTP_REFERER} !www.benet.com/.
    $ [NC]
    设置允许访问的 HTTP 来源,包括网站自身。
  • RewriteRule .*.(gif|jpg|swf)$ http://www.benet.com/about/nolink.png [R,NC,L]
    将不满足referer条件的访问重定向至nolink.png。

附:匹配规则表:
规则 描述
%{HTTP_REFERER} 浏览header中的链接字段,存放一个链接的URL,代表是从哪个 链接访问所需的网页
!^ 不以后面的字符串开头
.*$ 以任意字符结尾
NC 不区分大小写
R 强制跳转
? 匹配 0 到 1 个字符
* 匹配 0 到多个字符
+ 匹配 1 到多个字符
^ 字符串开始标志
$ 字符串结束标志
. 匹配任何单字符

Apache网页深入优化

Apache的默认配置可以保证基本运行服务,但在生产环境中,有时需要把服务器性能发挥到最大化。本章介绍如何对服务器进行压力测试,然后对相应参数进行优化,充分发挥服务器的作用。

一、ab压力测试

网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环,只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。

性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。ab 是apache自带的压力测试工具,非常实用,可以模拟多线程并发请求,测试服务器负载压力。它不仅可以对apache服务器进行网站访问压力测试,也可以对其它类型的服务器进行压力测试,比如nginx、tomcat、IIS等。ab对发出负载的计算机要求很低,既不会占用很多CPU,也不会占用太多的内存,但却会给目标服务器造成巨大的负载。

在带宽不足的情况下,最好是本机进行测试,建议使用内网的另一台或者多台服务器通过内网进行测试,这样得出的数据,准确度会高很多。远程对Web服务器进行压力测试,往往效果不理想,因为网络延时过大或带宽不足,得到的测试结果并不准确。

在进行性能调整优化过程中,优化前先使用ab进行压力测试,优化后再进行压力测试,对比两次测试的结果,看优化效果是否明显,再决定是否启用优化方案。

1、ab工具所在位置

  1. [root@www ~]# which ab
  2. /usr/local/bin/ab
  3. [root@www ~]# ll /usr/local/bin/ab
  4. lrwxrwxrwx. 1 root root 23 Jul 8 22:36 /usr/local/bin/ab -> /usr/local/httpd/bin/ab

2、ab工具命令格式

ab的命令格式是:ab [options] [http://]hostname[:port]/path

  • “[options]”: 表示ab工具的参数
  • http://”: 表示http前缀可以省略
  • “hostname”: 表示访问的主机
  • “:port”: 表示端口号可以省略
  • “/path”:表示请求的资源路径

其中参数可以设置请求数和时间等

参数 描述
-n 测试会话中所执行的请求总数,默认时,仅执行一个请求
-c 并发产生的请求个数。默认是一次一个
-t 测试所进行的最大秒数
-v 设置显示信息的详细程度

3、使用ab工具测试

输入ab测试命令,以1000为并发数,10000为总请求数,查看测试结果

  1. [root@www ~]# ab -c 1000 -n 10000 http://192.168.154.142/index.html
  2. This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
  3. Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
  4. Licensed to The Apache Software Foundation, http://www.apache.org/
  5. Benchmarking 192.168.154.142 (be patient)
  6. Completed 1000 requests
  7. Completed 2000 requests
  8. Completed 3000 requests
  9. Completed 4000 requests
  10. Completed 5000 requests
  11. Completed 6000 requests
  12. Completed 7000 requests
  13. Completed 8000 requests
  14. Completed 9000 requests
  15. Completed 10000 requests
  16. Finished 10000 requests
  17. Server Software: Apache
  18. Server Hostname: 192.168.154.142
  19. Server Port: 80
  20. Document Path: /index.html
  21. Document Length: 45 bytes
  22. Concurrency Level: 1000
  23. Time taken for tests: 37.969 seconds
  24. Complete requests: 10000
  25. Failed requests: 117
  26. (Connect: 0, Receive: 0, Length: 117, Exceptions: 0)
  27. Total transferred: 3407004 bytes
  28. HTML transferred: 448290 bytes
  29. Requests per second: 263.37 [#/sec] (mean)
  30. Time per request: 3796.943 [ms] (mean)
  31. Time per request: 3.797 [ms] (mean, across all concurrent requests)
  32. Transfer rate: 87.63 [Kbytes/sec] received
  33. Connection Times (ms)
  34. min mean[+/-sd] median max
  35. Connect: 0 153 301.9 90 3088
  36. Processing: 53 915 4665.9 129 37843
  37. Waiting: 3 641 4107.6 105 37829
  38. Total: 121 1067 4667.7 221 37956
  39. Percentage of the requests served within a certain time (ms)
  40. 50% 221
  41. 66% 249
  42. 75% 375
  43. 80% 398
  44. 90% 875
  45. 95% 2162
  46. 98% 21025
  47. 99% 37948
  48. 100% 37956 (longest request)

主要参数如下表:

参数 描述
Server Software http 响应数据的头信息
Server Hostname 请求的 url 中的主机名称
Server Port web 服务器软件的监听端口
Document Path 请求的 url 根的绝对路径
Document Length http 响应数据的正文长度
Concurrency Level 并发的用户数
Time taken for tests 所有这些请求被处理完成所花费的时间总和
Complete requests 表示总请求数
Failed requests 失败的请求总数
Total transferred 请求的响应数据长度总和
Requests per second 服务器的吞吐率,每秒处理的请求数
Time per request 用户平均请求等待时间
Time per request 每个请求实际运行时间的平均值
Percentage of the requests served within a certain time (ms) 描述每个请求处理时间的分布情况

4、可以关闭压缩后再测试,比较两个结果


二、Apache工作模式

Apache 2.X 支持插入式并行处理模块,称为多路处理模块(MPM)。对类UNIX 系统,有几个不同的MPM可供选择,如worker MPM、prefork MPM、event MPM,不同的MPM会影响到Apache的速度和可伸缩性。

编译安装支持工作模式

需要apr 1.5以上的版本,默认YUM安装版本一般都不符合要求

1、下载最新版apr及apr-util

  1. [root@www ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-1.7.0.tar.gz
  2. [root@www ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache//apr/apr-util-1.6.1.tar.gz

2、编译安装Apache

  1. [root@www ~]# tar jxvf httpd-2.4.39.tar.bz2 -C /usr/src/
  2. [root@www ~]# tar zxvf /root/apr-1.7.0.tar.gz -C /usr/src/httpd-2.4.39/srclib/
  3. [root@www ~]# tar zxvf /root/apr-util-1.6.1.tar.gz -C /usr/src/httpd-2.4.39/srclib/
  4. [root@www ~]# cd /usr/src/httpd-2.4.39/srclib/
  5. [root@www srclib]# mv apr-1.7.0/ apr
  6. [root@www srclib]# mv apr-util-1.6.1/ apr-util
  7. [root@www srclib]# cd /usr/src/httpd-2.4.39/
  8. [root@www httpd-2.4.39]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-mpms-shared=all --with-mpm=event --with-included-apr
  9. [root@www httpd-2.4.39]#make
  10. [root@www httpd-2.4.39]#make install
  11. #查看安装后的MPM模块
  12. [root@www httpd-2.4.39]# ls /usr/local/httpd/modules/ | grep mpm
  13. mod_mpm_event.so
  14. mod_mpm_prefork.so
  15. mod_mpm_worker.so
  • –enable-mpms-shared=all 构建MPM为动态模块,并安装此平台支持的所有MPM模块
  • –with-mpm=event 默认安装的MPM工作模式
  • –with-included-apr 包含apr及apr-util

3、工作模式切换

编辑Apache主配置文件,使用LoadModule指令内容可以选择不同的MPM

  1. [root@www ~]# vim /usr/local/httpd/conf/httpd.conf
  2. LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
  3. #LoadModule mpm_event_module modules/mod_mpm_event.so
  4. #LoadModule mpm_worker_module modules/mod_mpm_worker.so
  5. #打开MPM工作模式配置文件
  6. Include conf/extra/httpd-mpm.conf

4、查看当前MPM工作模式

  1. [root@www ~]# apachectl -V | grep -i mpm
  2. Server MPM: prefork

prefork 模式

1、prefork工作模式介绍

prefork模式实现了一个非线程型的、预派发的web服务器。它是要求将每个请求相互独立的情况下最好的MPM,这样若一个请求出现问题就不会影响到其他请求。具有很强的自我调节能力,只需要很少的配置指令调整。最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,以致需要使用的内存超出物理内存的大小。

出于稳定性和安全性考虑,不建议更换apache2的运行方式,使用系统默认 prefork模式即可。另外很多php模块不能工作在worker模式下,例如redhat linux自带的php也不能支持线程安全。

2、prefork工作方式

其主要工作方式是:当Apache服务器启动后,mpm_prefork模块会预先创建多个子进程(默认为5个),每个子进程只有一个线程,当接收到客户端的请求后,mpm_prefork模块再将请求转交给子进程处理,并且每个子进程同时只能用于处理单个请求。如果当前的请求数将超过预先创建的子进程数时,mpm_prefork模块就会创建新的子进程来处理额外的请求。Apache总是试图保持一些备用的或者是空闲的子进程用于迎接即将到来的请求。这样客户端的请求就不需要在接收后等候子进程的产生。

由于在mpm_prefork模块中,每个请求对应一个子进程,因此其占用的系统资源相对其他两种模块而言较多。不过mpm_prefork模块的优点在于它的每个子进程都会独立处理对应的单个请求,这样,如果其中一个请求出现问题就不会影响到其他请求。Prefork在效率上要比Worker要高,但是内存使用大得多不擅长处理高并发的场景。

3、prefork的参数

参数 描述
ServerLimit 最大进程数
StartServers 启动的时候创建的进程数量
MinSpareServers 最少空闲进程数量
MaxSpareServers 最多空闲进程数量
MaxRequestWorkers 允许同时的最大接入请求数量,任何>超过 MaxRequestWorkers限制的请求将进入等候队列 在apache2.3.1以前的版本MaxRequestWorkers 被称为MaxClients,旧的名字仍旧被支持。
MaxConnectionsPerChild 每个进程处理的最大请求数,达到请求数, 进程即被销毁,如果设置为0,子进程永远 不会结束。在Apache2.3.9 之前称之为 MaxRequestsPerChild。

4、prefork参数调优

prefork调整参数需要在调整的每一步都对服务器进行负载压力测试,以确保服务器稳定的基础上实现最高的性能。

(1) MaxRequestWorkers(MaxClients)参数的最佳值在很大程度上取决于内存大小。此参数调优的目标即当Apache处在最多子进程数状态时,服务器不会使用swap。如果此数值的设置过大,则Apache在访问高峰期会创建过多的子进程,导致Linux使用swap来作为内存。而swap的效率非常低,并且会导致磁盘压力增大,形成恶性循环。以服务器的内存是2G为例,也就是2000M,MaxRequestWorkers(MaxClients)设置为2000除以2,也就是1000。

(2)ServerLimit参数的设置与MaxRequestWorkers(MaxClients)相同设为1000,限制创建子进程的最大数量。

(3)MaxSpareServers是最多空闲进程”,按上面参数举例,当这1000个进程处理完了所有的请求后,这些进程便都“空闲”了。此时Apache便会销毁一些进程以释放资源。设置为30,最后系统会保留30个子进程在内存中运行,等待用户请求。如果希望Apache能在访问高峰期过后能够迅速的释放资源, 则 MaxSpareServers应该设置得略低,让Apache迅速销毁过多的子进程;

( 4)MinSpareServers是最少空闲进程。这里设置为10,当Apache启动时, 如果空闲的进程少于10个,则会以一定频率创建新的进程,直到满足这个数值10。这样设计的目的是为了让Apache更迅速的应付潜在的访问高峰。如果希望Apache能够迅速应对突如其来的访问高峰,则应将MinSpareServers设置
高一点,让Apache创建较多的空闲(备用)进程。

(5)StartServers表示Apache在启动的时候创建的进程数量。如果访问压力很大,那么进程数会逐步增加,直到达到MaxClients设置的数量。一般设置与MinSpareServers相同即可。

(6)MaxConnectionsPerChild表示每个进程处理的最大请求数。当任何一个子进程处理的请求数达到MaxConnectionsPerChild后,便会销毁。如果设置为0,表示不限制(即永远不销毁)。这种机制的作用是防止潜在的内存泄露。如果Apache的某个模块,或者某段php脚本可能导致内存泄露, 而处理进程却又永远不退出,则很可能造成服务器内存剧增最终崩溃。 当开启这个机制后,无论是否存在内存泄露,都会让进程在处理一定数量的请求后退出,同时释放所有内存。MaxConnectionsPerChild对性能的影响则没有那么明显。如果MaxConnectionsPerChild设置偏小,则Apache可能会在访问高峰期时,把大量的CPU消耗在创建/杀死进程上,造成不必要的CPU损耗。这里我们设置为5000,生产环境需要相应的压力测试以决定数值。

按以上参数设置案例:

  1. [root@www ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf
  2. <IfModule mpm_prefork_module>
  3. ServerLimit 1000
  4. StartServers 10
  5. MinSpareServers 10
  6. MaxSpareServers 30
  7. MaxRequestWorkers 1000
  8. MaxConnectionsPerChild 5000
  9. </IfModule>

worker 模式

1、worker工作模式介绍

worker模式使web服务器支持混合的多线程多进程。由于使用线程来处理请求,所以可以处理海量请求,而系统资源的开销小于基于进程的MPM。但是,它也使用了多进程,每个进程又有多个线程,以获得基于进程的MPM的稳定性。

2、worker工作方式

Worker模块每个进程能够拥有的线程数量是固定的,服务器会根据负载情况增加或减少进程数量。一个单独的控制进程(父进程)负责子进程的建立,而每个子进程能够建立一定数量的服务线程和一个监听线程,监听线程监听接入请求并将其传递给服务线程处理和应答。

Apache总是会维持一个备用(spare)或是空闲的服务线程池,客户端无须等待新线程或新进程的建立即可得到服务。父进程一般都以root身份启动,绑定80端口,随后Apache以较低权限的用户建立子进程和线程。User和Group 指令用于配置Apache子进程的运行用户。子进程要对网页内容拥有读权限,但应该尽可能限制它的权限。

3、worker参数讲解

参数 描述
ServerLimit 最大进程数, 默认值是”16”
ThreadLimit 每个子进程的最大线程数, 默认值是“64”
StartServers 服务器启动时建立的子进程数, 默认值是”3”
MaxRequestWorkers 允许同时接受的最大接入请求数量(最大线程数量)
MinSpareThreads 最小空闲线程数,默认值是”75”
MaxSpareThreads 设置最大空闲线程数。 默认值是”250”
ThreadsPerChild 每个子进程建立的常驻的执行线程数。 默认值是 25
MaxConnectionsPerChild 设置每个子进程在其生存期内允许伺服的最大请求 数量。设置为”0”,子进程将永远不会结束

4、worker 参数调优

worker由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。

同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数。

MaxRequestWorkers设置了同时连入的clients最大总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是 64, 如果负载较大,64也是不够的。这时要显式使用ThreadLimit指令,它的最大缺省值是20000。Worker模式下所能同时处理的请求总数是由子进程总数乘以
ThreadsPerChild值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是 20000) 。 需要注意的是,如果显式声明了ServerLimit,那么它乘以 ThreadsPerChild的值必须大于等于MaxRequestWorkers,而且MaxRequestWorkers必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值。

设置案例:

  1. [root@www ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf
  2. <IfModule mpm_worker_module>
  3. ServerLimit 40
  4. ThreadLimit 200
  5. StartServers 20
  6. MinSpareThreads 25
  7. MaxSpareThreads 100
  8. ThreadsPerChild 200
  9. MaxRequestWorkers 1000 #内存的1/2 (以M为单位)
  10. MaxConnectionsPerChild 1000
  11. </IfModule>

调整完使用ab进行测试,实际测试的时候,每次完成时间都会有所不同,需要多次调整参数进行测试,才能找到当前环境最优的方案。

event 模式

这是Apache最新的工作模式,是worker模式的变种,它把服务进程从连接中分离出来,和worker模式不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event模式不能很好的支https的访问(HTTP 认证相关的问题)。

prefork模式使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM 在效率上要比 Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:它可以使用那些没有处理好线程安全的第三方模块, 并且对于那些线程调试困难的平台而言,它也更容易调试一些。

worker模式使用多个子进程,每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说,在一个高流量的HTTP服务器上,Worker MPM是个比较好的选择,因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也有不完善的地方,如果一个线程崩溃,整个进程就会连同其所有线程一起”死掉”。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为”每个线程都是安全的”。实际应用中推荐prefork的方式。

总的来说,event模式的处理速度都高于prefork和worker,然而它需要的cpu 和memory资源也稍多于prefork和worker。Apache能更好的为有特殊要求的站点定制。例如,要求更高伸缩性的站点可以选择使用线程的MPM,即worker或 event;需要可靠性或者与旧软件兼容的站点可以使用prefork。就使用PHP而言,fastCGI和php-fpm是更推荐的使用模式。

event的调优参数

和worker基本一样

1) StartServers 10

设置服务器启动时建立的子进程数量。因为子进程数量动态的取决于负载的轻重,所以一般没有必要调整这个参数。

2) MinSpareServers 10

设置空闲子进程的最小数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers,那么Apache将以最大每秒一个的速度产生新的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。

3) MaxSpareThreads 75

设置空闲子进程的最大数量。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。只有在非常繁忙机器上才需要调整这个参数。将此参数设的太大通常是一个坏主意。如果你将该指令的值设置为比 MinSpareServers小,Apache将会自动将其修改成”MinSpareServers+1″。

4) ServerLimit 2000

服务器允许配置的进程数上限。只有在你需要将MaxClients设置成高于默认值256的时候才需要使用。要将此指令的值保持和MaxClients一样。修改此指令的值必须完全停止服务后再启动才能生效,以restart方式重启动将不会生效。

5) MaxClients/MaxRequestWorkers 256

用于客户端请求的最大请求数量(最大子进程数),任何超过MaxClients限制的请求都将进入等候队列。默认值是256,如果要提高这个值必须同时提高 ServerLimit 的值。建议将初始值设为(以Mb为单位的最大物理内存/2),然后根据负载情况进行动态调整。比如一台4G内存的机器,那么初始值就是 4000/2=2000。

6) MaxRequestsPerChild /MaxConnectionsPerChild 0

设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild”个请求后将自动销毁。0意味着无限,即子进程永不销毁。内存较大的服务器可以设置为0或较大的数字。内存较小的服务器不妨设置成30、 50、 100。所以一般情况下,如果你发现服务器的内存直线上升,建议修改该参数试试。


目录属性优化

给指定的文件夹配置对应的访问权限是 Apache 配置中的基础应用, 也是 Apache 使用者的必备技能之一。在Apache配置文件中,给指定目录设置基本的访问权限,主要通过Require指令实现访问控制。

1、目录属性介绍

Apache 的常用目录属性如表所示:

参数 作用
Options 设置在特定目录使用哪些特性
AllowOverride 允许存在于.htaccess 文件中的指令类型
Require 设置目录的访问控制

其中Options的参数如表所示:

参数 作用
Indexes 当用户访问该目录时,但没有指定要访问哪个文件,而且 目录下不存在默认网页时,返回目录中的文件和子目录列表
MultiViews 内容协商的多重视图,Apache的一个智能特性。当访问 目录中不存在的对象时, 如访问http://192.168.16.177/icons/a, apache会查找这个目录下所有a.*文件,如有a.gif文件, 会将a.gif返回,而不返回错误信息
ExecCGI 允许在该目录下执行CGI脚本
FollowSymLinks 在该目录下允许文件系统使用符号连接
Includes 允许服务器端包含功能
IncludesNoExec 允许服务器端包含功能,但禁止执行CGI脚本
All 包含除了MultiViews之外所有特性,如果没有 Options语句,默认为All

举例说明:

  1. <Directory "/usr/local/httpd/htdocs">
  2. Options Indexes FollowSymLinks
  3. AllowOverride None
  4. Require all granted
  5. </Directory>
  • AllowOverride None: 当AllowOverride被设置为None时,不搜索该目录下的.htaccess文件,能减小服务器开销。.htaccess文件是针对一个目录的属性文件,而现在我们设置的是整个站点的属性。
  • Require all granted:表示允许所有用户访问

2、目录属性测试

1) Indexes参数

把apache的工作目录/usr/local/httpd/htdocs中创建新的文件夹list, 复制index.html到list里面,且重新命名为1.html,2.html,3.html。

  1. [root@www httpd]# cd htdocs/
  2. [root@www htdocs]# mkdir list
  3. [root@www htdocs]# cp index.html list/1.html
  4. [root@www htdocs]# cp index.html list/2.html
  5. [root@www htdocs]# cp index.html list/3.html

用浏览器访问http://192.168.154.142/list。根据上面的目录属性Indexes,当没有指定访问的网页和默认网页存在,返回给客户端文件列表

2) FollowSymLinks参数

在/usr/local/httpd/htdocs/list 目录中创建符号链接

  1. [root@www htdocs]# cd list/
  2. [root@www list]# ln -s /usr/share/man doc

再次请求网页,FollowSymLinks发挥作用,符号链接的目录被显示出来。

3) AllowOverride

AllowOverride All 可在.htaccess文件中使用所有访问控制,.htaccess可以对不同目录进行不同权限的配置。.htaccess后缀名可以更改,在/usr/local/httpd/conf/extra/httpd-default.conf中,由AccessFileName参数更改。

3、目录优化建议

Options 应该设置为None,以防止目录上内容暴露出去,造成安全隐患。

AllowOverride应该设置为None,禁止使用.htaccess文件,而将目录访问控制放在主配置文件的和之间。

Require 指令的设置根据企业需要决定,用于控制客户端访问。