構建性能優越、安全的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

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


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