基于php-fpm 参数的深入理解


Posted in PHP onJune 03, 2013

ps aux |grep php-fpm |more
查看php-fpm总数
php-fpm.conf 配置
pid string
PID文件的位置. 默认为空.
error_log string
错误日志的位置. 默认: 安装路径#INSTALL_PREFIX#/log/php-fpm.log.
log_level string
错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
emergency_restart_threshold int
如果子进程在emergency_restart_interval设定的时间内收到该参数设定次数的SIGSEGV 或者 SIGBUS退出信息号,则FPM会重新启动。 0 表示 ‘关闭该功能'. 默认值: 0 (关闭).
emergency_restart_interval mixed
emergency_restart_interval用于设定平滑重启的间隔时间. 这么做有助于解决加速器中共享内存的使用问题. 可用单位: s(秒), m(分), h(小时), 或者 d(天). 默认单位: s(秒). 默认值: 0 (关闭).
process_control_timeout mixed
设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
daemonize boolean
设置FPM在后台运行. 设置 ‘no' 将 FPM 保持在前台运行用于调试. 默认值: yes.
运行配置区段
在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
listen string
设置接受FastCGI请求的地址. 可用格式为: ‘ip:port', ‘port', ‘/path/to/unix/socket'. 每个进程池都需要设置.
listen.backlog int
设置 listen(2) 的半连接队列长度. ‘-1′ 表示无限制. 默认值: -1.
listen.allowed_clients string
设置允许连接到FastCGI的服务器IPV4地址. 等同于PHP FastCGI (5.2.2+)中的 FCGI_WEB_SERVER_ADDRS环境变量. 仅对TCP监听起作用. 每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接. 默认值: any.
listen.owner string
如果使用,表示设置Unix套接字的权限. 在Linux中,读写权限必须设置,以便用于WEB服务器连接. 在很多BSD派生的系统中可以忽略权限允许自由连接. 默认值: 运行所使用的用户合租, 权限为0666.
listen.group string
参见 listen.owner.
listen.mode string
参见 listen.owner.
user string
FPM 进程运行的Unix用户. 必须设置.
group string
FPM 进程运行的Unix用户组. 如果没有设置,则默认用户的组被使用.
pm string
设置进程管理器如何管理子进程. 可用值: static, dynamic. 必须设置.
static ? 子进程的数量是固定的 (pm.max_children).
dynamic ? 子进程的数量在下面配置的基础上动态设置: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm.max_children int
子进程的数量,pm 设置为 static 时表示创建的, pm 设置为 dynamic 时表示最大可创建的. 必须设置.
该选项设置可以同时提供服务的请求数限制. 类似 Apache 的 mpm_prefork 中 MaxClients 的设置和 普通PHP FastCGI中的 PHP_FCGI_CHILDREN 环境变量.
pm.start_servers in
设置启动时创建的子进程数目. 仅在 pm 设置为 dynamic 时使用. 默认值: min_spare_servers + (max_spare_servers ? min_spare_servers) / 2.
pm.min_spare_servers int
设置空闲服务进程的最低数目. 仅在 pm 设置为 dynamic 时使用. 必须设置.
pm.max_spare_servers int
设置空闲服务进程的最大数目. 仅在 pm 设置为 dynamic 时使用. 必须设置.
pm.max_requests int
设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 '0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
pm.status_path string
FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none.
ping.path string
FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/).
ping.response string
用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
request_terminate_timeout mixed
设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的'max_execution_time'因为某些特殊原因没有中止运行的脚本有用. 设置为 '0′ 表示 ‘Off'. Available units: s(econds)(default), m(inutes), h(ours), or d(ays). Default value: 0.
request_slowlog_timeout mixed
当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 '0′ 表示 ‘Off'. 可用单位: s(秒)(默认), m(分), h(小时), 或者 d(天). 默认值: 0.
slowlog string
慢请求的记录日志. 默认值: #INSTALL_PREFIX#/log/php-fpm.log.slow.
request_slowlog_timeout
范围: php-fpm.conf 选项
分类: 方便
这个选项能让你跟踪执行缓慢的脚本并把他们连同调用栈一起记录再日志文件中。例如如下设置:
<value name="request_slowlog_timeout">5s</value>
<value name="slowlog">logs/slow.log</value>
记录的 slow.log 可能是这个样子:

