httpd2.4.23優化配置


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 serverPrefork會在開啓一個子進程。保持一直有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對應的一行的註釋去了,把原來的關閉即可

image.png

mpm的配置文件是在extra/httpd-mpm.conf,我們以worker爲例做一下mpm的優化配置

image.png

完成配置我們重啓加載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>

這樣的配置就只允許本地的鏈接了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章