一、阐述
在工作中,自己接触较多的Web服务器软件主要是Apache、Nginx、lighttpd,而且它们都是开源的软件;其中Aapache是用的最多的Web Server software。Apache(Apache Http Server)作为排名第一的Web服务器软件,它可以运行在几乎所有的Windows/Linux/unix平台,由于其跨平台和安全性被广泛使用,是最流行的Web服务器软件之一。关于Apache的特性,不再累赘,写此篇文档主要是想通过Apache自带模块与第三方模块:mod_expires、mod_deflate、mpm_worker_module、mod_evasive优化服务器的性能,增加服务器安全。
二、应用环境
操作系统:
[root@Web_Server ~]# lsb_release -d
Description: CentOS release 5.8 (Final)
平台:
[root@Web_Server ~]# uname -m
x86_64
内核:
[root@Web_Server ~]# uname -r
2.6.18-308.el5
环境:
[root@Web_Server ~]# dmidecode -s system-product-name
VMware Virtual Platform--> VMware 虚拟机
三、应用软件下载
Apahce官方网站:http://mirror.bit.edu.cn/apache/httpd/httpd-2.2.23.tar.gz
国内镜像站点(sohu):
MySQL下载地址:http://mirrors.sohu.com/mysql/MySQL-5.5/mysql-5.5.30.tar.gz
PHP下载地址:http://mirrors.sohu.com/php/php-5.3.10.tar.gz
Apache防DDos模块:
提示:
关于应用软件的下载方式,你可以通过VMware以Wget的方式直接下载到某个目录下,前提是你的VMware虚拟机能够访问互联网,二者是先下载至本地,然后上传至VMware虚拟机,在此推荐使用sourceCRT远程软件;关于两者的用法如下所示:
1)Wget的方式
[root@Web_Server ~]# mkdir /downsource#存放软件的目录,统一管理
[root@Web_Server ~]# cd /downsource/#切换目录
[root@Web_Server downsource]# wget http://mirrors.sohu.com/apache/httpd-2.2.23.tar.gz
--2013-06-18 00:57:39-- http://mirrors.sohu.com/apache/httpd-2.2.23.tar.gz
ÕýÔÚ½âÎöÖ÷»ú mirrors.sohu.com... 119.188.36.70
Connecting to mirrors.sohu.com|119.188.36.70|:80... ÒÑÁ¬½Ó¡£
ÒÑ·¢³ö HTTP ÇëÇó£¬ÕýÔڵȴý»ØÓ¦... 200 OK
³¤¶È£º7374712 (7.0M) [application/octet-stream]
Saving to: `httpd-2.2.23.tar.gz'
100%[==========================================================================================>] 7,374,712 238K/s in 35s
2013-06-18 00:58:15 (206 KB/s) - `httpd-2.2.23.tar.gz' saved [7374712/7374712]
[root@Web_Server downsource]# ll#以长列的形式显示结果
-rw-r--r-- 1 root root 7374712 2012-09-11 httpd-2.2.23.tar.gz
2)通过SourceCRT的方式上传至服务器
为让SourceCRT支持上方的功能,在你的VMware中还需安装lrzsz的软件包,通过rz上传、sz下载文件,操作方式如下:
[root@Web_Server downsource]# yum list all lrzsz#查询lrzsz软件包是否已安装
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Installed Packages#已安装的软件包
lrzsz.x86_64 0.12.20-22.1 installed
提示:若发现你的系统中并没有安装lrzdz软件包,通过命令yum install lrzsz -y安装即可。
四、安装与配置
1)解压应用软件
[root@Web_Server downsource]# tar -xf httpd-2.2.23.tar.gz #解压软件
[root@Web_Server downsource]# ll
Total7220
drwxr-xr-x 11 500 500 4096 2012-08-22 httpd-2.2.23
-rw-r--r-- 1 root root 7374712 2012-09-11 httpd-2.2.23.tar.gz
提示:
-v:解压过程中,输出详细的信息。
-C:指定解压的程序目录
2)编译
提示:为了在编译时,避免出现更多的错误,建议你的系统先安装如下库文件组:
Base#命令库
Development Libraries#开发库
Development Tools#开发工具
X Software Development#x windows 软件开发库
[root@Web_Server httpd-2.2.23]# yum grouplist #查询库文件是否在Installed Groups
[root@Web_Server httpd-2.2.23]# yum grouplist
Loaded plugins: fastestmirror, security
Setting up Group Process
Loading mirror speeds from cached hostfile
Installed Groups:
Base
Development Libraries
Development Tools
......................省略...............................
X Software Development
备注:若你的系统中上述库文件包并未在Installd Groups组中,那么请使用如下命令安装:
yum groupinstall ‘库文件包组’
[root@Web_Server httpd-2.2.23]# ./configure \
>--prefix=/application/apache2.2.23/ \#指定Apache的安装路径
> --enable-substitute \#激活Apache响应内容重写和过滤
> --enable-deflate \#激活Apache的压缩传输模块
> --enable-logio \#激活Apache输入与输出日志
> --enable-expires \#激活Apache Cache-Contorl HTTP报头缓存模块
> --enable-ssl \#激活Apache 安全套接字(SSL)/传输安全层(TLS)的支持
> --enable-static-support \#激活Apache静态链接的版本支持二进制文件
> --enable-http \#激活Apache HTTP协议处理
> --enable-info \#服务器信息
> --enable-rewrite \#激活Apache 基于规则的URL操作
> --enable-so \#激活Apache DSO动态共享对象能力
> --with-mpm=worker \#激活Apache mpm worker 模块
> --with-z \#启用zlib-devel库
> --enable-mods-shared=most #启用空格分隔的列表共享模块
>--with-included-apr#启用Apache 可移植的运行库
[root@Web_Server httpd-2.2.23]# make #编译
[root@Web_Server httpd-2.2.23]# make install #编译安装
提示:./configure检测系统环境,生成MakeFile文件。
3)配置
[root@Web_Server httpd-2.2.23]# ln -s /application/apache2.2.23/ /application/apache
#建立软连接,方便将来版本升级
4)测试
1>检测Apache配置文件语法
[root@Web_Server ~]# /application/apache/bin/apachectl -t
Syntax OK
#提示:若显示的结果与此一致,则证明Web服务可以正常启动,当编译安装完成后,没有修改配置文件httpd.conf参数,其结果应该都是Syntax OK。
2>启动Web服务
[root@Web_Server ~]# /application/apache/bin/apachectl start#启动Web服务
[root@Web_Server ~]# netstat -lnpt | grep 80#检查服务端口80
tcp 0 0 :::80 :::* LISTEN 23866/httpd
3>通过Curl方式测试服务是否已经正常工作
[root@Web_Server ~]# curl -I http://192.168.10.171
HTTP/1.1 200 OK#返回状态码200表示正常
Date: Tue, 18 Jun 2013 07:39:57 GMT
Server: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8e-fips-rhel5 DAV/2
Last-Modified: Sat, 20 Nov 2004 20:16:24 GMT
ETag: "241c66-2c-3e9564c23b600"
Accept-Ranges: bytes
Content-Length: 44
Content-Type: text/html
提示:此篇文档主要讲述的是Web性能优化及安全防御,因需要测试Apache mod_deflate模块的性能,所需LAMP环境,Apache的安装与测试已经完成,这里紧提供MySQL、PHP的安装参数,如此便不详细讲述安装步骤。
MySQL安装参数如下:
./configure --prefix=/application/mysql-5.1.67 \
--with-unix-socket-path=/application/mysql-5.1.67/tmp/mysql.sock \
--enable-local-infile \
--with-extra-charsets=complex \
--with-pthread \
--with-mysqld-user=mysql \
--with-big-tables \
--with-plugins=innobase \
--with-embedded-server \
--with-mysqlmanager \
--with-server-suffix \
--enable-assembler \
--with-client-ldflags=-all-static \
--with-mysqld-ldflags=-all-static
PHP安装参数如下:
./configure --prefix=/application/php5.3.10
--with-config-file-path=/application/php-5.3.10/etc/
--with-mysql=/application/mysql-5.1.67/
--enable-soap
--enable-sockets
--enable-sqlite-utf8
--enable-shared
--enable-static
--with-mysqli=/application/mysql-5.1.67/bin/mysql_config
--with-pcre-dir
--with-jpeg-dir
--with-png-dir
--with-freetype-dir
--with-gd
--enable-ftp
--enable-dba
--with-pcre-dir
--with-iconv-dir=/usr/local/libiconv/
#libiconv下载地址:http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz
--without-pear
--with-curl
--with-curlwrappers
--enable-mbstring
--with-zlib-dir
--with-apxs2=/application/apache2.2.23/bin/apxs
4>配置
[root@Web_Server httpd-2.2.23]# vim /application/apache/conf/httpd.conf
添加如下信息:
#Define Apache worker module
<IfModule mpm_worker_module>
ServerLimit 100
ThreadLimit 200
StartServers 5
MaxClients 2500
MinSpareThreads 50
maxSpareThreads 200
ThreadsPerChild 100
MaxRequestsPerChild 1000
</IfModule>
提示:以上各参数含义详解
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
ServerLimit:参数定义服务器允许配置的上限进程数,与ThreadLimit参数结合使用,可设置MaxClients允许配置的最大数值。
ThreadLimit:参数定义每个进程可配置的线程数上限。此参数定义了每个进程可配置线程数ThreadsPerChlid上限,默认值是64.
StartServers:参数定义服务器启动时建立的子进程数,默认为3;可使用ps aux | grep httpd |grep -v grep查看服务器开启的子进程数。
MinSpareThreads:参数定义服务器最小空闲线程数,默认值为75。该参数基于整个服务器监控空闲线程数,如果服务器的总空闲线程数太少,子进程将产生新的空闲线程。
MaxSpareThreads:参数定义服务器最大空闲线程数,默认值是250。该参数基于整个服务器监控空闲线程数。如果服务器中总的空闲线程太多,子进程将杀死多余的空闲线程。其取值范围是有限制的,大于或等于MinSpareThreads与ThreadsPerChild之和。
MaxClients:参数定义服务器允许运行的最大线程数量。任何超过MaxClients限制的新请求都将进入等候队列。默认值是ServerLimit与ThreadsPerChild之积。因此,若需要增加MaxClients必须同事增加ServerLimit的值。
ThreadsPerChild:参数定义每个子进程建立的常驻执行线程数,默认值为25.子进程在启动时建立这些线程后就不在建立新的线程了。
MaxRequestsPerChlid:参数定义每个子进程在其生存期内允许的最大请求数量。当达到限制后,子进程将结束。如果MaxRequestsPerChild值为0,则子进程永远不会结束。
# Define Apache mod_deflate compress module
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE#开启deflate压缩
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-httpd-php
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 - Lowest 1)#定义压缩级别
DeflateCompressionLevel 7
备注:mod_deflate模块使用DeflateCompressionLevel参数定义压缩级别,参数值对应的范围:1-9,级别越低压缩速度越快,但压缩率低;级别越高压缩速度就慢,但压缩率高。
略知更详细的信息请操作官方文档:http://httpd.apache.org/docs/2.0/mod/mod_deflate.html
</IfModule>
提示:
在Web服务器Apache上利用Gzip压缩算法进行压缩的模块有两种:mod_gzip与mod_deflaten,而两者之间的区别在于版本上的差异、压缩速度、压缩率、CPU资源。由于Apache1.x系列的版本并没有内置压缩模块,所以利用第三方模块Mod_gzip来进行压缩,而在Apache2.x系列的版本都内置了Mod_deflate压缩模块用以取代mod_gzip压缩模块,代码也简洁易懂。在压缩速度上mod_deflate模块要略快于mod_gzip模块,而在压缩比上mod_deflate模块要低于mod_gzip模块压缩量的5%左右;在系统资源的开销上mod_deflate模块优于mod_gzip模块,这就意味着在高流量下,使用mod_deflate可能会比使用mod_gzip模块加载速度更好,可以提高用户的访问速度,提高服务器系统的负载能力。
4>检测配置文件语法
[root@Web_Server downsource]# /application/apache2.2.23/bin/apachectl -t
Syntax OK
5>重新加载配置文件,让其生效
[root@Web_Server downsource]# /application/apache2.2.23/bin/apachectl graceful
6>测试压缩效果
#提示:
我的测试环境已经部署了LAMP环境,并结合织梦DedeCMS发布网站,这样做是为了能够测试出mod_deflate模块的压缩效果。
注意:使用Firefox浏览器,并且安装了YSlow插件,测试效果如下:
五、Apache防Dos/DDOS攻击模块(第三方)
1>模块概述
Mod_evasive是Apache提供防止HTTP Dos或DDOS攻击的模块,它通过动态哈希表来检测用户请求的URL;判断同一个IP地址每秒几次请求相同的页面或在某一时间段进行大量的并发请求,当匹配mod_evasive模快中定义的参数值,就调用Iptables命令,通过防火墙规则直接drop。
2>应用模块下载
官方网站:ttp://www.zdziarski.com/
[root@Web_Server downsource]#
wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
--2013-06-1803:22:42-- http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
Resolving www.zdziarski.com... 64.111.125.136
Connecting to www.zdziarski.com|64.111.125.136|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 20454 (20K) [application/x-tar]
Saving to: `mod_evasive_1.10.1.tar.gz'
100%[======================================>] 20,454 35.9K/s in 0.6s
2013-06-18 03:22:43 (35.9 KB/s) - `mod_evasive_1.10.1.tar.gz' saved [20454/20454]
2>安装
[root@Web_Server downsource]# cd mod_evasive#切换目录
#动态编译模块
[root@Web_Server mod_evasive]# /application/apache2.2.23/bin/apxs -i -a -c mod_evasive20.c
#检查Apache配置文件中是否加载了mod_evasive20.so模块
[root@Web_Server mod_evasive]# grep evasive /application/apache2.2.23/conf/httpd.conf
LoadModule evasive20_module modules/mod_evasive20.so
提示:通过Apache的apxs工具,动态编译mod_evasive模块之后,会在Apache的配置文件中自动添加一行参数,如上所示。
3>配置
[root@Web_Server mod_evasive]# vim /application/apache2.2.23/conf/httpd.conf
#Define Apache prevent Dos or DDOS module
<IfModule mod_evasive20.c>
DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 30
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 60
DOSEmailNotify 349614755@qq.com
DOSSystemCommand "iptables -A INPUT -s %s -j DROP"
DOSLogDir "/tmp"
DOSwhiteList 127.0.0.1
</IfModule>
提示:以上各参数代表的含义如下:
DOSHashTableSize:哈希表大小,数值越大占用的内存也就更多。
DOSPageCount:客户端访问同一页面的时间间隔的请求数量阀值。
DOSSiteCount:客户端请求站点的时间间隔计数阀值。
DOSPageInterval:页面间隔计数阀值,默认为1秒的间隔。
DOSSiteInterval:站点间隔计数阀值,默认为1秒的间隔。
DOSBlockingPeriod:阻塞期间,客户端会被阻塞,如果他们被添加到阻止列表的时间(以秒计)的量。在此期间,所有从客户端的后续请求将导致在一个403请求页面和定时器复位。
DOSEmailNotify:每当有列入黑名单的IP地址,将发送到参数所定义的电子邮件中。
DOSSystemCommand:每当有新列入黑名单的IP地址时执行的系统命令。%s代表被列入黑名单中的IP地址。
DOSLogDir:临时锁定机制,默认情况下为/tmp。
DOSWhiteList:可信的客户端IP地址,可以被列入白名单,以确保他们从来没有否认。
4>检查配置文件语法
[root@Web_Server mod_evasive]# /application/apache2.2.23/bin/apachectl -t
Syntax OK
5>Aapche服务的优雅重启
[root@Web_Server mod_evasive]# /application/apache2.2.23/bin/apachectl graceful
6>测试
提示:
当客户端对同一页面的的请求超过DOSPageCount定义的参数值,就会返回403错误当符合DOSPageInterval定义的参数值后,才允许再次访问同一页面。
当有新的IP地址被添加至黑名单时,就会被锁定在DOSLogDir定义的临时目录/tmp,产生以dos-IP的文件,并根据DOSEmailNotify参数定义的邮件地址发送一封邮件,如下所示:
[root@Web_Server mod_evasive]# ll /tmp
Total24
-rw-r--r-- 1 daemon daemon 6 06-18 07:23 dos-127.0.0.1
-rw-r--r-- 1 daemon daemon 6 06-18 07:15 dos-192.168.8.138
-rw-r--r-- 1 daemon daemon 6 06-18 06:59 dos-192.168.8.83
drwx------ 2 root root 4096 06-17 19:24 gconfd-root
srwxr-xr-x 1 root root 0 06-17 19:24 mapping-root
邮件内容如下:
7>可以通过mod_evasive模块自带的perl脚本测试,操作如下:
注意:mod_evasive模块自带的测试脚本并没有执行权限,所有需要赋予脚本x权限。
[root@Web_Server mod_evasive]# chmod 755 test.pl
[root@Web_Server mod_evasive]# ./test.pl
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
HTTP/1.1 403 Forbidden
----------------省略-------------------