## PHP-FPM
FPM(FastCGI 進程管理器)用于替換 PHP FastCGI 的大部分附加功能,對于高負載網站是非常有用的。
它的功能包括:
- 支持平滑停止/啟動的高級進程管理功能;
- 可以工作于不同的 uid/gid/chroot 環境下,并監聽不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的設置);
- stdout 和 stderr 日志記錄;
- 在發生意外情況的時候能夠重新啟動并緩存被破壞的 opcode;
- 文件上傳優化支持;
- "慢日志" - 記錄腳本(不僅記錄文件名,還記錄 PHP backtrace 信息,可以使用 ptrace或者類似工具讀取和分析遠程進程的運行數據)運行所導致的異常緩慢;
- [fastcgi_finish_request()](http://php.net/manual/zh/function.fastcgi-finish-request.php) - 特殊功能:用于在請求完成和刷新數據后,繼續在后臺執行耗時的工作(錄入視頻轉換、統計處理等);
- 動態/靜態子進程產生;
- 基本 SAPI 運行狀態信息(類似Apache的 mod_status);
- 基于 php.ini 的配置文件。
### 全局配置選項
- pid
pid文件的位置
- error_log
錯誤日志的位置
- log_level
錯誤的級別 alert 、error、warning、notice、debug、默認是notice
- syslog.facility
設置何種程序記錄消息 默認daemon
- syslog.ident
為每條消息 添加前綴
- emergency_restart_interval
如果子進程在?*emergency_restart_interval*?設定的時間內收到該參數設定次數的 SIGSEGV 或者 SIGBUS退出信息號,則FPM會重新啟動。0 表示“關閉該功能”。默認值:0(關閉)
- process_control_timeout
設置子進程接受主進程復用信號的超時時間 可用單位:s(秒),m(分),h(小時)或者 d(天)。默認單位:s(秒)。默認值:0(關閉)。
- process_max
fork的最大的fpm的進程數
- process.priority
設置master進程的nice(2) 優先級
- daemonize
設置php-fpm后臺運行。默認是yes
- rlimit_core
設置master 進程打開的core最大的尺寸
- events.mechaism
設置fpm的使用的事件機制 select、pool、epoll、kqueue (*BSD)、port (Solaris )
- systemd_interval
使用systemd集成的fpm時,設置間歇秒數
### 運行時配置
- listen
設置接受的fastcgi請求的地址可用格式為:'ip:port','port','/path/to/unix/socket'。每個進程池都需要設置
- listen.backlog
設置backlog的最大值
- listen.allowed_clients
設置允許鏈接到fastcgi的ip地址
- listen.owner listen.group listen.mode
設置權限
- user group
fpm運行的Unix用戶 必須設置的
- pm
設置進程管理器如何管理子進程
- static 子進程是固定的 = *pm.max_children*
- *ondemand* 進程在有需求時才產生
- *dynamic* ?子進程的數量在下面配置的基礎上動態設置 *pm.max_children*,*pm.start_servers*,*pm.min_spare_servers*,*pm.max_spare_servers*。
- pm.max_children
pm設置為staic時。表示創建的子進程的數量。
pm為dynamic時,表示最大可創建的進程數
- pm.start_servers
設置啟動時創建的子進程的數目。僅在?*pm*?設置為?*dynamic*?時使用 。就是初始化創建的進程數
- pm.min_spare_servers
設置空閑進程的最大數目
- pm.process_idle_timeout
秒。多久之后結束空閑進程
- pm.max_requests
設置每個子進程重生之前的服務的請求數。
- pm.status_path
fpm狀態的頁面的地址
- ping.path
fpm監控頁面的ping的地址
- ping.resource
用于定于ping請求的返回響應 默認是pong
- request_terminate_timeout
設置單個請求的超時中止時間。
- request_slowlog_timeout
當一個請求該設置的超時時間后,就會將對應的 PHP 調用堆棧信息完整寫入到慢日志中
- slowlog
慢請求的記錄日志
- rlimit_files
設置打開文件描述符的限制
- access.log
訪問日志
- access.format
acces log的格式
### 優化
#### 內核調優
- 調整linux內核打開文件的數量。
```shell
echo `ulimit -HSn 65536` >> /etc/profile
echo `ulimit -HSn 65536` >> /etc/rc.local
source /etc/profile
```
#### PHP-FPM配置調優
- 進程數調整
>pm.max_children = 300;?**靜態方式**下開啟的php-fpm進程數量
>
>pm.start_servers = 20;?**動態方式**下的起始php-fpm進程數量
>
>pm.min_spare_servers = 5;?**動態方式**下的最小php-fpm進程數量
>
>pm.max_spare_servers = 35;?**動態方式**下的最大php-fpm進程數量
>
>request_slowlog_timeout = 2; 開啟慢日志
>slowlog = log/$pool.log.slow; 慢日志路徑
>
>rlimit_files = 1024; 增加php-fpm打開文件描述符的限制
**一般來說一臺服務器正常情況下每一個php-cgi所耗費的內存在20M左右 。**
用內存/20 就大概算出最大的進程數。
一般初始化的進程有一個類似的公式
```
start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2;
```
如果長時間沒有得到處理的請求就會出現504 Gateway Time-out這個錯誤,而正在處理的很累的那幾個php-cgi如果遇到了問題就會出現502 Bad gateway這個錯誤
- **最大請求數**
最大處理請求數是指一個php-fpm的worker進程在處理多少個請求后就終止掉,master進程會重新respawn一個新的。
這個配置的主要目的是避免php解釋器或程序引用的第三方庫造成的內存泄露。
? pm.max_requests = 10240
- 最長執行時間
最大執行時間在php.ini和php-fpm.conf里都可以配置,配置項分別為max_execution_time和request_terminate_timeout。
- PC
- IO模型
- Inode介紹
- Linux
- Linux基本操作命令
- Linux網絡相關命令
- Crontab計劃任務
- Shell
- Sed命令
- Awk命令
- LAMP/LNMP
- PHP
- 基本語法
- 面向對象
- 錯誤和異常處理
- 命名空間
- PHP7
- 正則表達式
- Hashtable
- 變量的內部實現
- PHP-FPM
- PHP運行原理
- swoole
- mysql
- SQL標準
- mysql三范式
- 存儲引擎
- Mysql事務
- Mysql索引
- Mysql優化
- Explain
- MySQL索引原理及慢查詢優化
- MongoDb
- 計算機網絡
- IP協議
- TCP(傳輸控制協議)
- UDP(用戶數據報協議)
- HTTP 協議
- HTTPS
- HTTP的基本優化
- Websocket協議
- 版本控制器
- Git
- Svn
- 數據結構
- 數組
- 鏈表
- 算法