歡迎關注公眾號
Nginx與php-fpm執行流程
- Nginx檢視nginx.conf配置檔案
- 載入nginx的fast-cgi模組
- php-fpm 監聽127.0.0.1:9000
- php-fpm 接收到請求,啟用worker程式處理請求
- php-fpm 處理完請求,返回給nginx
- nginx將結果通過http返回給瀏覽器
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 檔案位置。
兩種方式的資料傳輸過程如下圖所示:
兩種方式的通訊傳輸具體看這兩篇文章:
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
- 程式數優化
- 最大請求數優化
提示: 這個用來處理因為PHP解析器或引用的第三方庫時,造成的記憶體洩露問題。pm.max_requests = 10240
最大請求數:指一個php-fpm的工作程式在處理多少個請求後就終止掉。
- 最大請求數優化
- 最長執行時間優化(php.ini)
提示:這個是用來處理因為PHP執行時間超長而報502錯誤的解決。request_terminate_timeout = 20
這個時長配置可以在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
注意:我是使用的/etc/init.d/php7.2-fpm restart這種方式重啟的#!/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
然後編寫定時任務
用crontab -l檢視定時任務列表crontab -e /root/restart-php-fpm.sh
- 最長執行時間優化(php.ini)
本作品採用《CC 協議》,轉載必須註明作者和本文連結