apache配置文件參數優化


1.CentOS5.8 x86_64位 採用最小化安裝,系統經過了基本優化篇
2.apache版本:httpd-2.2.29
3.源碼包存放位置:/home/oldboy/tools
4.源碼包編譯安裝位置:/application/

一.設置日誌輪循
    1.下載並安裝cronolog

    [root@ser200 tools]# cd /home/oldboy/tools
    [root@ser200 tools]# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
    [root@ser200 tools]# tar zxf cronolog-1.6.2.tar.gz
    [root@ser200 tools]# cd cronolog-1.6.2
    [root@ser200 cronolog-1.6.2]# ./configure
    [root@ser200 cronolog-1.6.2]# make&&make install

    2.配置apache使用cronolog
    [root@ser200 cronolog-1.6.2]# vi /application/apache/conf/extra/httpd-vhosts.conf

    CustomLog "|/usr/local/sbin/cronolog /app/logs/access_%Y%m%d.log" combined
    ErrorLog "|/usr/local/sbin/cronolog /app/logs/error_%Y%m%d.log"

    3.更多日誌格式參考
    按天輪詢(生產環境常見用法,推薦使用):
        CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
    按小時輪詢(生產環境較常見用法):
        CustomLog "|/usr/local/sbin/cronolog  /app/logs /access_www_ %Y%m%d%H.log" combined

二.設置404頁面
    爲了提升網站的用戶體驗和SEO優化需要.強烈建議設置404跳轉頁面
    第一種:在apache的主配置文件httpd.conf中的<Directory></Directory>標籤內添加ErrorDocument配置。
    第二種:在apache的虛擬主機配置文件httpd-vhost.conf中的<VirtualHost*:80></VirtualHost>中添加ErrorDocument配置。
    
    [root@ser200 cronolog-1.6.2]# vi /application/apache/conf/extra/httpd-vhosts.conf

    <VirtualHost *:80>
        ServerAdmin [email protected]
        DocumentRoot "/data/www/blog
        ServerName www.test.com
        ServerAlias test.com
        CustomLog "|/usr/local/sbin/cronolog /app/logs/access_%Y%m%d%_www.log" combined
        ErrorLog "|/usr/local/sbin/cronolog /app/logs/error_%Y%m%d.log"
        ErrorDocument 404  /404.html
    </Directory>


    ErrorDocument的命令格式如下:
        ErrorDocument 錯誤代碼 跳轉到的頁面或文件

三.安裝壓縮模塊deflate
    網站隨着用戶訪問量的增加和內容量的增加,網站的帶寬會不斷的增加,隨之就是網站成本的增加。並且當內容量增大的時候,客戶端如果帶寬小,就會影響用戶的體驗。因此從這兩方面考慮,網站的某些內容必須經過壓縮之後再傳給用戶,然後在用戶客戶端進行解壓,來實現雙方共贏的效果。

    apache的壓縮要用到mod_deflate模塊,該模塊提供了DEFLATE輸出過濾器,允許服務器在將輸出內容發送到客戶端以前進行壓縮,以節約帶寬。它的核心思想就是把文件先在服務器進行壓縮,然後再進行傳輸,這樣可以顯著減少文件傳輸的大小。當傳輸完畢後,客戶端遊覽器會重新對壓縮過的內容進行解壓縮。如果沒特殊情況的話,所以的文本內容都應該能被gzip壓縮,例如:html(php),js,css,xml,txt等。特殊情況就是像一些首頁上有很多廣告投放的js代碼,由於需要每次加載進而進行來訪信息統計,所以這些廣告代碼擁有者網站的js不會經過gzip壓縮,

    1、mod_deflate模塊檢查及安裝

    [root@ser200 /]# /usr/local/apache/bin/apachectl -M | grep deflate
        deflate_module (static)  #此種結果爲編譯安裝時裝的
    [root@ser200 /]# /usr/local/apache/bin/apachectl -M | grep deflate
        deflate_module (shared)  #此種結果爲DSO方式安裝的

    2.安裝
      a.編譯時安裝方法

        編譯的時候跟上--enable-deflate即可實現安裝

      b.DSO方式安裝
        [root@ser200 /]# cd /server/tools/httpd-2.4.6/modules/filters/  #切到apache源碼包mod_deflate所在的目錄下
        [root@ser200 filters]# /usr/local/apache/bin/apxs -c -i -a mod_deflate.c  #以dso的方式編譯安裝到apache中
        [root@ser200 filters]# ll /usr/local/apache/modules/mod_deflate.so   #檢查mod_deflate是否安裝,成功安裝這裏會顯示出該文件
        -rwxr-xr-x 1 root root 76697 11月  5 07:50 /usr/local/apache/modules/mod_deflate.so
    
      更詳細的配置方法參考: apache模塊defalte安裝

    

