在搭建 Apache 業務沒上線以前,咱們須要不斷去測試性能以達到甚至遠遠超過預期,所以咱們須要對 Apache 進行深度優化,本次咱們將介紹 Apache 的優化及工做模式詳解。javascript
在 Linux 中搭建的 Apache ,要進行優化必須是在編譯安裝環境下進行,所以咱們須要對本機自帶的 httpd 進行卸載。並從新下載並編譯安裝。要注意,在./配置的時候,要添加如下模塊。css
./configure \ --prefix=/usr/local/httpd \ ##安裝目錄 --enable-deflate \ ##壓縮模塊 --enable-expires \ ##緩存模塊 --enable-so \ --enable-rewrite \ ##重定向模塊 --enable-charset-lite \ --enable-cgi
打開主配置文件,打開壓縮模塊html
vim /usr/local/httpd/conf/httpd.conf LoadModule headers_module modules/mod_headers.so LoadModule deflate_module modules/mod_deflate.so //開啓 去掉前面# LoadModule filter_module modules/mod_filter.so ##在末尾添加下面的行 <IfModule mod_deflate.c> AddOutputFilterByType DEFLATE text/html text/plain text/css text/xml text/javascript ##支持壓縮的格式 DeflateCompressionLevel 6 ##壓縮比 SetOutputFilter DEFLATE </IfModule>
至此已經配置好了,咱們可使用腳本驗證下語法是否存在錯誤,驗證腳本在 /usr/local/httpd/bin/ 目錄中。java
[root@CentOS7-2 ~]# cd /usr/local/httpd/bin/ [root@CentOS7-2 bin]# ./apachectl -t -D DUMP_MODULES | grep "deflate" deflate_module (shared)
主配置文件中打開模塊,並在末尾添加語塊。web
vim /usr/local/httpd/conf/httpd.conf LoadModule expires_module modules/mod_expires.so ##開啓 ##在末尾添加下面的行 <IfModule mod_expires.c> ExpiresActive On ExpiresDefault "access plus 50 seconds" ##訪問最大緩存時間50s </IfModule>
查看模塊是否正常開啓apache
[root@CentOS7-2 ~]# cd /usr/local/httpd/bin/ [root@CentOS7-2 bin]# ./apachectl -t -D DUMP_MODULES | grep "expires" expires_module (shared)
此項主要是對網絡日益嚴重的盜鏈現象,防止本站點網址圖片被別人盜鏈使用。vim
主配置文件修改緩存
vim /usr/local/httpd/conf/httpd.conf LoadModule rewrite_module modules/mod_rewrite.so ##開啓
<Directory "/usr/local/httpd/htdocs">
Options Indexes FollowSymLinks安全AllowOverride None Require all granted RewriteEngine On RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://localhost$ [NC] RewriteCond %{HTTP_REFERER} !^http://localhost/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://localhost/$ [NC] RewriteRule .*\.(gif|jpg|swf)$ http://localhost/盜鏈圖片 ##放在網站站點目錄下,盜鏈原圖片會重定向到這張圖片上</Directory>服務器
查看模塊是否正常開啓
[root@CentOS7-2 ~]# cd /usr/local/httpd/bin/ [root@CentOS7-2 bin]# ./apachectl -t -D DUMP_MODULES | grep "rewrite" rewrite_module (shared)
打開主配置文件,開啓default配置文件
vim /usr/local/httpd/conf/httpd.conf Include conf/extra/httpd-default.conf ##開啓
vim /usr/local/httpd/conf/extra/httpd-default.conf ServerTokens Prod //只顯示名稱,沒有版本 ServerSignature Off
咱們能夠經過腳本查看當前工做模式
cd /usr/local/httpd/bin/ ./httpd -l
Prefork MPM : 這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器。
他的工做方式相似於Apache 1.3。它適合於沒有線程安全庫,須要避免線程兼容性問題的系統。它是要求將每一個請求相互獨立的狀況下最好的MPM,這樣若一個請求出現問題就不會影響到其餘請求。這個MPM具備很強的自我調節能力,只須要不多的配置指令調整。最重要的是將MaxClients設置爲一個足夠大的數值以處理潛在的請求高峯,同時又不能太大,以至須要使用的內存超出物理內存的大小。
Worker MPM : 此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。
因爲使用線程來處理請求,因此能夠處理海量請求,而系統資源的開銷小於基於進程的MPM。可是,它也使用了多進程,每一個進程又有多個線程,以得到基於進程的MPM的穩定性。每一個進程能夠擁有的線程數量是固定的。服務器會根據負載狀況增長或減小進程數量。一個單獨的控制進程(父進程)負責子進程的創建。每一個子進程能夠創建ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。
不論是Worker模式或是Prefork 模式,Apache老是試圖保持一些備用的(spare)或者是空閒的子進程(空閒的服務線程池)用於迎接即將到來的請求。這樣客戶端就不須要在獲得服務前等候子進程的產生。
Event MPM:以上兩種穩定的MPM方式在很是繁忙的服務器應用下都有些不足。
儘管HTTP的Keepalive方式能減小TCP鏈接數量和網絡負載,可是 Keepalive須要和服務進程或者線程綁定,這就致使一個繁忙的服務器會耗光全部的線程。 Event MPM是解決這個問題的一種新模型,它把服務進程從鏈接中分離出來。在服務器處理速度很快,同時具備很是高的點擊率時,可用的線程數量就是關鍵的資源限 制,此時Event MPM方式是最有效的。一個以Worker MPM方式工做的繁忙服務器可以承受每秒好幾萬次的訪問量(例如在大型新聞服務站點的高峯時),而Event MPM能夠用來處理更高負載。值得注意的是,Event MPM不能在安全HTTP(HTTPS)訪問下工做。
對於Event 模式,apache給出瞭如下警告:
This MPM is experimental, so it may or may not work as expected .
這種MPM目前處於試驗狀態,他可能不能按照預期的那樣工做。
在編譯安裝的配置中,指定--with-mpm=NAME 選項指定MPM,NAME就是你想使用的MPM的名稱。不指定模式的話,默認爲Prefork MPM。
開啓mpm配置文件模塊
vim /etc/httpd.conf Include conf/extra/httpd-mpm.conf
編輯配置模式參數
vim /usr/local/httpd/conf/extra/httpd-mpm.conf <IfModule mpm_prefork_module> StartServers 10 # 啓動時進程數 MinSpareServers 10 # 最小空閒進程數 MaxSpareServers 50 # 最大空閒進程數 MaxRequestWorkers 150 #最大併發進程數 MaxConnectionsPerChild 0 # 最大鏈接數限制 </IfModule>
三種配置模式的配置都是同樣的,咱們只須要對部分參數根據模式進行修改就能夠了。