:::

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的支持,才能啟用。
  1. 更新套件庫
    apt-get update
  2. 升級套件
    apt-get upgrade
  3. 安裝php-fpm
    #for Debian 10 Buster
    apt-get install -y php7.3-fpm
    
    #for Debian 9 Stretch
    apt-get install -y php7.0-fpm 
    
    #for Debian 8 Jessie
    apt-get install -y php5.6-fpm 
  4. 關閉mpm_prefork 相關模組 (php版本請自行調整) 、開啟 mpm_event 相關模組並啟用 php-fpm 設定,最後重啟apache使之生效
    a2dismod php7.0 mpm_prefork
    a2enmod  mpm_event proxy_fcgi setenvif
    a2enconf php7.0-fpm
    systemctl restart apache2
  5. 設定 php.ini,可參考 https://campus-xoops.tn.edu.tw/modules/tad_book3/page.php?tbdsn=220
    #for Debian 10 Buster
    vi /etc/php/7.3/fpm/php.ini
    
    #for Debian 9 Stretch
    vi /etc/php/7.0/fpm/php.ini
    
    #for Debian 8 Jessie
    vi /etc/php/5.6/fpm/php.ini
  6. 修改後請重啟apache
    systemctl restart apache2
  7. 重啟 php-fpm 後 php.ini 才會生效,先找出 php-fpm: master process 的程序編號
    ps aux|grep php-fpm
  8. 然後根據程序編號執行以下指令即可重啟 php-fpm
    kill -USR2 程序編號
  9. 編輯 mpm_event 設定檔
    vi /etc/apache2/mods-available/mpm_event.conf
  10. 建議內容如下:
    <IfModule mpm_event_module>
        StartServers             3
        MinSpareThreads         75
        MaxSpareThreads        250
        ThreadsPerChild         25
        MaxRequestWorkers      400
        MaxConnectionsPerChild   0
    </IfModule>
    
    • StartServers:一開始建立的子進程數,每個子進程中包含固定的ThreadsPerChild線程數
    • MinSpareServers:最小數量的服務器進程,保存備用(最大預設值是75,達此數就不再主動建立新的進程,如果站點負載較大,可加大此值)
    • MaxSpareServers:最大數量的服務器進程,保存備用(最大預設值是250,空閒進程數大於此值時,Apache會自動kill掉一些多餘進程。故不要設得過大,如果站點負載較大,可加大此值)
    • ThreadsPerChild: 每個子進程的線程數(預設值是64, 如果負載較大,64也是不夠的。這時要顯式使用 ThreadLimit 指令,它的最大預設值是 20000)
    • MaxRequestWorkers: 如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程
    • MaxConnectionsPerChild:設置的是每個子進程可處理的請求數(0意味著子進程永不銷毀,但不建議,舊名MaxRequestsPerChild )
  11. Worker模式下所能同時處理的請求總數=子進程總數xThreadsPerChild ,請求總數應該 >= MaxRequestWorkers。
  12. 如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。
  13. 默認最大的子進程總數是16,加大時 也需要顯式聲明ServerLimit(最大值是20000)
  14. 需要注意的是,如果顯式聲明了ServerLimit,那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數倍,否則 Apache將會自動調節到一個相應值。
  15. 修改 /uploads/.htaccess
    vi /var/www/html/uploads/.htaccess
  16. 最後重新啟動Apache
    systemctl restart apache2
  17. 刪掉 php_flag engine off,並在最後加入:
    <Files "*.php">
      SetHandler none
      SetHandler default-handler
      Options -ExecCGI
      RemoveHandler .php
    </Files>
  18. 日後若要改回mpm_prefork模式的話,則反過來做即可
    a2dismod mpm_event proxy_fcgi setenvif
    a2enmod php7.0 mpm_prefork
    systemctl restart apache2
  19. 記得刪掉php-fpm程序
     ps aux|grep php-fpm|awk '{print $2}'|xargs kill -9

:::

書籍目錄

展開 | 闔起

QR Code 區塊

http%3A%2F%2Fcampus-xoops.tn.edu.tw%2Fmodules%2Ftad_book3%2Fpage.php%3Ftbdsn%3D1348

計數器

今天: 398398398
昨天: 2865286528652865
總計: 3222036322203632220363222036322203632220363222036