Apache的相關優化
一、Apache運行環境優化
1、使用單獨的主機運行Apache服務
Apache所運行的硬件環境都是對性能影響最大的因素,即使不能對硬件進行升級,也最好給apache一個單獨的主機以免受到其他應用的幹擾。
2、給Apache服務器增加內存
所有硬件指標中,對性能影響最大的是內存,對於靜態內容(圖片、javascript文件、css文件等),它決定了apache可以緩存多少內容,它緩存的內容越多,在硬盤上讀取內容的機會就越少,而存取硬盤上的特定文件是一件很費時的操作,大內存可以極大提高靜態站點的速度;對動態高負載站點來說,每個請求保存的時間更多一些,apache的mpm模塊會為每個請求派生出相應的進程或線程分別處理,而進程或線程的數量與內存的消耗近似成正比,因此增大內存對提高動態站點的負載和運行速度也極為有利。
3、給Apache服務器更換高速硬盤
硬盤的速度對Apache靜態站點尤為突出,apache不斷的在讀取文件並發送給相應的請求,硬盤的讀寫是極其頻繁的;動態站點也要不斷的加載web程序(php等),一個請求甚至要讀取十幾個文件才能處理完成,因此盡可能的提高硬盤速度和質量對提高apache的性能是有積極意義的。
4、更換更好的CPU和更大的網絡帶寬
最後影響Apache訪問速度的是cpu和網絡,cpu影響的是web程序執行速度,網絡影響流量大小。
5、使用類Unix系統運行Apache服務
影響性能的另一因素是操作系統,php程序在類unix環境中的執行速度仍然比windows中要快,所以我們盡量使用Linux操作系統作為Apache服務的運行系統。
二、Apache相關功能優化
1、禁止Apache目錄索引瀏覽功能。
Apache默認配置是當網站沒有首頁文件時,Apache會把整個目錄結構展示給網站用戶,這是非常大的隱患,必須要屏蔽掉。在主配置文件httpd.conf或者虛擬主機的配置文件httpd-vhost.conf文件中配置如下內容即可。
<Directory /var/html>
Options FollowSymLinks
AllowOverride None
Order allow, deny
Allow from all
</Directory>
或者
<Directory /var/html>
Options -Indexes FollowSymLinks
AllowOverride None
Order allow, deny
Allow from all
</Directory>
說明:也就是把配置文件中Options Indexes FollowSymLinks
修改為:Options FollowSymLinks 或把Indexes改成 -Indexes即可
2、隱藏Apache的版本信息
[root@centos1 conf]# curl -I 192.168.115.105
HTTP/1.1 200 OK
Date: Sun, 20 Aug 2017 11:34:37 GMT
Server: Apache/2.4.7 (Unix) 可以看到Apache的版本號是2.4.7的
Last-Modified: Sun, 20 Aug 2017 06:38:57 GMT
ETag: "14-557299ddc43ae"
Accept-Ranges: bytes
Content-Length: 20
Content-Type: text/html
[root@centos1 conf]# vim /usr/local/apache2/conf/extra/httpd-default.conf
ServerTokens Prod 把Full改成Prod
ServerSignature Off 把On改成Off
[root@centos1 conf]# vim /usr/local/apache2/conf/httpd.conf
Include conf/extra/httpd-default.conf 把這一行註釋去掉讓httpd-default.conf文件生效
[root@centos1 conf]# /usr/local/apache2/bin/apachectl restart 重啟生效即可
[root@centos1 conf]# curl -I 192.168.115.105
HTTP/1.1 200 OK
Date: Sun, 20 Aug 2017 11:35:40 GMT
Server: Apache 可以看到版本號已經沒有了
Last-Modified: Sun, 20 Aug 2017 06:38:57 GMT
ETag: "14-557299ddc43ae"
Accept-Ranges: bytes
Content-Length: 20
Content-Type: text/html
3、禁止Apache用戶重載功能
對於使用虛擬主機的朋友可能會覺得不方便,這樣設置將會使.htaccess中的設置失效,如果實在需要,並且在有條件的情況下,請在conf配置文件中直接寫入rewrite規則
<Directory “/usr/local/apache2/htdocs”>
Options none
AllowOverride None 禁止用戶重載
Order allow, deny
Allow from all
</Directory>
提示:禁止用戶對目錄配置文件(.htaccess進行修改)重載,這會加快服務器響應速度,因為它不在為每個請求尋找每個目錄訪問控制文件(.htaccess)。也杜絕了開發人員變相修改配置的安全隱患。
4、避免使用.htaccess文件
首先是從web性能考慮,如果AllowOverride啟用了支持.htaccess文件,則Apache需要在每個站點目錄中查找.htaccess文件,因此無論是否真正用到,啟用.htaccess都會導致web性能的下降。另外對每一個請求,都需要讀取一次.htaccess文件。
其次是安全考慮,這樣會允許開發人員或者代碼管理者可以修改服務器的配置,這可能會導致某些意想不到的修改,應該避免使用.htaccess文件功能,如果要實現類似的功能,可以在主配置中配置。
5、禁止資源目錄解析PHP程序
方法1:提示下載不解析。
<Directory ~ “ /var/www/bbs/uploads”>
Options FollowSymLinks
AllowOverride None
Order allow, deny
Allow from all
php_flag engine off 添加這行
</Directory>
方法2:返回403錯誤
<Directory /var/www/blog>
<Files ~ “.php”>
Order allow, deny
Deny from all
</Files>
</Directory>
6、配置Apache錯誤頁面優雅顯示(自定義錯誤頁面)
(1)配置Apache錯誤頁面優雅顯示的目的
我們在瀏覽某些網站時,往往瀏覽器顯示給我的是無法找到我們要訪問的頁面的錯誤信息。這是因為我們在瀏覽器中輸入了錯誤的url或者網站的管理者將之前的頁面移到了其他目錄。此時其他web服務器 就會給瀏覽器返回一個404的錯誤信息。瀏覽器在收到其他web服務器 返回的404錯誤信息時,就會顯示相應的錯誤頁面。很多網站都有自己個性化的404錯誤頁面,在這個頁面上我們可以看到很多很友好的提示信息,但是也有部分網站的404錯誤信息顯示的頁面就是瀏覽器自己默認的頁面,從瀏覽器的默認404錯誤頁面上我們得不到關於網站的任何信息,這樣勢必會導致網站用戶的流失。那麽我如何在apache下配置404錯誤頁面呢。下面我們就一起來看看如何設置apache,使其能夠顯示攜帶更多信息的404錯誤頁面。為服務器默認文件夾設置404錯誤頁面。
(2)Apache錯誤頁面優雅顯示設置
打開apache的安裝目錄,在該目錄下的conf目錄中找到httpd.conf文件,在該文件中找到 “ErrorDocument 404” 字符串,一般情況下顯示如下:
#ErrorDocument 500 "The server made a boo boo."
#ErrorDocument 404 /missing.html
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html
首先將前面的#去掉,missing.html是出現404錯誤時apache要返回給瀏覽器的頁面。我們可以在missing.html頁面中添加自己個性的網頁信息。當然頁面的名字我們是可以隨便取的。 missing.html默認應該放在網站的根目錄下,但是我們可以根據自己的設置來將其放在其他目錄。如/error/missing.html,那配置文件就應該作如下修改:
errordocument 404 /error/missing.html
在完成上述配置之後,重啟apache,測試一下,就可以看到我們想要的效果。
但是IE往往事與願違,在做了上述配置之後,IE有時還會返回自帶的404錯誤默認頁面。這是為什麽呢,因為ie在檢測到apache返回的錯誤頁面小於512 個字節時,就會顯示自帶的404錯誤頁面。
解決方法 :配置文件中404錯誤所指向的url地址改成絕對地址 ,如:
errordocument 404 http://localhost/error/missing.html
7、配置Apache對站點文件壓縮傳輸
在apache2.0以上(包括apache2.0)的版中gzip壓縮使用的是mod_deflate模塊,下面是具體配置步驟
vim /usr/local/apache2/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
打開httpd.conf後,先將上面兩行配置前面的#號去掉,啟用這兩個模塊,其中mod_deflate是壓縮模塊,就是對要傳輸到客戶端的代碼進行gzip壓縮;mod_headers模塊的作用是告訴瀏覽器頁面使用了gzip壓縮,如果不開啟mod_headers那麽瀏覽器就會對gzip壓縮過的頁面進行下載,而無法正常顯示。
在httpd.conf中加入以下代碼,可以加到任何空白地方,不了解apache的朋友,如果擔心加錯地方,就放到http.conf文件的最後一行,如果是虛擬服務器可以寫.htaccess文件裏面,然後放在項目下即可。
<IfModule mod_deflate.c>
SetOutputFilter DEFLATE
#必須的,就像一個開關一樣,告訴apache對傳輸到瀏覽器的內容進行壓縮
SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
#設置不對後綴gif,jpg,jpeg,png的圖片文件進行壓縮
SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
#同上,就是設置不對exe,tgz,gz。。。的文件進行壓縮
SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
AddOutputFilterByType DEFLATE text/*
#設置對文件是文本的內容進行壓縮,例如text/html text/css text/plain等
AddOutputFilterByType DEFLATE application/ms* application/vnd* application/postscript application/javascript application/x-javascript
#這段代碼你只需要了解application/javascript application/x-javascript這段就可以了,這段的意思是對javascript文件進行壓縮
AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
#這段是告訴apache對php類型的文件進行壓縮
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.x 有一些問題,所以只壓縮文件類型是text/html的
BrowserMatch ^Mozilla/4.0[678] no-gzip
# Netscape 4.06-4.08 有更多的問題,所以不開啟壓縮
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# IE瀏覽器會偽裝成 Netscape ,但是事實上它沒有問題
</IfModule>
本配置到這裏apache中的gzip壓縮就配置完成,重啟apache後,新的配置就會生效。最後再用工具檢查一下是否生效。不過開啟gzip功能需要額外CPU資源開銷。
8、啟用mod_expires或mod_headers設置靜態文件緩存時間
(1)mod_expires緩存靜態文件的好處及安裝方法
采用mod_expires緩存靜態文件能提高服務器的性能,縮短服務的響應時間,減輕服務器負擔,減少網絡帶寬使用量。
在安裝apache的時Configure步驟中添加--enable-expires安裝之後,在apache安裝目錄的modules目錄裏會有:mod_expires.so同時在httpd.conf會自動添加下面的內容
LoadModule expires_module modules/mod_expires.so
(2)通過mod_expires設置緩存(三種格式)
#LoadModule expires_module modules/mod_expires.so
編輯Apache的httpd.conf主配置文件,將上面那行前面的”#”號刪除,”mod_expires”的設定資料除了可以寫在Apache的”httpd.conf”設定檔中,也可以寫在”.htaccess”設定檔裏.
語句格式1:
ExpiresByType 類型 描述性語言
描述性語言:modification、access、now |plus|years、months、weeks、days、hours、minutes、seconds
例如:
ExpiresByType image/png “access plus 7 days”
#設置png格式的緩存時間為7天
範例一:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault “access plus 10 days”
ExpiresByType text/css “access plus 1 second”
</IfModule>
語句格式2:
ExpiresByType 類型 A/M+時間(以秒為單位)
A:access表示從瀏覽器訪問時間算起
M:modification表示文件修改時間算起
例如:
ExpiresByType image/png A604800 #設置png格式的緩存時間為7天
範例二:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A86400
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A900
</IfModule>
語句格式3:
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A604800
</FilesMatch>
#表示匹配jpg|jpeg|png|gif|swf格式的文件緩存為7天
範例三:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A0
#緩存 1年
<FilesMatch “\.(flv|ico|pdf|avi|mov|ppt|doc|mp3|wmv|wav)$”>
ExpiresDefault A9030400
</FilesMatch>
#緩存1星期
<FilesMatch “\.(jpg|jpeg|png|gif|swf)$”>
ExpiresDefault A604800
</FilesMatch>
#緩存3小時
<FilesMatch “\.(txt|xml|js|css)$”>
ExpiresDefault A10800″
</FilesMatch>
</IfModule>
將下列代碼加入.htaccess文件中(本次采用的為語法格式一):
<IfModule mod_expires.c>
ExpiresActive On #開啟緩存功能
ExpiresDefault A86400 #設置默認的緩存時間
#以下是針對不同的文件類型設置不同的緩存時間
ExpiresByType image/x-icon A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/css A2592000
ExpiresByType image/gif A604800
ExpiresByType image/png A604800
ExpiresByType image/jpeg A604800
ExpiresByType text/plain A604800
ExpiresByType application/x-shockwave-flash A604800
ExpiresByType video/x-flv A604800
ExpiresByType application/pdf A604800
ExpiresByType text/html A900
</IfModule>
(3)使用mod_headers模塊設置緩存
Expires是瀏覽器Cache機制的一部分,瀏覽器的緩存取決於Header中的四個值: Cache-Control, Expires, Last-Modified, ETag。優化這個選項,所要做的是對站內所有的文件有針對性的設置Cache-Control和Expires,我們要實現加上過期標誌可以利用apache模塊mod_expires和mod_headers。
通過配置.htaccess文件, 可以輕易地按文件類別設置緩存時間。對提高網站速度有一定幫助。有一個問題是我們常用的Apache主機經常不怎麽支持mod_expires,沒有關系,我們用另一個模塊使用mod_headers。
同樣在.htaccess文件中添加如下內容可以實現緩存:
<ifmodule mod_headers.c>
# htm,html,txt類的文件緩存一個小時
<filesmatch “\.(html|htm|txt)$”>
header set cache-control “max-age=3600″
</filesmatch>
# css, js, swf類的文件緩存一個星期
<filesmatch “\.(css|js|swf)$”>
header set cache-control “max-age=604800″
</filesmatch>
# jpg,gif,jpeg,png,ico,flv,pdf等文件緩存一年
<filesmatch “\.(ico|gif|jpg|jpeg|png|flv|pdf)$”>
header set cache-control “max-age=29030400″
</filesmatch>
</ifmodule>
以下為樣本代碼:
<ifmodule mod_headers.c>
<FilesMatch “\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$”>
Header set Cache-Control “max-age=604800, public”
</FilesMatch>
<FilesMatch “\.(xml|txt)$”>
Header set Cache-Control “max-age=18000, public, must-revalidate”
</FilesMatch>
<FilesMatch “\.(html|htm|php)$”>
Header set Cache-Control “max-age=3600, must-revalidate”
</FilesMatch>
#其它文件可參照設置,此略。
</ifmodule>
9、更改Apache的默認用戶和組
在apache 部署中,我們習慣將整個項目的所有者和組設置為apache(註:apache是新建的一個用戶),這樣可以把整個項目的權限設置成 744,提高安全性。在如此設置的時候需要將 httpd 進程的擁有者和組設置為 apache(用戶)。需要修改httpd.conf文件,修改成下面這樣即可。
vim /usr/local/apache2/conf/httpd.conf
User apache
Group apache
/usr/local/apache2/bin/apachectl graceful
10、調整Apache的工作模式並修改相關參數優化
如何調整Apache工作模式及優化這裏不再說明,詳情見我的另一篇博客
http://blog.51cto.com/longlei/2109039
11、最小化設置Apache目錄及文件權限
為了保證網站不遭受木馬入侵上傳及修改文件。
安全的權限設置如下:
(1)所有站點目錄的用戶和組都應該為root
(2)所有目錄權限是默認的755
(3)所有文件權限是默認的644
註意:網站服務的用戶不能用root
12、最小化設置Apache日誌目錄權限
假如日誌目錄為/var/logs,則授權方法為:
chown -R root.root /var/logs
chmod -R 700 /var/logs
13、配置軟件輪詢Apache訪問日誌
輪詢Apache訪問日誌方法這裏不再說明,詳情見我的另一篇博客,地址如下:
http://blog.51cto.com/longlei/2103580
14、優化訪問日誌記錄的信息
(1)定義日誌級別,讓問題定位更加精準
(2)定義日誌的規範格式,讓整個團隊的日誌格式統一,便於查看及排錯。
(3)對日誌進行分類,方便管理和查看(例如:從功能方面可分為診斷日誌、統計日誌、審計日誌等。)
(4)日誌中盡量不要記錄無用信息,且重要日誌記錄必須完整
(5)在生產環境中解決問題並不斷完善日誌
(6)對日誌文件進行按周或按天輪詢,保證日誌文件不會過大
(7)定期清理很久之前的日誌文件,釋放磁盤空間
15、限制指定IP訪問網站
Apache 從2.2升級到 Apache2.4.x後配置文件httpd.conf 的設置方法有了大變化,以前是將 deny from all 全部改成 Allow from all 實現外網訪問,現在是將 Require all denied 以及 Require local 都改為 Require all granted 就可以了。
.htaccess 如果不起作用將 LoadModule rewrite_module modules/mod_rewrite.so 前面的註釋(#)去掉就可以了。
(1)所有的請求都被拒絕
2.2上的配置
Order deny,allow
Deny from all
2.4上的配置
Require all denied
(2)所有請求都是允許的
2.2上的配置
Order allow,deny
Allow from all
2.4上的配置
Require all granted
(3)Apache2.4上經常會用到的配置
Require all denied
Require all granted
Require host xxx.com
Require ip 192.168.1 192.168.2
Require local
舉例說明
a、僅允許IP:192.168.0.1 訪問
Require all granted
Require ip 192.168.0.1
b、僅禁止IP:192.168.0.1訪問
Require all granted
Require not ip 192.168.0.1
c、允許所有訪問
Require all granted
d、拒絕所有訪問
Require all denied
提示:默認是 Require local 僅允許本地訪問。
16、控制MaxClients的設置,以避免服務器產生太多的子進程而發生交換。
進程間的數據交換會占用很大內存,數據交換產生的滯後使用戶總感覺”不夠快”,所以用戶就可能去按”停止”和”刷新”,從而帶來更大的負載。一般建議小網站將MaxClients設置為12-24。
17、HostnameLookups設置為off
盡量減少DNS查詢的次數。如果你使用了”Allow from domain”或”Deny from domain”指令(也就是domain使用的是主機名而不是IP地址),則代價是要進行兩次DNS查詢(一次正向和一次反向,以確認沒有作假)。所以,為了得到最高的性能,應該避免使用這些指令(不用域名而用IP地址也是可以的)。
18、為Directory加上FollowSymLinks
如果網站空間中沒有使用 Options FollowSymLinks ,Apache就必須執行額外的系統調用以驗證符號連接。例如:在請求”/index.html”時,Apache將對”/www”、”/www/htdocs”、”/www/htdocs/index.html”執行lstat()調用。而且lstat()的執行結果不被緩存,因此對每一個請求都要執行一次。
19、MaxRequestsPerChild設置為非0以防止內存泄漏
MaxRequestsPerChild用於控制Apache子進程在何時銷毀,默認為0,代表永不銷毀子進程,這可能會存在內存泄漏的風險,建議設置為10000
20、KeepAlive與KeepAliveTimeOut
如果你使用的使mpm_prefork模式(Apache默認安裝),那麽建議你將KeepAlive設置為off;因為,開啟keepalive會為每個客戶端建立一個連接,prefork不會創建線程,估計100個用戶同時訪問你的網站,Apache就會掛了,如果你實在想開啟,那麽請將KeepAliveTimeOut 時間設置更短些,例如5,默認是60秒
21、使用CDN做網站加速
簡單的講,通過在現有的Internet中增加一層新的網絡架構,將網站的內容發布到最接近用戶的cache服務器內,通過DNS負載均衡技術,判斷用戶來源就近訪問cache服務器取得所需的內容,這樣可以有效減少數據在網絡上傳輸的時間,提高速度。把靜態內容分布到CDN減少了用戶影響時間20%或更多。
Apache的相關優化