一、基本配置javascript
1)KeepAlive On/Off php
KeepAlive指的是保持鏈接活躍,換一句話說,若是將KeepAlive設置爲On,那麼來自同一客戶端的請求就不須要再一次鏈接,避免每次請求都要新建一個鏈接而加劇服務器的負擔。通常狀況下,圖片較多的網站應該把KeepAlive設爲 On。 css
2)KeepAlive TimeOut number html
若是第二次請求和第一次請求之間超過KeepAlive TimeOut的時間的話,第一次鏈接就會中斷,再新建第二個鏈接。它的設置通常考慮圖片或者JS等文件兩次請求間隔,通常設置爲3-5秒。java
3)MaxKeepAlive Requests 100 python
一次鏈接能夠進行的HTTP 請求的最大請求次數。將其值設爲0,將支持在一次鏈接內進行無限次的傳輸請求。事實上沒有客戶程序在一次鏈接中請求太多的頁面,一般達不到這個上限就完成鏈接了。web
4)Hostname Lookups on|off|double apache
若是是使用on,那麼只有進行一次反查,若是用double,那麼進行反查以後還要進行一次正向解析,只有兩次的結果互相符合才行,而off就是不進行域名驗證。 若是爲了安全,建議使用double;爲了加快訪問速度,建議使用off。域名查找開啓這個會增長 apache的負擔,減慢訪問速度建議關閉 vim
5)timeout 5 centos
推薦 5 這個是 apache 接受請求或者發出相應的時間超過這個時間斷開 注:以上配置項可在/usr/local/http/conf/extra/httpd-default.conf 設置並在 httpd.conf 文件中經過 include 選項引用
二、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
三、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
四、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>
五、禁止遍歷目錄(當web上不存在索引頁時,用戶輸入域名\IP直接訪問,會顯示網頁根目錄的目錄樹,經過下面的操做可避免此類狀況的產生)
編輯主配置文件httpd.conf
將Options Indexes FollowSymLinks更改成Options FollowSymLinks
六、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 #
注:能夠隨便改改,讓別人不知道你的服務器版本信息
七、日誌切割
方法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
八、配置防盜鏈
方法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>
這樣的配置就只容許本地的連接了