擴展:expires模塊的語法
上面已經的操作就是實現apache的緩存功能。其中,expires後面的參數你也可以根據需求自行更改,緩存時間也是一樣可以更改的。
這裏我對expires的模塊語法進行一些細說
expires模塊用到了ExpiresDefault和EXpiresByType兩個指令,下面是這兩個指令的語法。
ExpiresDefault “<base> [plus] {<num><type>}*”
EXpiresByType type/encoding "<base> [plus] {<num><type>}"
其中<base>的參數有3個:access,now(等價於‘access’),modification
plus關鍵字是可選的。
<num>必須是整數,確保可以atoi()所接收。(atoi可以把字符串轉換成長整型數)
<type>參數類型:years,months,weeks,days,hours,minutes,seconds
下面用幾個例子帶大家理解下
例如:下面3個指令都表示文檔默認的有效期是一個月
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"
有效期可以通過增加“<num><type>”子句進一步調整
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"
注意:如果你使用基於最後修改日期的設置,“Expires”頭將不會被添加到那些並非來自於硬盤文件的內容,這是因爲這些內容並不存在“最後修改時間”的屬性。
基準時刻可以是源文件的最後修改時刻或者客戶端對源文件的訪問時刻,至於使用那一個則由<code>指定。“M”表示源文件的最後修改時刻,“A”表示客戶端對源文件的訪問時刻,需要注意的是<code>和seconds之間沒有空格。
這兩個基準的差別是很微妙的。如果使用“M”,所有當前緩存中的文檔副本都將在同一時刻過期,這個可能對定期更新的URL(比如位於同一位置的每週通告)很有好處。如果使用“A”,則每個客戶端所得到的有效期是不一樣的,這個可能對那些幾乎不更新的圖片很有好處,特別是對於一組都引用相同圖片的相關文檔。
緩存優化對企業來說是至關重要了的,不同的公司類型,緩存的類型和時間又各不相同,大傢俱體可以用YSlow對淘寶,京東,新浪,谷歌等站點進行測試,看看他們的緩存時間是多少,並思考下爲什麼那樣設置。
雖然緩存的設置有如下優點
1.縮短服務的響應時間
2.減輕服務器負擔
3.減少網絡帶寬使用量,降低企業成本
但是他的缺點也是顯而易見的,由於使用了緩存設置,導致被緩存的內容更新了,但是客戶看到的卻還是舊的。
如何解決被緩存文件及時更新這個問題呢?
1.
第一種:縮短緩存時間例如:1天,不徹底犧牲性能
2.
第二種:對緩存的對象改名。
九、啓用worker模式,提升併發數(可以達到2000-5000)
apache有兩個模式,默認的模式是prefork模式。那麼我們爲什麼要使用worker模式呢?這兩種模式又有什麼區別呢?
1、prefork模式
prefork使用的是多個子進程,而每個子進程只有一個線程,每個進程在某個確定的時間只能維持一個連接。
工作原理:控制進程最初建立若干個子進程,爲了不在請求到來時再生成子進程,所以要根據需求不斷的創建新的子進程,最大可以達到每秒32個直到滿足需求爲止。
安裝方法:在編譯的過程中,加入參數--with-mpm=frefork,不加也可以,因爲默認的話,會採用prefork模式。
優點:效率高,穩定,安全。對於線程調試困難的平臺來說,調試更加容易些。
缺點:與worker模式相比消耗資源多。
配置參數說明:
</IFModule mpm_prefork_module>
StartServers 5 #最初建立的子進程
MinSpareServers 5 #最小空閒進程數,如果空閒的進程小於設定值,Apache會自動建立進程,如果服務器併發及負載大的話,可以考慮加大。
MaxSpareServers 10 #最大空閒進程數,如果空閒的進程大於設定值,Apache會自動kill掉多餘的進程,如果服務器負載大的話,可以考慮加大。
MaxClients 150 #設定的是apache可以同時處理的請求,是對apache性能影響最大的參數,就是apache可以同時處理的請求數,就是說,如果有150個用戶在訪問,那麼第151個用戶就要等之前的訪問結束後才能訪問。
MaxRequestsPerChild 0 #每個子進程可處理的請求數,每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷燬。0以爲着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設置成非0值也有兩點重要的好處。(1)可防止意外的內存泄露(2)在服務器負載下載的時候會自動減少子進程數。
</IFModule>
生產環境配置實例1:
</IFModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 5000
</IFModule>;
2、worker模式
worker模式是apche2.x新引進來的模式,是線程與進程的結合,在worker模式下會有多個子進程,每個子進程又會有多個線程。每個線程在某個確定的時間只能維持一個連接。
工作原理:由主控制進程生成若干個子進程,而每個子進程中又包含固定的線程數,各個線程獨立處理請求,同樣爲了不在請求到來時再生成線程,在配置文件中設置了最小和最大的空閒線程數及所有子進程中的線程總數,如果現有子進程中的線程總數不能滿足併發及負載,控制進程將派生新的子進程。
安裝方法:在配置編譯的工程中,加入參數--with-mpm=worker,如果不加的話系統會採用默認prefork模式。
優點:內存佔用比prefork模式低,適合高併發高流量HTTP服務。
缺點:假如一個線程崩潰,整個進程就會連同其任何線程一起“死掉”。由於線程共享內存空間,所以一個程式在運行時必須被系統識別爲“每個線程都是安全的”。服務穩定性不如prefork模式。
配置參數說明:
</IFModule mpm_worker_module>
StartServers 2 #最初建立的子進程
MaxClients 150 #所有子進程中的線程總數。如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
MinSpareThreads 25 #最小空閒線程數,如果空閒的線程小於設定值,apache會自動建立線程,如果服務器負載大的話,可以考慮加大此參考值。
MaxSpareThreads 75 #最大空閒線程數,如果空閒的線程大於設定值,apache會自動kill掉多餘的線程,如果服務器負載大的話,可以考慮加大此參考值。
ThreadsPerChild 25 #每個進程包含固定的線程數,此參數在worker模式中,是影響最大的參數,ThreadsPerChild的最大缺省值是64,如果負載較大,64是不夠的。這時要顯式使用threadlimit指令,它的最大缺省值是20000.
MaxRequestsPerChild 0 #功能同prefork模式
</IFModule>
常用配置參考:
生產環境配置實例1:
</IFModule mpm_worker_module>
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IFModule>
生產環境配置實例2:
</IFModule mpm_worker_module>
StartServers 5
MaxClients 9600
ServerLimit 64
MinSpareThreads 25
MaxSpareThreads 500
ThreadLimit 200
ThreadsPerChild 150
MaxRequestsPerChild 0
</IFModule>
生產場景配置實例3:
</IFModule mpm_worker_module>
StartServers 2
MaxClients 500
ServerLimit 25
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IFModule>
生產場景配置實例4:
</IFModule mpm_worker_module>
StartServers 3
MaxClients 1600
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 64
</IFModule>
worker模式下所能同時處理的請求總數是由子進程總數乘以Threadsperchild值決定的,應該大於等於maxclients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,如需加大時也需要顯示聲明serverlimit的值(最大值是20000)
特別說明:如果顯示聲明瞭ServerLimit,那麼它乘以ThreadsPerChild的值必須大於等於MaxClients,而且MaxClients必須是ThreadsPerChild的整數倍,否則apache將會自動調節到一個相應值(可能是個非期望值)。
數學表達:
1.
MaxClient<=總的進程數(ServerLimit)x線程數(ThreadsPerChild)
2.
MaxClient%ThreadsPerChild=0
生產環境中我們需要開啓httpd-mpm.conf配置行,這樣才能實現併發鏈接數的增加。
1、開啓httpd-mpm.conf配置行
這裏我們要apache的主配置文件httpd.conf,找到包含httpd-mpm.conf的行,並解開註釋
1.
[root@c64-web /]# grep "httpd-mpm.conf" /usr/local/apache/conf/httpd.conf
2.
#Include conf/extra/httpd-mpm.conf
3.
[root@c64-web /]# sed -i 's#\#Include conf/extra/httpd-mpm.conf#Include conf/extra/httpd-mpm.conf#g' /usr/local/apache/conf/httpd.conf
注意:編譯安裝的,只有此行解開註釋了,後面的修改才能生效。
2、修改httpd-mpm.conf配置
1)如果你的apache服務爲worker模式,那麼生產環境中可以選擇上面worker模式的生產環境配置實例1的配置。
2)如果你的apache服務爲prefork模式,那麼生產環境中可以參考上面prefork模式的生產環境配置實例1的配置。
生產環境中,這裏我建議大家選擇worker模式。