Sep 21 16:22:19.399162 pid 29715 (pool default)
script_filename =  /local/www/stable/www/catalogue.php
[0x00007fff23618120] mysql_query()  /srv/stable/common/Database/class.MySQLRequest.php:20
[0x00007fff23618560]  getResult() /srv/stable/common/Database/class.Facade.php:106
[0x00007fff23618aa0] query()  /srv/stable/common/mysite.com/ORM/class.UsersMapper.php:99
[0x00007fff23618d60] resolveByID()  /srv/stable/common/mysite.com/ORM/class.User.php:629
[0x00007fff236193b0]  getData() /srv/stable/common/class.DataEntity.php:90
[0x00007fff236195d0]  load() /srv/stable/common/mysite.com/ORM/class.User.php:587
[0x00007fff23619a00] getIsHidden()  /srv/stable/common/mysite.com/class.User.php:42
[0x00007fff2361a470]  getName() /local/www/stable/www/catalogue.php:41

同时,在 error.log 中保存了如下记录:
Sep 21 16:22:19.399031 [WARNING] fpm_request_check_timed_out(), line 135:  child 29715, script '/local/www/stable/www/catalogue.php' (pool default)  executing too slow (5.018002 sec), logging
正如你再例子中看到的,脚本运行了 5 秒以上,并很可能是由于 mysql 响应慢造成的(top backtrace)。
rlimit_files int
设置文件打开描述符的rlimit限制. 默认值: 系统定义值.
rlimit_core int
设置核心rlimit最大限制值. 可用值: ‘unlimited' 、0或者正整数. 默认值: 系统定义值.
chroot string
启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
chdir string
设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时).
catch_workers_output boolean
重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
你还可以在为一个运行池传递附加的环境变量,或者更新PHP的配置值. 你可以在 php-fpm.conf 中下如下面的配置参数来做到:
Example #1 给运行池传递环境变量和设置PHP的配置值
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp
php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f www@my.domain.com
php_flag[display_errors] = off
php_admin_value[error_log] = /var/log/fpm-php.www.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
PHP配置值通过 php_value 或者 php_flag 设置,并且会覆盖以前的值. 请注意 disable_functions 或者 disable_classes 在 php.ini 之中定义的值不会被覆盖掉, 但是会将新的设置附加在原有值的后面.
使用 php_admin_value 或者 php_admin_flag 定义的值,不能被PHP代码中的 ini_set() 覆盖.
FAQ
Q:php-fpm 可以和 ZendOptimize 一起用吗?
A:完全可以。

Q:php-fpm 可以和 ZendPlatform、xcache、eAccelerator、APC 等的优化器一起用吗?
A:是的。php-fpm 的架构和任何一种用于高速 opcode 缓存的共享内存都适用。唯一的限制是:所有的 worker 进程只能适用一个缓存,即使它们用不同的 uid/gid 运行

Q:为什么我要给 php 打补丁呢?spawn-fcgi 不需要这样!
A:php-fpm 的创建是为了增强方便管理。没有打过补丁的 php 不能做到:

平滑重启 php 而不丢失请求,包括升级 php 二进制文件 以及/或者 扩展。
用不同的 uid / gid / chroot 环境运行 worker 进程
所有的设置只有一个配置文件
根据负载动态请求 (TODO)
对 php 请求实时统计性能 (TODO)

Q:为什么要用 root 运行 php-fpm 呢?这安全吗?
A:用 root 启动 php-fpm 只有在你打算用不同 uid/gid 的 php 来处理请求时才有意义。比如,在共享主机上的不同站点。因为只有在 master 进程用 root 运行的时候,才可以建立不同 uid/gid 的子进程。这是相当安全的。master 进程自己从来不会去处理请求。
在任何情况下,php- fpm 都不会用 root 身份来处理请求。

