php-fpm 進程管理

2017年4月2日 20:39:16 星期日php

ps -ef | grep php-fpm | grep master | awk '{print $2}' | xargs kill -12  #kill -12 就是告知master進程平滑重啓html

或 ps -ef | grep php-fpm | grep master | awk '{print $2}' | xargs sudo kill -12web

 

2015年2月26日 15:40:15apache

先查找 PHP-FPM 的進程號json

1 ps -ef | grep php-fpm
2 root       900     1  0 Feb12 ?        00:00:39 php-fpm: master process (/usr/local/web/php/etc/php-fpm.conf)
3 nobody     901   900  0 Feb12 ?        00:00:13 php-fpm: pool www
4 nobody     902   900  0 Feb12 ?        00:00:13 php-fpm: pool www
5 nobody    1911   900  0 Feb13 ?        00:00:12 php-fpm: pool www

能夠看到主進程的pid是 900bash

而後用kill命令給這個進程發送重啓的信號服務器

kill -SIGUSR2 900

其它的信號:負載均衡

1 SIGINT, SIGTERM 馬上終止
2 SIGQUIT 平滑終止
3 SIGUSR1 從新打開日誌文件
4 SIGUSR2 平滑重載全部worker進程並從新載入配置和二進制模塊

 bash 腳本(根據網上找的腳本,精簡後的, 去掉了檢測當前pid的grep+awk代碼, 建議使用時直接使用restart指令, Mac上可用,可是注意權限)ide

 1 #!/bin/sh
 2 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 3     
 4 BINFILE="/usr/sbin/php-fpm"
 5 CFGFILE="/etc/php-fpm.conf"
 6 PIDFILE="/var/run/php-fpm.pid"
 7 LOCKFILE="/var/lock/php-fpm.lock"
 8 INIFILE="/etc/php.ini"
 9     
10 RETVAL=0
11     
12 start() {
13     [[ -x $BINFILE ]] || exit 5
14     [[ -f $CFGFILE ]] || exit 6
15        
16     $BINFILE -t >/dev/null 2>&1
17        
18     if [[ $? -ne 0 ]]; then
19         echo "The php-fpm configure has error."
20         return 1
21     fi
22        
23     echo "Starting php-fpm......"
24     sudo $BINFILE -c ${INIFILE} -y $CFGFILE -g ${PIDFILE}
25     RETVAL=$?
26     echo "ok~"
27     [[ $RETVAL -eq 0 ]] && touch $LOCKFILE
28        
29     return $RETVAL
30 }
31     
32 stop() {
33     echo "Shutting down php-fpm......"
34        
35     if [[ -f $PIDFILE ]]; then
36         kill -3 `cat ${PIDFILE}`
37     else
38         kill -3 `ps aux | grep php-fpm | awk '/master/{print $2}'`
39     fi
40        
41     RETVAL=$?
42     echo "ok~"
43     [[ $RETVAL -eq 0 ]] && sudo rm -f $LOCKFILE $PIDFILE
44        
45     return $RETVAL
46 }
47     
48 restart() {
49     stop
50     sleep 1
51 
52     start
53     sleep 1
54        
55     RETVAL=$?  
56     return $RETVAL
57 }
58     
59 reload() {
60     echo -n $"Reloading php-fpm......"
61        
62     if [[ -f $PIDFILE ]]; then
63         kill -USR2 `cat ${PIDFILE}`
64     else
65         kill -USR2 `ps aux | grep php-fpm | awk '/master/{print $2}'`
66     fi
67        
68     RETVAL=$?
69     echo "ok~"
70        
71     return $RETVAL
72 }
73     
74 case "$1" in
75 start)
76     start
77     ;;
78        
79 stop)
80     stop
81     ;;
82        
83 restart)
84     restart
85     ;;
86        
87 reload)
88     reload
89     ;;
90        
91 *)
92     echo "Usage: service php-fpm {start|stop|restart|reload}"
93     RETVAL=1
94 esac
95     
96 exit $RETVAL
View Code

 

 配置文件翻譯:php-fpm

[全局配置]

include:  本配置文件中的相對路徑都是以php的安裝路徑的根目錄爲基準的, 能夠在命令行中用-p參數制定相對路徑

pid: 進程號所在的文件, 默認放在 path/to/php/var

emergency_restart_threshold (進程個數) emergency_restart_interval (時間段)

在必定時間段內, 由於SIGSEGV(內存段錯誤) 或者 SIGBUS(總線錯誤)致使進程退出個數等於某個值fpm就會重啓

