基于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 相关文章推荐
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
PHP中json_encode、json_decode与serialize、unserialize的性能测试分析
Jun 09 PHP
PHP中static关键字原理的学习研究分析
Jul 18 PHP
PHP输入流php://input介绍
Sep 18 PHP
php cURL和Rolling cURL并发方式比较
Oct 30 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
Apr 27 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
php中错误处理操作实例分析
Aug 23 PHP
Laravel 之url参数,获取路由参数的例子
Oct 21 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
Feb 07 PHP
PHP日期和时间函数的使用示例详解
Aug 06 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
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
WordPress开发中短代码的实现及相关函数使用技巧
2016/01/05 PHP
利用google提供的API(JavaScript接口)获取网站访问者IP地理位置的代码详解
2010/07/24 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
理解Javascript_14_函数形式参数与arguments
2010/10/20 Javascript
js切换div css注意的细节
2012/12/10 Javascript
nodejs教程之环境安装及运行
2014/11/21 NodeJs
javascript实现避免页面按钮重复提交
2015/01/08 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
js图片轮播手动切换效果
2015/11/10 Javascript
jQuery实现可以控制图片旋转角度效果(附demo源码下载)
2016/01/27 Javascript
Bootstrap表单组件教程详解
2016/04/26 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
2016/08/18 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
详解Javascript中DOM的范围
2017/02/13 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
JS对象与json字符串相互转换实现方法示例
2018/06/14 Javascript
vue.js图片转Base64上传图片并预览的实现方法
2018/08/02 Javascript
layDate日期控件使用方法详解
2018/11/15 Javascript
video.js 一个页面同时播放多个视频的实例代码
2018/11/27 Javascript
python错误处理详解
2014/09/28 Python
使用Python编写简单网络爬虫抓取视频下载资源
2014/11/04 Python
kNN算法python实现和简单数字识别的方法
2014/11/18 Python
python Django批量导入不重复数据
2016/03/25 Python
详解Python中的文件操作
2016/08/28 Python
Python使用pymysql小技巧
2017/06/04 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
2020/01/06 Python
Python中Selenium模块的使用详解
2020/10/09 Python
荷兰皇家航空公司中国官网:KLM中国
2017/12/13 全球购物
学校招生宣传广告词
2014/03/19 职场文书
授权委托书(公民个人适用)
2014/09/19 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
解析Java中的static关键字
2021/06/14 Java/Android
Go语言怎么使用变长参数函数
2022/07/15 Golang