四.設置expires緩存
    不經常改動的圖片.CSS,HTML來指定長時間緩存,節省帶寬

    1.mod_expires模塊檢查及安裝
        [root@ser200 apache]# bin/apachectl -M|grep expires
        expires_module (static)
    更詳細的配置方法參考::apache緩存模塊expires
    http://txidc.blog.51cto.com/9138217/1566047


    2.虛擬主機設置單獨的目錄expire緩存
      <Directory "/data/www/blog/wp-content">
        ExpiresActive on
        ExpiresByType image/jpeg "access plus 12 months"
        ExpiresByType image/jpg "access plus 12 months"
     
     </Directory>


    [root@ser200 apache]# curl -I http://www.test.com/wp-content/uploads/2014/10/2.jpg
    HTTP/1.1 200 OK
    Date: Tue, 21 Oct 2014 03:03:29 GMT
    Server: Apache/2.2.29 (Unix) DAV/2 PHP/5.3.29
    Last-Modified: Sun, 19 Oct 2014 13:39:02 GMT
    ETag: "10e-1a548-505c6b8952980"
    Accept-Ranges: bytes
    Content-Length: 107848
    Cache-Control: max-age=31104000
    Expires: Fri, 16 Oct 2015 03:03:29 GMT
    Vary: Accept-Encoding
    Content-Type: image/jpeg
五.修改apache運行用戶
    1.apache的默認用戶,可以提升apache的安全性。這樣,即使apache服務被攻破,***拿到apache普通用戶也不會對系統和其他應用造成破壞
    useradd -M -s /sbin/nologin txidc #創建apache用戶

    [root@server /]# vi /usr/local/apache/conf/httpd.conf
    User txidc  #更改默認的daemon用戶爲apache用戶
    Group txidc  #更改默認的daemon用戶爲apache用戶

六.使用worker模式,提升併發數

七.屏蔽apache版本信息
    1.在apache主配置文件httpd.conf中,找到包含httpd-default.conf的行,並解開註釋
        #Include conf/extra/httpd-default.conf
    2.儘管配置文件

    1.[root@sunsky /]# grep Server conf/extra/httpd-default.conf|grep -v "#"
        ServerTokens full
        ServerSignature Off

修改爲
 
ServerTokens Prod
ServerSignature Off

經過上面的修改,當你在curl-I的時候,還是會出現下面的信息

[root@ser200 apache]# curl -I www.test.com             
HTTP/1.1 200 OK
Date: Tue, 21 Oct 2014 04:32:53 GMT
Server: Apache/2.2.29 (Unix) DAV/2 PHP/5.3.29
X-Powered-By: PHP/5.3.29
X-Pingback: http://www.test.com/xmlrpc.php
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8

=====================================================

[root@ser200 apache]# curl -I www.test.com                                                                      
HTTP/1.1 200 OK
Date: Tue, 21 Oct 2014 04:36:17 GMT
Server: Apache
X-Powered-By: PHP/5.3.29
X-Pingback: http://www.test.com/xmlrpc.php
Vary: Accept-Encoding
Content-Type: text/html; charset=UTF-8


徹底讓版本等敏感信息消失