Q:php-fpm 可以加速 php 脚本处理速度吗?
A:不,它不会影响处理速度。不过,如果你使用一些特殊特性,对于一些特定的请求还是可以有性能提升的。

Q:如果我把我的网站从 mod_php 迁移到 php-fpm ,我会得到性能提升吗?
A:通常,当有服务器上有大量空闲内存可用时,能从迁移到 php-fpm 中得到的性能提升可能不大。但是如果内存并不充裕,性能提升还是很可观的,在某些情况下可以达到 300-500%。这可能是由于 nginx + php-fpm 一般会比 Apache + mod_php 使用更少的内存。而且 VFS 缓存会由于更多的空余内存而更有效地工作。

Q:php- fpm 将来会被官方的 php 包含吗?
A:我希望如此。目前,php-fpm 代码的协议是 GPL 。所以现在 php-fpm 的代码与 php 协议(类似 bsd)并不匹配。这是临时性措施。这样的选择是为了简化开发过程。一旦代码的功能完备,比如自适应生成子进程和其他一些东西,协议会改为一个相匹配的。之后,php-fpm 会正式发布给 php 开发团队,并被建议包含。

PHP 相关文章推荐
PHP CURL模拟GET及POST函数代码
Apr 25 PHP
PHP数据流应用的一个简单实例
Sep 14 PHP
php unset全局变量运用问题的深入解析
Jun 17 PHP
解析PHP 5.5 新特性
Jul 02 PHP
10 个经典PHP函数
Oct 17 PHP
php面象对象数据库操作类实例
Dec 02 PHP
php简单smarty入门程序实例
Jun 11 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
php通过两层过滤获取留言内容的方法
Jul 11 PHP
php图片添加水印例子
Jul 20 PHP
PHP调用API接口实现天气查询功能的示例
Sep 21 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
php-cli简介(不会Shell语言一样用Shell)
Jun 03 #PHP
基于在生产环境中使用php性能测试工具xhprof的详解
Jun 03 #PHP
php cli模式学习(PHP命令行模式)
Jun 03 #PHP
获取PHP警告错误信息的解决方法
Jun 03 #PHP
php cli 小技巧
Jun 03 #PHP
php中用加号与用array_merge合并数组的区别深入分析
Jun 03 #PHP
PHP在线生成二维码代码(google api)
Jun 03 #PHP
You might like
用PHP实现登陆验证码(类似条行码状)
2006/10/09 PHP
谈PHP生成静态页面分析 模板+缓存+写文件
2009/08/17 PHP
php 读取shell管道传输过来的内容
2010/03/01 PHP
PHP中include()与require()的区别说明
2010/03/10 PHP
PHP运行SVN命令显示某用户的文件更新记录的代码
2014/01/03 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
PHP实现的MD5结合RSA签名算法实例
2017/10/07 PHP
js获取及修改网页背景色和字体色的方法
2015/12/29 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
总结AngularJS开发者最常犯的十个错误
2016/08/31 Javascript
Angular移动端页面input无法输入的解决方法
2017/11/14 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
10行原生JS实现文字无缝滚动(超简单)
2018/01/02 Javascript
基于jQuery实现Ajax验证用户名是否可用实例
2018/03/25 jQuery
详解基于Koa2开发微信二维码扫码支付相关流程
2018/05/16 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
JS原型prototype和__proto__用法实例分析
2020/03/14 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
解决python文件字符串转列表时遇到空行的问题
2017/07/09 Python
python3读取excel文件只提取某些行某些列的值方法
2018/07/10 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
python脚本第一行如何写
2020/08/30 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
抽象类和接口的区别
2012/09/19 面试题
2014超市双十一活动策划方案
2014/09/29 职场文书
通知函的格式
2015/04/27 职场文书
七年级思品教学反思
2016/02/20 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android
MySQL中int (10) 和 int (11) 的区别
2022/01/22 MySQL
Nebula Graph解决风控业务实践
2022/03/31 MySQL
Python使用pyecharts控件绘制图表
2022/06/05 Python
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python