构建性能优越、安全的Web服务器

一、阐述

在工作中,自己接触较多的Web服务器软件主要是ApacheNginxlighttpd,而且它们都是开源的软件;其中Aapache是用的最多的Web Server softwareApacheApache Http Server)作为排名第一的Web服务器软件,它可以运行在几乎所有的Windows/Linux/unix平台,由于其跨平台和安全性被广泛使用,是最流行的Web服务器软件之一。关于Apache的特性,不再累赘,写此篇文档主要是想通过Apache自带模块与第三方模块:mod_expiresmod_deflatempm_worker_modulemod_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

ApacheDDos模块:

51cto.com/url.php?url=http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz


提示:

关于应用软件的下载方式,你可以通过VMwareWget的方式直接下载到某个目录下,前提是你的VMware虚拟机能够访问互联网,二者是先下载至本地,然后上传至VMware虚拟机,在此推荐使用sourceCRT远程软件;关于两者的用法如下所示:

1Wget的方式

[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 \

--datadir=/application/mysql-5.1.67/data \

--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。该参数基于整个服务器监控空闲线程数。如果服务器中总的空闲线程太多,子进程将杀死多余的空闲线程。其取值范围是有限制的,大于或等于MinSpareThreadsThreadsPerChild之和。


MaxClients:参数定义服务器允许运行的最大线程数量。任何超过MaxClients限制的新请求都将进入等候队列。默认值是ServerLimitThreadsPerChild之积。因此,若需要增加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_gzipmod_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插件,测试效果如下:


五、ApacheDos/DDOS***模块(第三方)

1>模块概述

Mod_evasiveApache提供防止HTTP DosDDOS***的模块,它通过动态哈希表来检测用户请求的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

提示:通过Apacheapxs工具,动态编译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 [email protected]

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

----------------省略-------------------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章