php5 fpm子项和请求

php5 fpm子项和请求,php,Php,我有个问题。 我拥有一个128mb的vps,有一个简单的博客,每天只有100次点击。 我已经安装了nginx+php5 fpm。考虑到低访问量和ram,我决定在运行1台服务器的情况下将fpm设置为静态。当我在做随机测试时,比如通过http运行php脚本,持续30分钟以上,我试图在同一台机器上打开博客,发现该网站基本上无法访问。因此,我转到配置并阅读了以下内容: The number of child processes to be created when pm is set to '

我有个问题。 我拥有一个128mb的vps,有一个简单的博客,每天只有100次点击。 我已经安装了nginx+php5 fpm。考虑到低访问量和ram,我决定在运行1台服务器的情况下将fpm设置为静态。当我在做随机测试时,比如通过http运行php脚本,持续30分钟以上,我试图在同一台机器上打开博客,发现该网站基本上无法访问。因此,我转到配置并阅读了以下内容:

     The number of child processes to be created when pm is set to 'static' and the
; maximum number of child processes to be created when pm is set to 'dynamic'.
; **This value sets the limit on the number of simultaneous requests that will be
; served**
最让我震惊的是,我不知道,,因为我总是假设一个php孩子会像http服务器一样同时处理数百个请求! 它做对了吗? 例如,如果我同时启动2个php fpm子项和2个“长脚本”,那么使用相同php后端的所有站点都将无法访问??这是如何使用的? 你可能会想:-嗯!php脚本(网页)通常在100毫秒内处理。。。毫无疑问,但是如果你的页面可以运行大约10秒,而我有10个带有5台服务器的php fpm访问者,那么每次只接受5个请求,会发生什么呢?他们都会排队,还是会超时

老实说,我习惯于在Windows中使用Apache和mod_php运行站点,我从未遇到过这些问题,因为显然这些限制不适用于使用php的不同方式


这也提出了另一个问题。如果我有带sleep(20)的文件_1.php和带echo的文件_2.php,如果我用fastcgi机器运行文件_1,然后运行文件_2,第二个文件将请求创建另一个服务器,以使用4MB RAM处理php请求。如果我对apache/mod_php也这样做,那么第二个文件将只使用30KB的内存(在apache服务器中)。考虑到这一点,为什么mod_php认为如果使用的内存实际上更少,那么它就是“坏人”…我知道我忽略了这里的大局。

你基本上是对的。您配置了一个静态的工作者数量(这个数字是“一”)——所以这正是您得到的

但你不太明白事情通常是如何运作的,因为你说:

我一直认为一个php孩子可以处理数百个请求 同时就像http服务器一样

<>我不太熟悉NGIX,但是考虑Apache中典型的MODYPHP设置。如果您使用的是mod_php,那么您使用的是针对apache的prefork mpm。因此,每个并发http请求都由不同的httpd进程(无线程)处理。如果要调整apache/mod_php服务器以获得低内存,则必须调整apache设置以限制其生成的进程数(特别是MaxClient)

如果没有对这些东西进行调优,就意味着当你遇到一个巨大的流量高峰时,apache开始产生大量繁重的进程(记住,它是mod_php,所以你在每个httpd进程中都嵌入了整个php解释器),你的内存用完了,然后一切都开始交换,你的服务器开始冒烟

正确地调整(意思是:调整使您忽略请求,而不是为更多进程分配您没有的内存),客户机将超时,但当通信量减少时,情况会恢复正常

将其与fpm和更智能的web服务器架构(如ApacheWorker或nginx)进行比较。现在您有了一些更大的线程池(仍然可以配置!)来处理http请求,还有一个单独的php fpm进程池来处理需要php的请求。这基本上是一样的,如果不限制可以创建多少进程/线程,那就是自找麻烦。但是如果您确实进行了调优,那么您就会领先,因为您的请求中只有一小部分使用PHP。因此,从本质上讲,每个http请求所需的平均内存量较低,因此您可以使用相同的内存量处理更多的请求

但将数字设置为“1”太极端了。在“1”中,选择静态还是动态都无关紧要,因为无论哪种方式,您都只有一个php fpm进程

因此,要尝试对特定问题给出明确的答案:

你可能会想:-嗯!php脚本(网页)通常在100毫秒内处理。。。毫无疑问,但是如果你的页面可以运行大约10秒,而我有10个带有5台服务器的php fpm访问者,那么每次只接受5个请求,会发生什么呢?他们都会排队,还是会超时

是的,他们都会排队,最后超时。然而,事实上,您经常有需要10秒才能运行的脚本,这才是真正的罪魁祸首。有很多方法可以解决这个问题(缓存、工作队列等),但正确的解决方案完全取决于您正在尝试做什么

老实说,我习惯于在Windows中使用Apache和mod_php运行站点,我从未遇到过这些问题,因为显然这些限制不适用于使用php的不同方式

它们确实适用。您可以使用与nginx/php fpm相同的方法设置apache/mod_php服务器——只需将apache的MaxClient设置为1

这也提出了另一个问题。如果我有带sleep(20)的文件_1.php和带echo的文件_2.php,如果我用fastcgi机器运行文件_1,然后运行文件_2,第二个文件将请求创建另一个服务器,以使用4MB RAM处理php请求。如果我对apache/mod_php也这样做,那么第二个文件将只使用30KB的内存(在apache服务器中)。考虑到这一点,为什么mod_php会认为如果使用的内存实际上更少,那么它就是“坏人”…我知道我忽略了这里的大局

特别是在linux上,许多报告内存使用情况的内容可能会产生误导。但是这样想吧:30kb是可以忽略不计的。这是因为当某个httpd进程启动时,PHP的大部分内存已经分配好了

128MB VPS非常紧凑,但应该能够处理多个php进程

如果你
pm = static
pm.max_children=4