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
配置文件翻譯: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相關指令的值