精华内容
参与话题
问答
  • PHP FPM php-fpm.conf设置详解

    千次阅读 2017-11-13 21:01:54
    php-fpm.conf重要参数max_children和request_terminate_timeout 在/etc/php5/fpm/pool.d/www.conf 有两个重要的参数: 1. ”max_children”, 2. ”request_terminate_timeout” 但是这个值不是通用...

    php-fpm.conf重要参数max_children和request_terminate_timeout

    在/etc/php5/fpm/pool.d/www.conf 有两个重要的参数:
    1.  ”max_children”,
    2. ”request_terminate_timeout”
    但是这个值不是通用的,而是需要自己计算的。
    如果你的服务器性能足够好,且宽带资源足够充足,php脚本没有系循环或BUG的话你可以直接将”request_terminate_timeout”设置成0s。0s的含义是让PHP-CGI一直执行下去而没有时间限制。而如果你做不到这一点,也就是说你的PHP-CGI可能出现某个BUG,或者你的宽带不够充足或者其他的原因导致你的PHP-CGI能够假死那么就建议你给”request_terminate_timeout”赋一个值,这个值可以根据你服务器的性能进行设定。一般来说性能越好你可以设置越高,20分钟-30分钟都可以。由于我的服务器PHP脚本需要长时间运行,有的可能会超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。
    而”max_children”这个值又是怎么计算出来的呢?这个值原则上是越大越好,php-cgi的进程多了就会处理的很快,排队的请求就会很少。设置”max_children”也需要根据服务器的性能进行设定,一般来说一台服务器正常情况下每一个php-cgi所耗费的内存在20M左右,因此我的”max_children”我设置成40个,20M*40=800M也就是说在峰值的时候所有PHP-CGI所耗内存在800M以内,低于我的有效内存1Gb。而如果我的”max_children”设置的较小,比如5-10个,那么php-cgi就会“很累”,处理速度也很慢,等待的时间也较长。如果长时间没有得到处理的请求就会出现504 Gateway Time-out这个错误,而正在处理的很累的那几个php-cgi如果遇到了问题就会出现502 Bad gateway这个错误。
    展开全文
  • php-fpm ---error

    2014-02-25 17:10:40
    [root@bogon ~]# /usr/local/php5/sbin/php-fpm [31-Jul-2013 05:22:24] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) [31-Jul-2013 05:22:24] ERROR:

    [root@bogon ~]# /usr/local/php5/sbin/php-fpm

    [31-Jul-2013 05:22:24] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)

    [31-Jul-2013 05:22:24] ERROR: FPM initialization failed


    解决办法:

    netstat -ntlp | grep 9000
    killall php-pfm
    启动php-pfm

    展开全文
  • 刚才看了一下/app/gm/data/mysql/3306/的下面的mysql 这个脚本的源码。看完后我联想到了 php-fpm  我主要说说 fastcgi 和 php-fpm 我理解的关系,如果有错误的话,希望给我补充一下。(^-^) 11

    CGI

    CGI全称是“公共网关接口”(Common Gateway Interface),HTTP服务器与你的或其它机器上的程序进行“交谈”的一种工具,其程序须运行在网络服务器上。

    CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。

    FastCGI

    FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式)。它还支持分布式的运算,即 FastCGI 程序可以在网站服务器以外的主机上执行并且接受来自其它网站服务器来的请求。

    FastCGI是语言无关的、可伸缩架构的CGI开放扩展,其主要行为是将CGI解释器进程保持在内存中并因此获得较高的性能。众所周知,CGI解释器的反复加载是CGI性能低下的主要原因,如果CGI解释器保持在内存中并接受FastCGI进程管理器调度,则可以提供良好的性能、伸缩性、Fail- Over特性等等。

    FastCGI特点

    1. FastCGI具有语言无关性.
    2. FastCGI在进程中的应用程序,独立于核心web服务器运行,提供了一个比API更安全的环境。APIs把应用程序的代码与核心的web服务器链接在一起,这意味着在一个错误的API的应用程序可能会损坏其他应用程序或核心服务器。 恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥。
    3. FastCGI技术目前支持语言有:C/C++、Java、Perl、Tcl、Python、SmallTalk、Ruby等。相关模块在Apache, ISS, Lighttpd等流行的服务器上也是可用的。
    4. FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变。

    FastCGI的工作原理

    1. Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
    2. FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
    3. 当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
    4. FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。

    在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

    FastCGI的不足

    因为是多进程,所以比CGI多线程消耗更多的服务器内存,PHP-CGI解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。

    Nginx 0.8.46+PHP 5.2.14(FastCGI)服务器在3万并发连接下,开启的10个Nginx进程消耗150M内存(15M*10=150M),开启的64个php-cgi进程消耗1280M内存(20M*64=1280M),加上系统自身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,完全可以只开启25个php-cgi进程,这样php-cgi消耗的总内存数才500M。
    上面的数据摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)

    PHP-CGI

    PHP-CGI是PHP自带的FastCGI管理器。

    PHP-CGI的不足:

    1. php-cgi变更php.ini配置后需重启php-cgi才能让新的php-ini生效,不可以平滑重启。
    2. 直接杀死php-cgi进程,php就不能运行了。(PHP-FPM和Spawn-FCGI就没有这个问题,守护进程会平滑从新生成新的子进程。)

    PHP-FPM

    PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的,可以在 http://php-fpm.org/download下载得到。

    PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。

    现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。

    PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多有点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。

    Spawn-FCGI

    Spawn-FCGI是一个通用的FastCGI管理服务器,它是lighttpd中的一部份,很多人都用Lighttpd的Spawn-FCGI进行FastCGI模式下的管理工作,不过有不少缺点。而PHP-FPM的出现多少缓解了一些问题,但PHP-FPM有个缺点就是要重新编译,这对于一些已经运行的环境可能有不小的风险(refer),在php 5.3.3中可以直接使用PHP-FPM了。

    Spawn-FCGI目前已经独成为一个项目,更加稳定一些,也给很多Web 站点的配置带来便利。已经有不少站点将它与nginx搭配来解决动态网页。

    最新的lighttpd也没有包含这一块了(http://www.lighttpd.net/search?q=Spawn-FCGI),但可以在以前版本中找到它。在lighttpd-1.4.15版本中就包含了(http://www.lighttpd.net/download/lighttpd-1.4.15.tar.gz),目前Spawn-FCGI的下载地址是http://redmine.lighttpd.net/projects/spawn-fcgi,最新版本是http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz。

    注:最新的Spawn-FCGI可以到lighttpd.net网站搜索“Spawn-FCGI”找到它的最新版本发布地址。

    PHP-FPM与spawn-CGI对比

    PHP-FPM的使用非常方便,配置都是在PHP-FPM.ini的文件内,而启动、重启都可以从php/sbin/PHP-FPM中进行。更方便的是修改php.ini后可以直接使用PHP-FPM reload进行加载,无需杀掉进程就可以完成php.ini的修改加载
    结果显示使用PHP-FPM可以使php有不小的性能提升。PHP-FPM控制的进程cpu回收的速度比较慢,内存分配的很均匀。
    Spawn-FCGI控制的进程CPU下降的很快,而内存分配的比较不均匀。有很多进程似乎未分配到,而另外一些却占用很高。可能是由于进程任务分配的不均匀导致的。而这也导致了总体响应速度的下降。而PHP-FPM合理的分配,导致总体响应的提到以及任务的平均。

    然后针对下面的问题讨论:

    fastcgi是一个协议,php-fpm实现了这个协议;有的说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的;有的说,php-fpm是php内核的一个补丁;有的说,修改了php.ini配置文件后,没办法平滑重启,所以就诞生了php-fpm;还有的说PHP-CGI是PHP自带的FastCGI管理器,那这样的话干吗又弄个php-fpm出来?

    答:

    1.首先CGI是外部应用程序与Web服务器之间的接口标准,不同类型语言写的程序只要符合cgi标准,就能作为一个cgi程序与web服务器交互,早期的cgi大多都是c或c++。php可以作为一个cgi使用,作为cgi时,它将作为独立的进程运行,有请求过来就创建一个进程进行响应。当php作为apache的一个模块时,php将作为apache的一个子进程存在,接受apache调用。现在也有了php-fpm+nginx的组合,php-fpm是一个fast-cgi管理器,负责将接收到的请求分配给预先生成的php子程序,管理着php进程。

    2.

    首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者。

    web server(比如说nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态数据。好了,如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。Nginx会传哪些数据给PHP解析器呢?url要有吧,查询字符串也得有吧,POST数据也要有,HTTP header不能少吧,好的,CGI就是规定要传哪些数据、以什么样的格式传递给后方处理这个请求的协议。仔细想想,你在PHP代码中使用的用户从哪里来的。

    当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

    好了,CGI是个协议,跟进程什么的没关系。那fastcgi又是什么呢?Fastcgi是用来提高CGI程序性能的。

    提高性能,那么CGI程序的性能问题在哪呢?"PHP解析器会解析php.ini文件,初始化执行环境",就是这里了。标准的CGI对每个请求都会执行这些步骤(不闲累啊!启动进程很累的说!),所以处理每个时间的时间会比较长。这明显不合理嘛!那么Fastcgi是怎么做的呢?首先,Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。

    那PHP-FPM又是什么呢?是一个实现了Fastcgi的程序,被PHP官方收了。

    大家都知道,PHP的解释器是php-cgi。php-cgi只是个CGI程序,他自己本身只能解析请求,返回结果,不会进程管理(皇上,臣妾真的做不到啊!)所以就出现了一些能够调度php-cgi进程的程序,比如说由lighthttpd分离出来的spawn-fcgi。好了PHP-FPM也是这么个东东,在长时间的发展后,逐渐得到了大家的认可(要知道,前几年大家可是抱怨PHP-FPM稳定性太差的),也越来越流行。

    好了,最后来回来你的问题。
    网上有的说,fastcgi是一个协议,php-fpm实现了这个协议

    对。

    有的说,php-fpm是fastcgi进程的管理器,用来管理fastcgi进程的

    对。php-fpm的管理对象是php-cgi。但不能说php-fpm是fastcgi进程的管理器,因为前面说了fastcgi是个协议,似乎没有这么个进程存在,就算存在php-fpm也管理不了他(至少目前是)。 有的说,php-fpm是php内核的一个补丁

    以前是对的。因为最开始的时候php-fpm没有包含在PHP内核里面,要使用这个功能,需要找到与源码版本相同的php-fpm对内核打补丁,然后再编译。后来PHP内核集成了PHP-FPM之后就方便多了,使用--enalbe-fpm这个编译参数即可。

    有的说,修改了php.ini配置文件后,没办法平滑重启,所以就诞生了php-fpm

    是的,修改php.ini之后,php-cgi进程的确是没办法平滑重启的。php-fpm对此的处理机制是新的worker用新的配置,已经存在的worker处理完手上的活就可以歇着了,通过这种机制来平滑过度。

    还有的说PHP-CGI是PHP自带的FastCGI管理器,那这样的话干吗又弄个php-fpm。

    Fastcgi是CGI的升级版,一种语言无关的协议,用来沟通程序(如PHP, Python, Java)和Web服务器(Apache2, Nginx), 理论上任何语言编写的程序都可以通过Fastcgi来提供Web服务。
    Fastcgi的特点是会在一个进程中依次完成多个请求,以达到提高效率的目的,大多数Fastcgi实现都会维护一个进程池。

    而PHP-fpm就是针对于PHP的,Fastcgi的一种实现,他负责管理一个进程池,来处理来自Web服务器的请求。目前,PHP-fpm是内置于PHP的。

    但是PHP-fpm仅仅是个“PHP Fastcgi 进程管理器”, 它仍会调用PHP解释器本身来处理请求,PHP解释器(在Windows下)就是php-cgi.exe.









    展开全文
  • php php-fpm - php-fpm status

    2014-11-18 15:50:15
    这里介绍php-fpm的status.可以查看php-fpm的进程相关的信息。 【基本配置】 php-fpm的配置文件,使用pm.status_pat= [code="linux"] ; The URI to view the FPM status page. If this value is not ...
    【基本介绍】
    这里介绍php-fpm的status.可以查看php-fpm的进程相关的信息。

    【基本配置】
    php-fpm的配置文件,使用pm.status_pat=

    ; The URI to view the FPM status page. If this value is not set, no URI will be
    ; recognized as a status page. By default, the status page shows the following
    ; information:
    ; accepted conn - the number of request accepted by the pool;
    ; pool - the name of the pool;
    ; process manager - static or dynamic;
    ; idle processes - the number of idle processes;
    ; active processes - the number of active processes;
    ; total processes - the number of idle + active processes.
    ; The values of 'idle processes', 'active processes' and 'total processes' are
    ; updated each second. The value of 'accepted conn' is updated in real time.
    ; Example output:
    ; accepted conn: 12073
    ; pool: www
    ; process manager: static
    ; idle processes: 35
    ; active processes: 65
    ; total processes: 100
    ; By default the status page output is formatted as text/plain. Passing either
    ; 'html' or 'json' as a query string will return the corresponding output
    ; syntax. Example:
    ; http://www.foo.bar/status
    ; http://www.foo.bar/status?json
    ; http://www.foo.bar/status?html
    ; Note: The value must start with a leading slash (/). The value can be
    ; anything, but it may not be a good idea to use the .php extension or it
    ; may conflict with a real PHP file.
    ; Default Value: not set
    pm.status_path = /fpm-status


    在web服务中添加配置,
    例如:nginx中添加location

    location ~ ^/(status|ping)$ {
    access_log off;
    allow 127.0.0.1;
    allow 1.2.3.4#your-ip;
    deny all;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;


    【结果分析】
    http://domain/fpm-status

    pool: www #fpm池子名称,大多数为www
    process manager: dynamic #进程管理方式,值:static, dynamic or ondemand. dynamic
    start time: 17/Nov/2014:22:59:48 +0800 #启动日期,如果reload了php-fpm,时间会更新
    start since: 59509 # 运行时长
    accepted conn: 115850 #当前池子接受的请求数
    listen queue: 0 #请求等待队列,如果这个值不为0,那么要增加FPM的进程数量
    max listen queue: 1 #请求等待队列最高的数量
    listen queue len: 0 #socket等待队列长度
    idle processes: 14 #空闲进程数量
    active processes: 2 #活跃进程数量
    total processes: 16 #总进程数量
    max active processes: 9 #最大的活跃进程数量(FPM启动开始算)
    max children reached: 0 #大道进程最大数量限制的次数,如果这个数量不为0,
    #那说明你的最大进程数量太小了,请改大一点。
    slow requests: 3 #启用了php-fpm slow-log,缓慢请求的数量


    【其他参数】
    php-fpm状态页比较个性化的一个地方是它可以带参数,可以带参数json、xml、html并且前面三个参数可以分别和full做一个组合。(见参考引用链接)

    full详解
    pid – 进程PID,可以单独kill这个进程. You can use this PID to kill a long running process.
    state – 当前进程的状态 (Idle, Running, …)
    start time – 进程启动的日期
    start since – 当前进程运行时长
    requests – 当前进程处理了多少个请求
    request duration – 请求时长(微妙)
    request method – 请求方法 (GET, POST, …)
    request URI – 请求URI
    content length – 请求内容长度 (仅用于 POST)
    user – 用户 (PHP_AUTH_USER) (or ‘-’ 如果没设置)
    script – PHP脚本 (or ‘-’ if not set)
    last request cpu – 最后一个请求CPU使用率。
    last request memorythe – 上一个请求使用的内存


    【参考引用】
    [url]http://www.ttlsa.com/php/use-php-fpm-status-page-detail/[/url]
    [url]https://rtcamp.com/tutorials/php/fpm-status-page/[/url]
    展开全文
  • nginx php-fpm spawn-fastcgi 两种通信方式

    千次阅读 2014-03-14 01:34:59
    nginx php-fpm 使用socket通信 建立 PHP-FPM 使用一个 Unix Socket vi /etc/php-fpm.d/www.conf [...] ;listen = 127.0.0.1:9000 listen = /tmp/php5-fpm.sock [...] 重启PHP-FPM systemctl restart php-fpm
  • php-fpm 进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1。php-fpm的工作模式和nginx类似,都是一个master,多个worker模型。每个worker都在accept本pool内的...
  • <p>I have googled the problem and it seems that it's normally a problem with nginx passing a request to php-fpm, I have checked the user that is running each service to make sure they match, I have ...
  • 1.将fpm打包放到php源代码中 gzip -cd php-5.2.8-fpm-0.5.10.diff.gz | patch -d php-5.2.8 -p1 2.编译安装php 记得带上 –enable-cgi –enable-fpm 两个参数哦。 遇
  • 今日搭建lnmp的时候装php-fpm出现一个问题搞了一个多小时终于把问题解决了,做下记录方便各位网友查阅虽然很小儿科。。 环境:redhat 7.2版本 yum源也是7.2的iso[root@proxy lnmp_soft]# yum -y install ...
  • 解决方法 遇到此问题时可以在安装rpm包命令的后面加两个参数,如: rpm -ivh libstdc++5.0-3.3.3-62745cl.i386.rpm 改成: rpm -ivh libstdc++5.0-3.3.3-62745cl.i386.rpm --nodeps --force ...
  • php-fpm和nginx一样内建了一个状态页,对于想了解php-fpm的状态以及监控php-fpm非常有帮助。为了后续的Prometheus监控,我们需要先了解php-fpm状态页是怎么回事。 [global] pid = /usr/local/...
  • 错误:软件包:php-fpm-5.4.16-42.el7.x86_64 (/php-fpm-5.4.16-42.el7.x86_64) 需要:php-common-(x86-64) = 5.4.16-42.el7 已安装:php-common-5.4.16-45.el7 您可以尝试添加 --skip-broken选项来解决该问题 您...
  • 一、使用背景 &...我这边是想获取到php-fpm程序的进程数。 二、获取php-fpm的进程数 ps aux | grep -c php-fpm PS: 显示其他用户启动的进程(a) 查看系统中属于自己的进程(x) 启动这...
  • 最近发现博客的内存老是隔三差五...很显然是PHP某些服务一直在占用着VPS的内存没有释放,导致物理内存耗尽后调用了Swap,显然Swap没有物理内存运行的效率高,于是就出现了进程卡死的情况了。考虑到挖站否现在用的Wor...
  • 错误:软件包:php-fpm-5.4.16-42.el7.x86_64 (/php-fpm-5.4.16-42.el7.x86_64) 需要:php-common(x86-64) = 5.4.16-42.el7 已安装: php-common-5.4.16-46.1.el7_7.x86_64 (@updates) php-common(x86-64) = 5.4.16-...
  • yum install php-mysqli centos操作系统下
  • php-fpm-slow.log的过滤配置如下: filter {  if [type] == "php-fpm-slow" {  multiline {  pattern => '^(\[0x0|script_filename|$)'  what => 'previous'  negate => false  }
  • pid = run/php-fpm.pid #pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启 error_log = log/php-fpm.log #错误日志,默认在安装目录中的var/log/php-fpm.log error_log = log/php-fpm.log #错误日志,...

空空如也

1 2 3 4 5 ... 20
收藏数 15,602
精华内容 6,240
关键字:

fpm