1、基本配置
1)KeepAlive On/Off
KeepAlive指的是保持連接活躍,換一句話說,如果將KeepAlive設置爲On,那麼來自同一客戶端的請求就不需要再一次連接,避免每次請求都要新建一個連接而加重服務器的負擔。一般情況下,圖片較多的網站應該把KeepAlive設爲 On。
2)KeepAlive TimeOut number
如果第二次請求和第一次請求之間超過KeepAlive TimeOut的時間的話,第一次連接就會中斷,再新建第二個連接。它的設置一般考慮圖片或者JS等文件兩次請求間隔,一般設置爲3-5秒。
3)MaxKeepAlive Requests 100
一次連接可以進行的HTTP 請求的最大請求次數。將其值設爲0,將支持在一次連接內進行無限次的傳輸請求。事實上沒有客戶程序在一次連接中請求太多的頁面,通常達不到這個上限就完成連接了。
4)Hostname Lookups on|off|double
如果是使用on,那麼只有進行一次反查,如果用double,那麼進行反查之後還要進行一次正向解析,只有兩次的結果互相符合才行,而off就是不進行域名驗證。 如果爲了安全,建議使用double;爲了加快訪問速度,建議使用off。域名查找開啓這個會增加 apache的負擔,減慢訪問速度建議關閉
5)timeout 5
推薦 5 這個是 apache 接受請求或者發出相應的時間超過這個時間斷開 注:以上配置項可在/usr/local/http/conf/extra/httpd-default.conf 設置並在 httpd.conf 文件中通過 include 選項引用
2、mpm優化
mpm有三個模式Prefork、Worker和Event模式
Prefork模式:
工作原理
非線程的模式,默認會開啓5個子進程,每個子進程開1個線程等待用戶的連接,而沒有一個用戶連接到http server,Prefork會在開啓一個子進程。保持一直有5個空閒的子進程等待連接。該模式優點是穩定性很高,因爲1個連接出現問題,只會影響其所連接的子進程,這樣就只會斷開這一個連接,不會影響到其他用戶的連接。但相對的,一個連接就要佔用一個進程,損失了併發連接的性能。
配置
StartServers 啓動時開啓的子進程數量
MinSpareServers 最小空閒的子進程數
MaxSpareServers 最大空閒的子進程數
MaxRequestWorkers 最大連接的客戶數量,影響併發
MaxRequestsPerChild 子進程處理多少個請求後自動銷燬,默認爲0,永不銷燬
Woker模式:
工作原理
多進程多線程的模式,默認會開啓3個子進程,每個子進程默認產生25個線程,所以默認Worker模式最小空閒子進程的值默認就是3*25也就是75個。這樣Worker模式從最開始就確定了在併發上要優於Perfork模式。Worker模式是在啓動時開啓了3個子進程,在每個子進程中會開啓多個線程(根據設定的值而定),每個線程都可以處理用戶請求,每個線程公用所屬子進程的內存空間。這樣的模式,會節省內存空間,能夠具有更高的併發處理能力。但是,有利也有弊,如果一個連接出現問題,會導致所屬子進程出現問題,那麼這個子進程下的所有線程都會出現問題。也就是說一個連接出現問題,會導致多個連接的崩潰。
配置
StartServers 啓動時開啓的子進程數量
ThreadsPerChild 每個子進程產生的線程數量
MaxRequestWorkers 最大連接的客戶數量,影響併發
MinSpareThreads 最小空閒數量的工作線程
MaxSpareThreads 最大空閒數量的工作線程
MaxConnectionsPerChild 子進程處理多少個請求後自動銷燬,默認爲0,永不銷燬
Event 模式:
這是Apache最新的工作模式,是 worker 模式的變種,它把服務進程從連接中分離出來,與worker 模式不同的是在於它解決了keep-alive 長連接的時候佔用線程資源被浪費的問題,在event工作模式中,會有一些專門的線程用來管理這些 keep-alive 類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又允許它釋放。這增強了在高併發場景下的請求處理。event模式的缺點是不能很好的支持 https的訪問(HTTP 認證相關的問題),所以在生產環境,Worker模式使用的依然多於Event模式。
操作
通過下面的命令可以查看到目前使用的mpm
[root@centos7a httpd-2.4.23]# httpd -V | grep -i mpm Server MPM: event
如果想要修改mpm,可以修改httpd.conf,找到這裏講想要開啓的mpm對應的一行的註釋去了,把原來的關閉即可
mpm的配置文件是在extra/httpd-mpm.conf,我們以worker爲例做一下mpm的優化配置
完成配置我們重啓加載apache配置
apachectl graceful
有上面的命令可以在httpd完成所有用戶連接後重新加載配置,建議使用這個命令代替restart
3、deflate壓縮(用以壓縮用戶請求頁面)
默認deflate是沒有開啓的,如果想要開啓需要在httpd.conf中找到下面的兩行,取消註釋
LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so
下面是我配置
<IfModule mod_deflate.c> DeflateCompressionLevel 9 SetOutputFilter DEFLATE AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript #application/x-httpd-php #AddOutputFilterByType DEFLATE image/* AddOutputFilterByType DEFLATE text/* AddOutputFilterByType DEFLATE application/ms* application/vnd* #application/postscript application/javascript application/x-javascript AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary DeflateFilterNote Input input_info DeflateFilterNote Output output_info DeflateFilterNote Ratio ratio_info LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate CustomLog logs/deflate_log.log deflate </IfModule>
如果你在編譯安裝的時候沒有加載deflate模塊,在啓動httpd時會報錯,如下
[root@centos7a filters]# apachectl -t httpd: Syntax error on line 104 of /usr/local/http/conf/httpd.conf: Cannot load modules/mod_deflate.so into server:/usr/local/http/modules/mod_deflate.so: undefined symbol: inflate
可以通過動態共享對象(DSO)加載。
首先你的服務器需要有zlib-devel
然後vim /usr/local/apr/bin/apr-1-config
將LDFLAGS=""更改爲LDFLAGS="-lz"
在執行下面命令加載模塊(注意我將httpd的源碼包解壓在/root目錄下了)
cd /root/httpd-2.4.23/modules/filters/ /usr/local/http-2/bin/apxs -c -i -a mod_deflate.c
4、expires緩存(用戶重複請求,可通過訪問本地緩存以避免服務器反覆處理這些請求)
同樣需要找到httpd.conf,修改以開啓
LoadModule expires_module modules/mod_expires.so
我的配置如下
<IfModule mod_expires.c> ExpiresActive On ExpiresByType text/css "now plus 1 month" ExpiresByType application/x-javascript "now plus 5 day" ExpiresByType image/jpeg "access plus 1 month" ExpiresByType image/gif "access plus 1 month" ExpiresByType image/bmp "access plus 1 month" ExpiresByType image/x-icon "access plus 1 month" ExpiresByType image/png "access plus 1 minute" ExpiresByType application/x-shockwave-flash "access plus 1 month" ExpiresDefault "now plus 0 minute" </IfModule>
5、禁止遍歷目錄(當web上不存在索引頁時,用戶輸入域名\IP直接訪問,會顯示網頁根目錄的目錄樹,通過下面的操作可避免此類情況的產生)
編輯主配置文件httpd.conf
將Options Indexes FollowSymLinks更改爲Options FollowSymLinks
6、apache 隱藏版本信息(在迴應報文中不顯示服務器版本信息)
編輯主配置文件httpd.conf,取消下面一行註釋即可。
Include conf/extra/httpd-default.conf
修改extra/httpd-default.conf
將ServerTokens Full改成ServerTokens Prod 將ServerSignature On改成ServerSignature off
這時候其實迴應報文還是會顯示出你的服務器是用Apache搭建的,如果想徹底解決這個煩惱的話,需要在編譯安裝的之前vim /root/httpd-2.4.23/include/ap_release.h(這裏我是將httpd源碼包解壓在/root/下了)
#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 23 #補丁級別 #define AP_SERVER_DEVBUILD_BOOLEAN 0 #
注:可以隨便改改,讓別人不知道你的服務器版本信息
7、日誌切割
方法1:apache自帶的rotatelogs
編輯主配置文件httpd.conf
註釋掉如下兩行 #ErrorLog logs/error_log #CustomLog logs/access_log common 然後添加如下兩行 ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400" CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined
後面的86400的單位爲秒,所以表示着日誌切割的輪轉日期爲一天
方法2:第三方的cronolog
首先你需要cronolog的源碼包cronolog-1.6.2.tar.gz,然後安裝
tar zxf cronolog-1.6.2.tar.gz cd cronolog-1.6.2/ ./configure && make && make install
編輯主配置文件
同樣註釋掉如下兩行 #ErrorLog logs/error_log #CustomLog logs/access_log common 添加如下 ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log" CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined
使用上面的配置,你的日誌就是以後綴的最小單位/天爲輪轉,如果你想要以小時爲輪轉可以這麼寫
CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined
8、配置防盜鏈
方法1:使用rewrite模塊做重定向
首先你開啓你的rewrite模塊,編輯httpd.conf,下面的行取消註釋
LoadModule rewrite_module modules/mod_rewrite.so
配置
RewriteEngine On RewriteCond %{HTTP_REFERER} !^$ RewriteCond %{HTTP_REFERER} !^http://abcdef.com/.*$ [NC]#寫你的域名 RewriteCond %{HTTP_REFERER} !^http://abcdef.com$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.abcdef.com/.*$ [NC] RewriteCond %{HTTP_REFERER} !^http://www.abcdef.com$ [NC] RewriteRule .*\.(gif|jpg|swf)$http://www.abcdef.com/about/nolink.png[R,NC,L]#規則這裏寫了強制重定向到一個地方,給了一張圖片。 ##也可以將規則也成這樣# RewriteRule RewriteRule .*\.(gif|jpg|png)$ - [F]#直接強制禁止,返回403狀態
方法2:使用httpd的訪問限制
編輯httpd.conf,找到你的資源的files配置位置,添加如下,注意版本問題,注意filesmatch是個閉合空間。
SetEnvIfNoCase Referer "^$" local_ref SetEnvIfNoCase Referer "^http://www.abcdef.com/.*$" local_ref#填寫自己的域名 SetEnvIfNoCase Referer "^http://abcdef.com/.*$" local_ref <filesmatch "\.(mp3|mp4|zip|rar|jpg|gif|png)"> 如果是2.4以前的版本 Order Deny,Allow Allow from env=local_ref Deny from all 如果是2.4版本(就是我們現在使用的版本) Require all denied Require env local_ref </filesmatch>
這樣的配置就只允許本地的鏈接了