如果你需要徹底將版本之類的信息進行改頭換面,你就需要在編譯之前做準備或者進行從新編譯了
。在重新編譯時,修改源碼包下include目錄下的ap_release.h文件


#define AP_SERVER_BASEVENDOR "Apache Software Foundation" #服務的供應商名稱
#define AP_SERVER_BASEPROJECT "Apache HTTP Server"  #服務的項目名稱
#define AP_SERVER_BASEPRODUCT "Apache"        #服務的產品名
#define AP_SERVER_MAJORVERSION_NUMBER 2  #主要版本號
#define AP_SERVER_MINORVERSION_NUMBER 4  #小版本號
#define AP_SERVER_PATCHLEVEL_NUMBER  6  #補丁級別
#define AP_SERVER_DEVBUILD_BOOLEAN  0  #

上述列出的行,我已經給出了註釋,大家可以修改成自己想要的,
然後編譯安裝之後,再對httpd-default.conf文件進行修改,對方就徹底不知道你的版本號了。


九、啓用worker模式,提升併發數(可以達到2000-5000)

apache有兩個模式,默認的模式是prefork模式。那麼我們爲什麼要使用worker模式呢?這兩種模式又有什麼區別呢?

1、prefork模式

prefork使用的是多個子進程,而每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接。

工作原理:控制進程最初建立若干個子進程,爲了不在請求到來時再生成子進程,所以要根據需求不斷的創建新的子進程,最大可以達到每秒32個直到滿足需求爲止。

安裝方法:在編譯的過程中,加入參數--with-mpm=frefork,不加也可以,因爲默認的話,會採用prefork模式。

優點:效率高,穩定,安全。對於線程調試困難的平臺來說,調試更加容易些。

缺點:與worker模式相比消耗資源多。

配置參數說明


1.<IFModule mpm_prefork_module>
2.StartServers               5     #最初建立的子進程
3.MinSpareServers       5      #最小空閒進程數,如果空閒的進程小於設定值,Apache會自動建立進程,如果服務器併發及負載大的話,可以考慮加大。
4.MaxSpareServers      10    #最大空閒進程數,如果空閒的進程大於設定值,Apache會自動kill掉多餘的進程,如果服務器負載大的話,可以考慮加大。
5.MaxClients                150     #設定的是apache可以同時處理的請求,是對apache性能影響最大的參數,就是apache可以同時處理的請求數,就是說,如果有150個用戶在訪問,那麼第151個用戶就要等之前的訪問結束後才能訪問。
6.MaxRequestsPerChild    0    #每個子進程可處理的請求數,每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷燬。0以爲着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設置成非0值也有兩點重要的好處。(1)可防止意外的內存泄露(2)在服務器負載下載的時候會自動減少子進程數。
7.</IFModule>

生產環境配置實例1:


1.</IFModule mpm_prefork_module>
2.StartServers               10
3.MinSpareServers            10
4.MaxSpareServers            15
5.ServerLimit                2000
6.MaxClients                 1000
7.MaxRequestsPerChild        5000
8.</IFModule>

2、worker模式

worker模式是apche2.x新引進來的模式,是線程與進程的結合,在worker模式下會有多個子進程,每個子進程又會有多個線程。每個線程在某個確定的時間只能維持一個連接。

工作原理:由主控制進程生成若干個子進程,而每個子進程中又包含固定的線程數,各個線程獨立處理請求,同樣爲了不在請求到來時再生成線程,在配置文件中設置了最小和最大的空閒線程數及所有子進程中的線程總數,如果現有子進程中的線程總數不能滿足併發及負載,控制進程將派生新的子進程。

安裝方法:在配置編譯的工程中,加入參數--with-mpm=worker,如果不加的話系統會採用默認prefork模式。

優點:內存佔用比prefork模式低,適合高併發高流量HTTP服務。

缺點:假如一個線程崩潰,整個進程就會連同其任何線程一起“死掉”。由於線程共享內存空間,所以一個程式在運行時必須被系統識別爲“每個線程都是安全的”。服務穩定性不如prefork模式。

