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壓縮,
一、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文件進行修改,對方就完全不知道你的版本號了。
9、啓用worker模式,提高併發數(能夠達到2000-5000)
apache有兩個模式,默認的模式是prefork模式。那麼咱們爲何要使用worker模式呢?這兩種模式又有什麼區別呢?
一、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>
二、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配置行,這樣才能實現併發連接數的增長。
一、開啓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
注意:編譯安裝的,只有此行解開註釋了,後面的修改才能生效。
二、修改httpd-mpm.conf配置
1)若是你的apache服務爲worker模式,那麼生產環境中能夠選擇上面worker模式的生產環境配置實例1的配置。
2)若是你的apache服務爲prefork模式,那麼生產環境中能夠參考上面prefork模式的生產環境配置實例1的配置。
生產環境中,這裏我建議你們選擇worker模式。
10、開啓防盜鏈
一些小網站爲了盈利,經過盜鏈來實現對本身網站內容的豐富,這無疑加大了企業的空間和流量的成本,所以咱們須要對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服務便可生效。
11、禁止目錄瀏覽
因爲開啓目錄瀏覽會讓咱們整個目錄下的內容所有都暴露到外面,所以咱們必需要禁止目錄瀏覽功能。固然一些目錄開放給客戶作下載的,能夠忽略此項優化。個人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>
12、禁用AllowOverride選項,關閉.htaccess文件使用
首先是性能考慮,若是AllowOverride啓用了.htaccess文件,則apache須要在每一個目錄中查找.htaccess文件。所以,不管是否真正用到,啓用.htaccess都會致使服務器性能的降低。另外,對於每個請求,都須要讀取一次.htaccess文件。
其次是安全考慮,這樣會容許用戶本身修改服務器的配置,這可能會致使某些意想不到的修改,因此請認真考慮是否應當給予用戶這樣的特權。
一、禁用AllowOverride選項
咱們經過修改apache主配置文件httpd.conf中的<Directory></Directory>標籤內的AllowOverride選項參數來實現禁用目錄瀏覽。
1.<Directory /www/html>
2.Options none
3.AllowOverride None #禁止該選項,防止用戶重複載入
4.Require all granted
5.</Directory>
經過該設置加快了服務器響應速度,由於它再也不讓每一個請求去尋求每一個目錄的訪問控制文件(.htaccess)
二、關閉.htaccess文件使用
默認在Unix平臺下可以使用.htaccess來對目錄權限進行規則定義,可是這是不安全的,建議關閉,默認的選項:
1.AccessFileName .htaccess
這裏咱們將它關閉註釋掉
1.#AccessFileName .htaccess
所有目錄權限定義使用httpd.conf中的定義,不使用.htaccess進行定義。
十3、apache的安全模塊
咱們須要對apache站點增長一些擴展的安全模塊,如:mod_evasive20防DDOS、mod_limitipconn(針對單站點)配置、mod_security2防SQL注入等等之類的工具。
另外,下面是推薦給你們的幾個工具。
一、makejail http://www.floc.net/makejail/
它是一個自動把創建jail所須要的程序放到jail內的軟件,使用python編寫,他有debian和openbsd的版本。
二、mod-security http://www.modsecurity.org/
它是apche的一個模塊,它不只能夠實現過濾請求和日誌審計等功能,並且能夠防止SQLInjection和跨站腳本攻擊等是個很不錯的安全模塊。
十4、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是不影響日誌記錄了。這也是日誌記錄的最安全的方法。
十5、禁止PHP解析指定站點的目錄
企業的站點有時會提供用戶進行上傳操做,而用戶上傳文件的存放目錄,咱們是不能給php的解析權限的,不然會對apache服務和系統形成危害。
十6、使用tmpfs文件系統替代頻繁訪問的目錄
tmpfs是一種基於內存的文件系統。它最主要的兩個優點就是動態文件系統大小和速度快。由於典型的tmpfs文件系統會徹底駐留在RAM中,讀寫幾乎能夠是瞬間的。即便用了一些交換分區,性能仍然是卓越的。所以對於那些頻繁訪問的目錄,建議使用tmpfs文件系統進行替代。
十7、儘量減小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的格式輸出。
十8、apache網站架構優化
好的網站架構是網站性能強大關鍵,更是網站安全的關鍵。
在生產環境中建議將程序頁面服務器、圖片附件服務器和上傳服務器三者的功能儘可能分離。
那麼如何實現分離呢?
一、分離最佳方式是分別使用獨立的服務器(須要程序支持)
二、次選方案在前端負載均衡器經過haproxy/nginx來根據用戶請求的目錄或擴展名來對後端的服務器發出請求。
php
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壓縮,
一、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文件進行修改,對方就完全不知道你的版本號了。
9、啓用worker模式,提高併發數(能夠達到2000-5000)
apache有兩個模式,默認的模式是prefork模式。那麼咱們爲何要使用worker模式呢?這兩種模式又有什麼區別呢?
一、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>
二、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配置行,這樣才能實現併發連接數的增長。
一、開啓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
注意:編譯安裝的,只有此行解開註釋了,後面的修改才能生效。
二、修改httpd-mpm.conf配置
1)若是你的apache服務爲worker模式,那麼生產環境中能夠選擇上面worker模式的生產環境配置實例1的配置。
2)若是你的apache服務爲prefork模式,那麼生產環境中能夠參考上面prefork模式的生產環境配置實例1的配置。
生產環境中,這裏我建議你們選擇worker模式。
10、開啓防盜鏈
一些小網站爲了盈利,經過盜鏈來實現對本身網站內容的豐富,這無疑加大了企業的空間和流量的成本,所以咱們須要對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服務便可生效。
11、禁止目錄瀏覽
因爲開啓目錄瀏覽會讓咱們整個目錄下的內容所有都暴露到外面,所以咱們必需要禁止目錄瀏覽功能。固然一些目錄開放給客戶作下載的,能夠忽略此項優化。個人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>
12、禁用AllowOverride選項,關閉.htaccess文件使用
首先是性能考慮,若是AllowOverride啓用了.htaccess文件,則apache須要在每一個目錄中查找.htaccess文件。所以,不管是否真正用到,啓用.htaccess都會致使服務器性能的降低。另外,對於每個請求,都須要讀取一次.htaccess文件。
其次是安全考慮,這樣會容許用戶本身修改服務器的配置,這可能會致使某些意想不到的修改,因此請認真考慮是否應當給予用戶這樣的特權。
一、禁用AllowOverride選項
咱們經過修改apache主配置文件httpd.conf中的<Directory></Directory>標籤內的AllowOverride選項參數來實現禁用目錄瀏覽。
1.<Directory /www/html>
2.Options none
3.AllowOverride None #禁止該選項,防止用戶重複載入
4.Require all granted
5.</Directory>
經過該設置加快了服務器響應速度,由於它再也不讓每一個請求去尋求每一個目錄的訪問控制文件(.htaccess)
二、關閉.htaccess文件使用
默認在Unix平臺下可以使用.htaccess來對目錄權限進行規則定義,可是這是不安全的,建議關閉,默認的選項:
1.AccessFileName .htaccess
這裏咱們將它關閉註釋掉
1.#AccessFileName .htaccess
所有目錄權限定義使用httpd.conf中的定義,不使用.htaccess進行定義。
十3、apache的安全模塊
咱們須要對apache站點增長一些擴展的安全模塊,如:mod_evasive20防DDOS、mod_limitipconn(針對單站點)配置、mod_security2防SQL注入等等之類的工具。
另外,下面是推薦給你們的幾個工具。
一、makejail http://www.floc.net/makejail/
它是一個自動把創建jail所須要的程序放到jail內的軟件,使用python編寫,他有debian和openbsd的版本。
二、mod-security http://www.modsecurity.org/
它是apche的一個模塊,它不只能夠實現過濾請求和日誌審計等功能,並且能夠防止SQLInjection和跨站腳本攻擊等是個很不錯的安全模塊。
十4、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是不影響日誌記錄了。這也是日誌記錄的最安全的方法。
十5、禁止PHP解析指定站點的目錄
企業的站點有時會提供用戶進行上傳操做,而用戶上傳文件的存放目錄,咱們是不能給php的解析權限的,不然會對apache服務和系統形成危害。
十6、使用tmpfs文件系統替代頻繁訪問的目錄
tmpfs是一種基於內存的文件系統。它最主要的兩個優點就是動態文件系統大小和速度快。由於典型的tmpfs文件系統會徹底駐留在RAM中,讀寫幾乎能夠是瞬間的。即便用了一些交換分區,性能仍然是卓越的。所以對於那些頻繁訪問的目錄,建議使用tmpfs文件系統進行替代。
十7、儘量減小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的格式輸出。
十8、apache網站架構優化
好的網站架構是網站性能強大關鍵,更是網站安全的關鍵。
在生產環境中建議將程序頁面服務器、圖片附件服務器和上傳服務器三者的功能儘可能分離。
那麼如何實現分離呢?
一、分離最佳方式是分別使用獨立的服務器(須要程序支持)
二、次選方案在前端負載均衡器經過haproxy/nginx來根據用戶請求的目錄或擴展名來對後端的服務器發出請求。
css