关于php-fpm最大连接数和nginx限流

2020-11-05  本文已影响0人  witwang

前言少叙,直奔主题,聊一聊php-fpm最大连接数和nginx限流。

php-fpm 如何设置最大连接数

php-fpm 设置最大连接数有三种方式:

选择哪个模式

ondemand 模式,闲置时可以确保最小占用内存,但是每次创建子进程时都会消耗cpu,性能最差,只适合主机内存很小的场景,不推荐在生产环境使用该模式。

static 模式,性能最强,但是会占用较多系统资源。

dynamic 模式,比较均衡,闲置时不会占用过多资源,有流量时也可以应付。

建议当机器内存很大,或者机器只用于php单一用途时,使用 static 模式来确保最强性能;如果内存不是很大,或者机器上还跑了其它应用,建议使用 dynamic 模式;ondemand 模式只适应于个人的小型站点。

根据机器情况确定好模式后,就需要确定具体的数值了,应用不同,对cpu和内存的消耗也不同,一般来说有以下参考:

实际中,最好是对服务器做一下压力测试,以确定具体应用的真实消耗来调整参数。

nginx限流

理想情况下,服务器有着很强的性能,不管来多少请求都能扛得住,可实际使用中,突发的大流量很可能会超出设置好的最大连接数,一旦达到这种情况,当有新的请求到来时会没有子进程可用,nginx就会处在等待状态,并且请求会积压,导致服务器负载越来越大,新的请求处理不了,旧的请求耗时过久,表现出来就是页面长时间无反应,过了一会儿收到502或504错误,很影响用户体验。
而遇到这种情况,要么是手动重启php-fpm,要么是等待流量过去,php慢慢的消化掉所有请求,但这时旧的请求其实已经没什么用了,因为用户不会一直等待,他可能已经关掉了页面。
因此,生产环境中可以配合nginx限流设置,来确保php服务器不会宕机。

配置如下:

# http 标签里增加代码:
limit_req_zone $server_name zone=apiRateLimit:10m rate=10r/s;

# server 标签里增加代码:
limit_req zone=apiRateLimit  burst=20 nodelay;

# 示例:
http {
    limit_req_zone $server_name zone=apiRateLimit:10m rate=10r/s;
    
    server {
        location / {
            limit_req zone=apiRateLimit  burst=20 nodelay;
        }
    }
}

代码解释:

如何设置

这里提供一个参考思路:首先使用压测工具在不启用限流时,测出来服务器的最大处理能力,作为 rate 的值,把 burst 设置为 rate 的两倍,同时加上nodelaypm.max_children 设置为与 burst 一样的值。

服务器的处理能力是有限的,不是一味的增加 max_children,就能够处理更多的请求,加大了 max_children,RPS不会怎么变化,但是平均响应时间会变长。因此 rate 就设置为最大处理能力,不浪费服务器资源,同时万一偶尔遇上突发流量,也能处理过来,只是响应时间变长了,而 pm.max_children = burst 可以确保同时被处理的请求数不会超过php的承受力。

上一篇 下一篇

猜你喜欢

热点阅读