配置參數說明

1.</IFModule mpm_worker_module>
2.StartServers                    2  #最初建立的子進程
3.MaxClients                     150   #所有子進程中的線程總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
4.MinSpareThreads           25    #最小空閒線程數,如果空閒的線程小於設定值,apache會自動建立線程,如果服務器負載大的話,可以考慮加大此參考值。
5.MaxSpareThreads            75    #最大空閒線程數,如果空閒的線程大於設定值,apache會自動kill掉多餘的線程,如果服務器負載大的話,可以考慮加大此參考值。
6.ThreadsPerChild               25    #每個進程包含固定的線程數,此參數在worker模式中,是影響最大的參數,ThreadsPerChild的最大缺省值是64,如果負載較大,64是不夠的。這時要顯式使用threadlimit指令,它的最大缺省值是20000.
7.MaxRequestsPerChild    0    #功能同prefork模式
8.</IFModule>

常用配置參考:

生產環境配置實例1:

view sourceprint?
01.</IFModule mpm_worker_module>
02.StartServers             3
03.MaxClients               2000
04.ServerLimit              25
05.MinSpareThreads          50
06.MaxSpareThreads          200
07.ThreadLimit              200
08.ThreadsPerChild          100
09.MaxRequestsPerChild      0
10.</IFModule>

生產環境配置實例2:
 
view sourceprint?
01.</IFModule mpm_worker_module>
02.StartServers              5
03.MaxClients                9600
04.ServerLimit               64
05.MinSpareThreads           25
06.MaxSpareThreads           500
07.ThreadLimit               200
08.ThreadsPerChild           150
09.MaxRequestsPerChild       0
10.</IFModule>

生產場景配置實例3:

01.</IFModule mpm_worker_module>
02.StartServers               2
03.MaxClients                 500
04.ServerLimit                25
05.MinSpareThreads            25
06.MaxSpareThreads            75
07.ThreadsPerChild            25
08.MaxRequestsPerChild        0
09.</IFModule>

生產場景配置實例4:

01.</IFModule mpm_worker_module>
02.StartServers              3
03.MaxClients                1600
04.ServerLimit               25
05.MinSpareThreads           50
06.MaxSpareThreads           200
07.ThreadLimit               200
08.ThreadsPerChild           64
09.</IFModule>

worker模式下所能同時處理的請求總數是由子進程總數乘以Threadsperchild值決定的,應該大於等於maxclients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,如需加大時也需要顯示聲明serverlimit的值(最大值是20000)

特別說明:如果顯示聲明瞭ServerLimit,那麼它乘以ThreadsPerChild的值必須大於等於MaxClients,而且MaxClients必須是ThreadsPerChild的整數倍,否則apache將會自動調節到一個相應值(可能是個非期望值)。

數學表達:

1.MaxClient&lt;=總的進程數(ServerLimit)x線程數(ThreadsPerChild)
2.MaxClient%ThreadsPerChild=0

生產環境中我們需要開啓httpd-mpm.conf配置行,這樣才能實現併發鏈接數的增加。

1、開啓httpd-mpm.conf配置行

這裏我們要apache的主配置文件httpd.conf,找到包含httpd-mpm.conf的行,並解開註釋

1.[root@c64-web /]# grep "httpd-mpm.conf" /usr/local/apache/conf/httpd.conf
2.#Include conf/extra/httpd-mpm.conf
3.[root@c64-web /]# sed -i 's#\#Include conf/extra/httpd-mpm.conf#Include conf/extra/httpd-mpm.conf#g' /usr/local/apache/conf/httpd.conf

注意:編譯安裝的,只有此行解開註釋了,後面的修改才能生效。

2、修改httpd-mpm.conf配置

1)如果你的apache服務爲worker模式,那麼生產環境中可以選擇上面worker模式的生產環境配置實例1的配置。

2)如果你的apache服務爲prefork模式,那麼生產環境中可以參考上面prefork模式的生產環境配置實例1的配置。

