一、闡述
在工作中,自己接觸較多的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 [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
----------------省略-------------------