process.max: 控制子進程最大數的全局變量, 後邊的設置子進程數量的指令受到這個值的限制, 0表示無限制

process.priority: master進程的優先級, -19~20, 子進程會繼承該值

rlimit_*:  resource limit, Linux資源限制, 使用默認值的話, 就以操做系統設置爲準 

events.mechanism: 事件通知機制, 註釋掉則自動選擇, 目前最流行的是epoll, 將準備就緒的進程號(大概這樣理解吧)放到一個文件裏, 每次只用掃描這個文件就知道誰準備好了

[進程池配置]

[www]  進程池名字爲www

1 nobody   15942 30485  0 10:19 ?        00:00:15 php-fpm: pool www 2 nobody   16302 30485  0 10:21 ?        00:00:01 php-fpm: pool www 3 nobody   16303 30485  0 10:21 ?        00:00:01 php-fpm: pool www 4 root     30485     1  0 Apr19 ?        00:10:46 php-fpm: master process (/..../php-fpm.conf)

也能夠在一個配置文件中定義多個進程池(監聽不一樣的端口)

1 root     16837     1  0 17:15 ?        00:00:00 php-fpm: master process (/..../php-fpm-test.conf)
2 nobody   16838 16837  0 17:15 ?        00:00:00 php-fpm: pool www 3 nobody   16839 16837  0 17:15 ?        00:00:00 php-fpm: pool www 4 nobody   16840 16837  0 17:15 ?        00:00:00 php-fpm: pool test 5 nobody   16841 16837  0 17:15 ?        00:00:00 php-fpm: pool test

 

listen = 127.0.0.1:9001 監聽ip+端口

listen.allowed_clients , 容許訪問的ip

priority 優先級

pm 控制子進程數量的模式 static, 固定數量; dynamic, 動態變化數量, 至少有一個; ondemand, 來一個請求fork一個

 

pm.max_children :

當pm=static時 子進程的數量, 當pm=dynamic 或者 pm=ondemand時, 子進程最大的進程數

該條命令至關於 apache的 mpm_prefork指令, 至關於php的PHP_FCGI_CHILDREN環境變量

pm中的默認值是基於低配置服務器設置的, 能夠修改相應的配置指令去適合你本身的服務器

 

pm.start_servers: 啓動fpm時生成的子進程數目

pm.min_spare_servers: 最小空閒進程數

pm.max_spare_servers: 最大空閒進程數

pm.min_spare_servers < pm.start_servers < pm.max_spare_servers

 

pm.max_requests: 每一個子進程再重啓前所能處理的最大請求數, 0表示無限制, 至關於PHP_FCGI_MAX_REQUESTS

 

pm.status_path = /status: http://www.foo.bar/status?json&full 

查看fpm的狀態信息, 必須以"/"開頭, 最好不要以.php結尾

返回信息有: 進程池名字, 進程開始日期, 運行了多少秒, 處理了多少請求, 隊列裏邊有多少待處理的請求, 迄今爲止隊列裏最大的請求數, 活躍進程數, 空閒進程數, 總進程數....

json, 表示能夠指定放回txt/json/xml格式

full, 表示更詳細的信息, 執行腳本信息, cpu信息, 內存信息, 請求數據的長度.....

 

ping.path = /ping

查看進程是否還有響應, 能夠用來製做圖表, 進行負載均衡(踢掉某個不響應的進程), 給團隊觸發提醒

以"/"開頭, 最好不要以.php結尾

 

ping.response 自定義返回信息, 以文本格式返回(text/plan), 同時返回 200 響應碼

 

access.log: 訪問日誌地址

access.format: 日誌格式

slowlog: 慢響應日誌地址

request_slowlog_timeout: 評定爲慢響應的時間長度

request_terminate_timeout: 請求最長處理時間, 若是php.ini裏的max_execution_time沒有起做用, 這裏應該會起做用

 

rlimit_files: 本pool裏打開的最大文件資源數

rlimit_core: 本pool裏使用的最大(core)內核數

 

chroot: 進程啓動時, 將根目錄轉向到這個制定設定的路徑, 絕對路徑

chdir: 進程啓動時, 將當前目錄設定爲這個指令制定的目錄, 相對目錄

 

catch_workers_output: 將標準輸出/錯誤輸出寫入到main日誌文件中,對響應有幾個毫秒的延誤, 不設置, 則輸出到標準輸出設備中(/dev/null, 應該是顯示器吧)

security.limit_extensions: .php .html 限制解析文件的後綴, 設爲空, 則解析任何後綴的文件

 

php_* 重寫或者合併php.ini相關指令的值

相關文章
相關標籤/搜索