生產環境中,這裏我建議大家選擇worker模式。

十、開啓防盜鏈

一些小網站爲了盈利,通過盜鏈來實現對自己網站內容的豐富,這無疑加大了企業的空間和流量的成本,因此我們需要對apache進行防盜鏈的配置。

由於我們要用到mod_rewrite模塊,因此我們需要先檢測該模塊是否安裝,檢測和安裝方法與上面mod_deflate和mod_expires的一樣,這裏不多講了。

防盜鏈配置:

一般我們都是將防盜鏈的配置,配置在虛擬主機裏面,配置如下:


01.<VirtualHost *:80>
02.ServerAdmin [email protected]
03.DocumentRoot "/www/html"
04.ServerName www.sunsky.pw
05.ServerAlias sunsky.pw
06.CustomLog "|/usr/local/sbin/cronolog /app/logs/www_access_%Y%m%d.log" combined
07.ErrorLog "|/usr/local/sbin/cronolog /app/logs/www_error_%Y%m%d.log"
08.<IfModule rewrite_module>
09.RewriteEngine On
10.RewriteCond %{HTTP_REFERER} !^http://sunsky.pw/.*$ [NC]
11.RewriteCond %{HTTP_REFERER} !^http://sunsky.pw$ [NC]
12.RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw/.*$ [NC]
13.RewriteCond %{HTTP_REFERER} !^http://www.sunsky.pw$ [NC]
14.RewriteRule .*\.(gif|jpg|swf)$ http://www.sunsky.pw [R,NC]
15.</IfModule>
16.</VirtualHost>

如上配置之後,我們重啓apache服務即可生效。


十一、禁止目錄瀏覽

由於開啓目錄瀏覽會讓我們整個目錄下的內容全部都暴露到外面,因此我們必須要禁止目錄瀏覽功能。當然一些目錄開放給客戶做下載的,可以忽略此項優化。我的http://down.sunsky.pw就是範例。

我們通過修改apache主配置文件httpd.conf中的<Directory></Directory>標籤內的Options選項參數來實現禁用目錄瀏覽。

實現方法有三種:

第一種:

1.<Directory /www/html>
2.AllowOverride None
3.Options FollowSymLinks   #不填寫Indexes項,默認即爲關閉。
4.Require all granted
5.</Directory>

第二種:
1.<Directory /www/html>
2.AllowOverride None
3.Options -Indexes #通過在Indexes前面加-來禁用此功能
4.Require all granted
5.</Directory>

第三種:
 
1.<Directory /www/html>
2.AllowOverride None
3.Options None    #禁用所有選項
4.Require all granted
5.</Directory>


十二、禁用AllowOverride選項,關閉.htaccess文件使用

首先是性能考慮,如果AllowOverride啓用了.htaccess文件,則apache需要在每個目錄中查找.htaccess文件。因此,無論是否真正用到,啓用.htaccess都會導致服務器性能的下降。另外,對於每一個請求,都需要讀取一次.htaccess文件。

其次是安全考慮,這樣會允許用戶自己修改服務器的配置,這可能會導致某些意想不到的修改,所以請認真考慮是否應當給予用戶這樣的特權。

1、禁用AllowOverride選項

我們通過修改apache主配置文件httpd.conf中的<Directory></Directory>標籤內的AllowOverride選項參數來實現禁用目錄瀏覽。

1.<Directory /www/html>
2.Options none
3.AllowOverride None    #禁止該選項,防止用戶重複載入
4.Require all granted
5.</Directory>

通過該設置加快了服務器響應速度,因爲它不再讓每個請求去尋求每個目錄的訪問控制文件(.htaccess)

2、關閉.htaccess文件使用

默認在Unix平臺下能夠使用.htaccess來對目錄權限進行規則定義,但是這是不安全的,建議關閉,默認的選項:

1.AccessFileName .htaccess

這裏我們將它關閉註釋掉

 
1.#AccessFileName .htaccess

