|
| 1 | +## PHP-FPM |
| 2 | + |
| 3 | +FPM(FastCGI 进程管理器)用于替换 PHP FastCGI 的大部分附加功能,对于高负载网站是非常有用的。 |
| 4 | + |
| 5 | +它的功能包括: |
| 6 | + |
| 7 | +- 支持平滑停止/启动的高级进程管理功能; |
| 8 | +- 可以工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和使用不同的 php.ini 配置文件(可取代 safe_mode 的设置); |
| 9 | +- stdout 和 stderr 日志记录; |
| 10 | +- 在发生意外情况的时候能够重新启动并缓存被破坏的 opcode; |
| 11 | +- 文件上传优化支持; |
| 12 | +- "慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,可以使用 ptrace或者类似工具读取和分析远程进程的运行数据)运行所导致的异常缓慢; |
| 13 | +- [fastcgi_finish_request()](http://php.net/manual/zh/function.fastcgi-finish-request.php) - 特殊功能:用于在请求完成和刷新数据后,继续在后台执行耗时的工作(录入视频转换、统计处理等); |
| 14 | +- 动态/静态子进程产生; |
| 15 | +- 基本 SAPI 运行状态信息(类似Apache的 mod_status); |
| 16 | +- 基于 php.ini 的配置文件。 |
| 17 | + |
| 18 | +### 全局配置选项 |
| 19 | + |
| 20 | +- pid |
| 21 | + |
| 22 | + pid文件的位置 |
| 23 | + |
| 24 | +- error_log |
| 25 | + |
| 26 | + 错误日志的位置 |
| 27 | + |
| 28 | +- log_level |
| 29 | + |
| 30 | + 错误的级别 alert 、error、warning、notice、debug、默认是notice |
| 31 | + |
| 32 | +- syslog.facility |
| 33 | + |
| 34 | + 设置何种程序记录消息 默认daemon |
| 35 | + |
| 36 | +- syslog.ident |
| 37 | + |
| 38 | + 为每条消息 添加前缀 |
| 39 | + |
| 40 | +- emergency_restart_interval |
| 41 | + |
| 42 | + 如果子进程在 *emergency_restart_interval* 设定的时间内收到该参数设定次数的 SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动。0 表示“关闭该功能”。默认值:0(关闭) |
| 43 | + |
| 44 | +- process_control_timeout |
| 45 | + |
| 46 | + 设置子进程接受主进程复用信号的超时时间 可用单位:s(秒),m(分),h(小时)或者 d(天)。默认单位:s(秒)。默认值:0(关闭)。 |
| 47 | + |
| 48 | +- process_max |
| 49 | + |
| 50 | + fork的最大的fpm的进程数 |
| 51 | + |
| 52 | +- process.priority |
| 53 | + |
| 54 | + 设置master进程的nice(2) 优先级 |
| 55 | + |
| 56 | +- daemonize |
| 57 | + |
| 58 | + 设置php-fpm后台运行。默认是yes |
| 59 | + |
| 60 | +- rlimit_core |
| 61 | + |
| 62 | + 设置master 进程打开的core最大的尺寸 |
| 63 | + |
| 64 | +- events.mechaism |
| 65 | + |
| 66 | + 设置fpm的使用的事件机制 select、pool、epoll、kqueue (*BSD)、port (Solaris ) |
| 67 | + |
| 68 | +- systemd_interval |
| 69 | + |
| 70 | + 使用systemd集成的fpm时,设置间歇秒数 |
| 71 | + |
| 72 | +### 运行时配置 |
| 73 | + |
| 74 | +- listen |
| 75 | + |
| 76 | + 设置接受的fastcgi请求的地址可用格式为:'ip:port','port','/path/to/unix/socket'。每个进程池都需要设置 |
| 77 | + |
| 78 | +- listen.backlog |
| 79 | + |
| 80 | + 设置backlog的最大值 |
| 81 | + |
| 82 | +- listen.allowed_clients |
| 83 | + |
| 84 | + 设置允许链接到fastcgi的ip地址 |
| 85 | + |
| 86 | +- listen.owner listen.group listen.mode |
| 87 | + |
| 88 | + 设置权限 |
| 89 | + |
| 90 | +- user group |
| 91 | + |
| 92 | + fpm运行的Unix用户 必须设置的 |
| 93 | + |
| 94 | +- pm |
| 95 | + |
| 96 | + 设置进程管理器如何管理子进程 |
| 97 | + |
| 98 | + - static 子进程是固定的 = *pm.max_children* |
| 99 | + - *ondemand* 进程在有需求时才产生 |
| 100 | + - *dynamic* 子进程的数量在下面配置的基础上动态设置 *pm.max_children*,*pm.start_servers*,*pm.min_spare_servers*,*pm.max_spare_servers*。 |
| 101 | + |
| 102 | +- pm.max_children |
| 103 | + |
| 104 | + pm设置为staic时。表示创建的子进程的数量。 |
| 105 | + |
| 106 | + pm为dynamic时,表示最大可创建的进程数 |
| 107 | + |
| 108 | +- pm.start_servers |
| 109 | + |
| 110 | + 设置启动时创建的子进程的数目。仅在 *pm* 设置为 *dynamic* 时使用 。就是初始化创建的进程数 |
| 111 | + |
| 112 | +- pm.min_spare_servers |
| 113 | + |
| 114 | + 设置空闲进程的最大数目 |
| 115 | + |
| 116 | +- pm.process_idle_timeout |
| 117 | + |
| 118 | + 秒。多久之后结束空闲进程 |
| 119 | + |
| 120 | +- pm.max_requests |
| 121 | + |
| 122 | + 设置每个子进程重生之前的服务的请求数。 |
| 123 | + |
| 124 | +- pm.status_path |
| 125 | + |
| 126 | + fpm状态的页面的地址 |
| 127 | + |
| 128 | +- ping.path |
| 129 | + |
| 130 | + fpm监控页面的ping的地址 |
| 131 | + |
| 132 | +- ping.resource |
| 133 | + |
| 134 | + 用于定于ping请求的返回响应 默认是pong |
| 135 | + |
| 136 | +- request_terminate_timeout |
| 137 | + |
| 138 | + 设置单个请求的超时中止时间。 |
| 139 | + |
| 140 | +- request_slowlog_timeout |
| 141 | + |
| 142 | + 当一个请求该设置的超时时间后,就会将对应的 PHP 调用堆栈信息完整写入到慢日志中 |
| 143 | + |
| 144 | +- slowlog |
| 145 | + |
| 146 | + 慢请求的记录日志 |
| 147 | + |
| 148 | +- rlimit_files |
| 149 | + |
| 150 | + 设置打开文件描述符的限制 |
| 151 | + |
| 152 | +- access.log |
| 153 | + |
| 154 | + 访问日志 |
| 155 | + |
| 156 | +- access.format |
| 157 | + |
| 158 | + acces log的格式 |
| 159 | + |
| 160 | +### 优化 |
| 161 | + |
| 162 | +#### 内核调优 |
| 163 | + |
| 164 | +- 调整linux内核打开文件的数量。 |
| 165 | + |
| 166 | +```shell |
| 167 | +echo `ulimit -HSn 65536` >> /etc/profile |
| 168 | +echo `ulimit -HSn 65536` >> /etc/rc.local |
| 169 | +source /etc/profile |
| 170 | +``` |
| 171 | + |
| 172 | +#### PHP-FPM配置调优 |
| 173 | + |
| 174 | +- 进程数调整 |
| 175 | + |
| 176 | +>pm.max_children = 300; **静态方式**下开启的php-fpm进程数量 |
| 177 | +> |
| 178 | +>pm.start_servers = 20; **动态方式**下的起始php-fpm进程数量 |
| 179 | +> |
| 180 | +>pm.min_spare_servers = 5; **动态方式**下的最小php-fpm进程数量 |
| 181 | +> |
| 182 | +>pm.max_spare_servers = 35; **动态方式**下的最大php-fpm进程数量 |
| 183 | +> |
| 184 | +>request_slowlog_timeout = 2; 开启慢日志 |
| 185 | +>slowlog = log/$pool.log.slow; 慢日志路径 |
| 186 | +> |
| 187 | +>rlimit_files = 1024; 增加php-fpm打开文件描述符的限制 |
| 188 | +
|
| 189 | +**一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右 。** |
| 190 | + |
| 191 | +用内存/20 就大概算出最大的进程数。 |
| 192 | + |
| 193 | +一般初始化的进程有一个类似的公式 |
| 194 | + |
| 195 | +``` |
| 196 | +start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2; |
| 197 | +``` |
| 198 | + |
| 199 | + |
| 200 | + |
| 201 | +如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误 |
| 202 | + |
| 203 | +- **最大请求数** |
| 204 | + |
| 205 | + 最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新respawn一个新的。 |
| 206 | + |
| 207 | + 这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。 |
| 208 | + |
| 209 | + pm.max_requests = 10240 |
| 210 | + |
| 211 | +- 最长执行时间 |
| 212 | + |
| 213 | + 最大执行时间在php.ini和php-fpm.conf里都可以配置,配置项分别为max_execution_time和request_terminate_timeout。 |
| 214 | + |
0 commit comments