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 1968023646@qq.com
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<=總的進程數(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 274546888@qq.com
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 -> /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來根據用戶請求的目錄或擴展名來對后端的服務器發出請求。
本文出自 “蜘蛛俠” 博客,請務必保留此出處http://txidc.blog.51cto.com/9138217/1566436