全部目錄權限定義使用httpd.conf中的定義,不使用.htaccess進行定義。

十三、apache的安全模塊

我們需要對apache站點增加一些擴展的安全模塊,如:mod_evasive20防DDOS、mod_limitipconn(針對單站點)配置、mod_security2防SQL注入等等之類的工具。

另外,下面是推薦給大家的幾個工具。

1、makejail http://www.floc.net/makejail/

它是一個自動把建立jail所需要的程序放到jail內的軟件,使用python編寫,他有debian和openbsd的版本。

2、mod-security http://www.modsecurity.org/

它是apche的一個模塊,它不僅可以實現過濾請求和日誌審計等功能,而且可以防止SQLInjection和跨站腳本***等是個很不錯的安全模塊。

十四、apache目錄及文件權限設置

在生產環境的網站架構中,我們應把資源文件,例如用戶上傳的圖片及附件等和程序做好分離,最好是把上傳程序也分離開來。這樣才能更方便我們做好授權,保證apache服務和整個服務器安全。

這裏我們設置apache的網站目錄屬主和屬組是root,權限是755,文件的權限爲644。


1.lrwxr-xr-x  1 root root   23 11月  5 02:04 apache -&gt; /usr/local/apache-2.4.6
2.drwxr-xr-x 14 root root 4096 11月  5 12:37 apache-2.4.6

並且,在對日誌的授權商,我們要將屬主和屬組都設置爲root,權限設置爲700。

1.drwx------ 2 root root 4096 11月  5 02:46 logs

由於apache日誌的記錄是由apache的主進程進行操作的,而apache的主進程又是root用戶啓動的,所以這裏設置700是不影響日誌記錄了。這也是日誌記錄的最安全的方法。

十五、禁止PHP解析指定站點的目錄

企業的站點有時會提供用戶進行上傳操作,而用戶上傳文件的存放目錄,我們是不能給php的解析權限的,否則會對apache服務和系統造成危害。


十六、使用tmpfs文件系統替代頻繁訪問的目錄

tmpfs是一種基於內存的文件系統。它最主要的兩個優勢就是動態文件系統大小和速度快。因爲典型的tmpfs文件系統會完全駐留在RAM中,讀寫幾乎可以是瞬間的。即使用了一些交換分區,性能仍然是卓越的。因此對於那些頻繁訪問的目錄,建議使用tmpfs文件系統進行替代。

十七、儘可能減少HTTP請求數

http請求是要開銷的,想辦法減少請求數自然可以提高網頁速度。常用的方法,合併css,js(將一個頁面中的css和js文件分別合併)以及Imagemaps和csssprites等。當然或許將css,js文件拆分成多個是因爲css結構,共用等方面的考慮。阿里巴巴中文站當時的做法是開發時依然分開開發,然後在後臺對js,css進行合併,這樣對於遊覽器來說依然是一個請求,但是開發時仍然能還原成多個,方便管理和重複引用。yahoo甚至建議將首頁的css和js直接寫在頁面文件裏面,而不是外部引用。因爲首頁的訪問量太大了,這麼做可以減少兩個請求數。而事實上國內的很多門戶都是這麼做的。

其中csssprites是指只用將頁面上的背景圖合併成一張,然後通過css的background-position屬性定義不過的值來取他的背景。淘寶和阿里巴巴中文站目前都是這樣做的。http://www.csssprites.com/這是個工具網站,它可以自動將你上傳的圖片合併,並給出對應的background-position座標。並將結果以png和gif的格式輸出。

十八、apache網站架構優化

好的網站架構是網站性能強大關鍵,更是網站安全的關鍵。

在生產環境中建議將程序頁面服務器、圖片附件服務器和上傳服務器三者的功能儘量分離。

那麼如何實現分離呢?

1、分離最佳方式是分別使用獨立的服務器(需要程序支持)

2、次選方案在前端負載均衡器通過haproxy/nginx來根據用戶請求的目錄或擴展名來對後端的服務器發出請求。

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