最佳 Nginx 配置可在几秒钟内处理数千个请求

Posted

技术标签:

【中文标题】最佳 Nginx 配置可在几秒钟内处理数千个请求【英文标题】:Optimal Nginx config to handle thousands of request within seconds 【发布时间】:2020-08-07 22:49:42 【问题描述】:

nginx 同时处理大量请求的最佳设置是什么?

我的服务器在 Ubuntu 20.04 LTS 上配置了 Nginx 和 php7.3。 正在运行的应用程序是使用 Laravel 7 构建的。

这是我当前的配置:

location ~ \.php$ 
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    fastcgi_index index.php;
    fastcgi_buffer_size 14096k;
    fastcgi_buffers 512 14096k;
    fastcgi_busy_buffers_size 14096k;
    fastcgi_connect_timeout 60;
    fastcgi_send_timeout 300;
    fastcgi_read_timeout 300;


我放置的 fastcgi 参数是我通过 Google 找到的,并将数字调整为一些较高的值。

应用程序执行以下操作:

1500+ 用户在线 他们得到一个通过 Pusher 直接推送的多项选择题 他们几乎同时回答所有问题 = 每个答案通过 Ajax 向服务器发出 1 个请求 每次给出答案时,都会从服务器为每个用户获取结果

所有四个步骤都可以在几秒钟内完成。

完成此操作后,服务器的 CPU 和内存都没有达到峰值,唯一发生的事情是某些用户收到 502 超时。

看起来像是 Nginx 中的服务器配置问题。

这是发生时服务器的统计数据:

系统:25%,CPU:22%,磁盘 IO:0% - 可用 8 个处理器内核 RAM:1.79GB - 可用 3GB

附注是我在 Laravel 中禁用了 VerifyCsrfToken 以防止额外的服务器负载。

我错过了什么?我是否还必须更改一些 PHP-FPM 设置?如果是这样,我可以对哪个和哪些人这样做?

这是域的 Nginx 错误日志告诉我的:

2020/04/25 13:58:14 [error] 7210#7210: *21537 connect() to unix:/var/run/php/php7.3-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 54.221.15.18, server: website.url, request: "GET /loader HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.3-fpm.sock:", host: "website.url"

www.conf 的设置:

pm.max_children = 100
pm.start_servers = 25
pm.min_spare_servers = 25
pm.max_spare_servers = 50
pm.max_requests = 9000
;pm.process_idle_timeout = 10s;
;pm.status_path = /status

【问题讨论】:

“我错过了什么?”测试单个请求使用了多少内存。并用该数字划分整个服务器可用的 RAM。这样,您将一次获得准确的理论数量的请求。 添加了我发现的关于这个的信息 问题是 Laravel 中的一个请求-响应周期会占用大量可用 RAM。在您的机器上它是 3 GB,但您需要考虑用于系统其他部分的 RAM,例如操作系统功能、服务器运行所需的其他进程和应用程序。因此,假设您有 2 GB 的 RAM 可用于您的 laravel 应用程序。也许更多,但我们以 2 GB 计算。即使是空的 laravel 应用程序,每个 req/res 周期也需要大约 10 MB 的 RAM。这将是 200 个并行连接/进程。 假设一个周期在 400 毫秒内完成,这表示我们每秒有 2 个半请求。 200x2.5 = 每秒 500 个请求可用(理论上,如果一切正常)。但是,如果在一天中的某个高峰时间,您有超过 500 个请求以这种无用的方式交错排列(同一时刻最多有 200 个请求开始),这就是它中断的原因。机器上的 RAM 不是无限的。 当内存不足时,会发生 502 超时或 Nginx 吗?那么升级ram可以解决吗? @Tpojka 【参考方案1】:

(11: Resource temporarily unavailable)

那是EAGAIN/EWOULDBLOCK,表示 nginx 确实接受了客户端连接,但是它无法连接到 PHP-FPM 的 UNIX 套接字而不阻塞(等待),而且可能不看 nginx 的源代码,nginx 已经尝试了几个连接到所述 UNIX 套接字但失败的次数,所以 nginx 抛出一个 Connection refused

有几种方法可以解决这个问题:

    在您的 PHP-FPM 池配置中增加 listen.backlog 配置值,其 对应的net.ipv4.tcp_max_syn_backlognet.ipv6.tcp_max_syn_backlognet.core.netdev_max_backlog 中的 sysctl 值。 创建多个 php-fpm 池,然后使用 upstream nginx 配置来使用这些池。

【讨论】:

【参考方案2】:

编辑/etc/security/limits.conf,输入:

# vi /etc/security/limits.conf

为所有用户或nginx用户设置软硬限制如下:

nginx       soft    nofile   10000
nginx       hard    nofile  30000

【讨论】:

没有帮助。 Nginx 错误日志中仍然有同样的错误:2020/05/03 20:18:08 [error] 3729#3729: *110606 connect() to unix:/var/run/php/php7.3-fpm.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 300.24.116.18, server: website.url, request: "GET /loader HTTP/1.1", upstream: "fastcgi://unix:/var/run/php/php7.3-fpm.sock:", host: "website.url"

以上是关于最佳 Nginx 配置可在几秒钟内处理数千个请求的主要内容,如果未能解决你的问题,请参考以下文章

Windows 任务调度程序可在几秒钟内执行任务

高负载应用的最佳节点 ORM 模块

Nginx请求处理流程

nginx-配置nginx实现负载均衡

nginx配置Nginx实现负载均衡

nginx配置Nginx实现负载均衡