7-3
Event 模式
這個是Apache中最新的模式,在現在版本裡的已經是穩定可用的模式。它和worker模式很像,最大的區別在於,它解決了keep-alive場景下,長期被佔用的線程的資源浪費問題(某些線程因為被keep-alive,空掛在哪裡等待,中間幾乎沒有請求過來,甚至等到超時)。
event MPM中,會有一個專門的線程來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務線程,執行完畢後,又允許它釋放。這樣增強了高並發場景下的請求處理能力。
event MPM在遇到某些不兼容的模塊時,會失效,將會回退到worker模式,一個工作線程處理一個請求。官方自帶的模塊,全部是支持event MPM的。
注意一點,event MPM需要Linux系統(Linux 2.6+)對EPoll的支持,才能啟用。
- 更新套件庫
- 升級套件
- 安裝php-fpm
- 關閉mpm_prefork 相關模組 (php版本請自行調整) 、開啟 mpm_event 相關模組並啟用 php-fpm 設定,最後重啟apache使之生效
- 設定 php.ini,可參考 https://campus-xoops.tn.edu.tw/modules/tad_book3/page.php?tbdsn=220
- 修改後請重啟apache
- 重啟 php-fpm 後 php.ini 才會生效,先找出 php-fpm: master process 的程序編號
- 然後根據程序編號執行以下指令即可重啟 php-fpm
- 編輯 mpm_event 設定檔
- 建議內容如下:
-
- StartServers:一開始建立的子進程數,每個子進程中包含固定的ThreadsPerChild線程數
- MinSpareServers:最小數量的服務器進程,保存備用(最大預設值是75,達此數就不再主動建立新的進程,如果站點負載較大,可加大此值)
- MaxSpareServers:最大數量的服務器進程,保存備用(最大預設值是250,空閒進程數大於此值時,Apache會自動kill掉一些多餘進程。故不要設得過大,如果站點負載較大,可加大此值)
- ThreadsPerChild: 每個子進程的線程數(預設值是64, 如果負載較大,64也是不夠的。這時要顯式使用 ThreadLimit 指令,它的最大預設值是 20000)
- MaxRequestWorkers: 如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程
- MaxConnectionsPerChild:設置的是每個子進程可處理的請求數(0意味著子進程永不銷毀,但不建議,舊名MaxRequestsPerChild )
- Worker模式下所能同時處理的請求總數=子進程總數xThreadsPerChild ,請求總數應該 >= MaxRequestWorkers。
- 如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。
- 默認最大的子進程總數是16,加大時 也需要顯式聲明ServerLimit(最大值是20000)
- 需要注意的是,如果顯式聲明了ServerLimit,那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數倍,否則 Apache將會自動調節到一個相應值。
- 修改 /uploads/.htaccess
- 最後重新啟動Apache
- 刪掉 php_flag engine off,並在最後加入:
- 日後若要改回mpm_prefork模式的話,則反過來做即可
- 記得刪掉php-fpm程序