對線面試官:php-fpm優化總結

PHPer技術棧發表於2022-06-01

Nginx與php-fpm執行流程

  • Nginx檢視nginx.conf配置檔案
  • 載入nginx的fast-cgi模組
  • php-fpm 監聽127.0.0.1:9000
  • php-fpm 接收到請求,啟用worker程式處理請求
  • php-fpm 處理完請求,返回給nginx
  • nginx將結果通過http返回給瀏覽器
    對線面試官:php-fpm優化總結

Nginx與php-fpm通訊機制

  www.test.com
        |
        |
      Nginx
        |
        |
路由到 www.test.com/index.php
        |
        |
載入 nginx 的 fast-cgi 模組
        |
        |
fast-cgi 監聽 127.0.0.1:9000 地址
        |
        |
www.test.com/index.php 請求到達 127.0.0.1:9000
        |
        |
     等待處理...

Nginx與php-fpm的結合
在 Linux 上,nginx 與 php-fpm 的通訊有 tcp socket 和 unix socket 兩種方式。
tcp socket 的優點是可以跨伺服器,當 nginx 和 php-fpm 不在同一臺機器上時,只能使用這種方式。
Unix socket 又叫 IPC(inter-process communication 程式間通訊) socket,用於實現同一主機上的程式間通訊,這種方式需要在 nginx配置檔案中填寫 php-fpm 的 socket 檔案位置。

兩種方式的資料傳輸過程如下圖所示:
對線面試官:php-fpm優化總結
兩種方式的通訊傳輸具體看這兩篇文章:
TCP協議傳送/接收資料實現
UDP協議傳送/接收資料實現

php-fpm程式管理

php-fpm採用的是master-worker的程式方式。其中,

  • master負責監聽埠,等待連結;其次,註冊訊號,可以通過資訊好master進行管理
  • worker負責處理具體的邏輯
    檢視php-fpm日誌資訊
  • 預設路徑-/usr/local/php/var/log

php-fpm優化

php.ini優化

//預設情況下伺服器對上傳檔案的大小是有限制的,如果想修改上傳檔案的限制可以修改php.ini檔案
file_uploads = On; //是否允許上傳檔案 
upload_max_filesize = 1024M; //上傳檔案的最大限制

post_max_size = 1024M; //通過post提交的最多資料

max_execution_time = 300; //指令碼最長的執行時間 單位為秒
max_input_time = 30000; //接收提交的資料的時間限制 單位為秒
memory_limit = 256M; //每個指令碼使用的最大記憶體  ;在安全模式下,你不能用ini_set()在執行時改變這個設定。

php-fpm.conf優化

(1)程式數設定

 pm = dynamic

 pm.max_children = 15  //靜態方式下開啟的php-fpm程式數量

 pm.start_servers = 5    //動態方式下的起始php-fpm程式數量

 pm.min_spare_servers = 5 //動態方式下 空閒時間最小的php-fpm程式

 pm.max_spare_servers = 5 //動態方式下 空閒時間最大的php-fpm程式

(2)最大處理請求數

最大處理請求數是指一個php-fpm的worker程式在處理多少個請求後就終止掉,master程式會重新respawn新的。 該配置可以避免php直譯器自身或程式引起的memory leaks。 
預設值是500, pm.max_requests = 1024 這樣的規劃,1秒鐘 
最大請求數:15*1024=15360 最小請求數:5*1024=7120

如何避免程式hang死

  • 方法1:設定php-fpm執行的超時時間為固定值
    vi php-fpm.conf 修改為request_terminate_timeout = 60
  • 方法2:定時reload php-fpm
    在負載較高的伺服器上定時過載php-fpm
    reload可以平滑重啟而不影響生產系統的php指令碼執行,每15分鐘reload一次
    0-59/15 * * * * /usr/local/php/sbin/php-fpm reload
  • 方法3:優化程式池配置
    php-fpm根據配置檔案內容和實際情況,動態建立子程式來處理請求。當達到能夠建立的最大值時,只能阻塞。一個個地進行執行。
    • 程式數優化
      pm = dynamic
      pm.max_children = 300
      pm.start_servers = 20
      pm.min_spare_servers = 5
      pm.max_spare_servers = 35
    • 最大請求數優化
      pm.max_requests = 10240
      提示: 這個用來處理因為PHP解析器或引用的第三方庫時,造成的記憶體洩露問題。
      最大請求數:指一個php-fpm的工作程式在處理多少個請求後就終止掉。
    • 最長執行時間優化(php.ini)
      request_terminate_timeout = 20
      提示:這個是用來處理因為PHP執行時間超長而報502錯誤的解決。
      這個時長配置可以在php.ini(max_execution_time)或php-fpm.conf中配置均可,為了不影響全域性配置,可在php-fpm.conf中實現crontab定時任務把php-fpm平滑重啟,這種方式就是使用crontab定時任務去定時查詢網站是否502了,如果502了,就把php-fpm平滑重啟
      首先在/root/目錄下面建立指令碼
      vim restart-php-fpm.sh
      然後給這個指令碼賦予執行許可權
      chmod +x /root/restart-php-fpm.sh
      然後就是編寫指令碼內容了,上程式碼
      #!/bin/bash
      MY_URL="http://www.****.com/"
      RESULT=`curl -I $MY_URL|grep "HTTP/1.1 502"`
      if [ -n "$RESULT" ]; then
       /etc/init.d/php7.2-fpm restart
      fi
      注意:我是使用的/etc/init.d/php7.2-fpm restart這種方式重啟的
      然後編寫定時任務
      crontab -e
      /root/restart-php-fpm.sh
      用crontab -l檢視定時任務列表
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章