最佳 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_backlog
、net.ipv6.tcp_max_syn_backlog
和
net.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 配置可在几秒钟内处理数千个请求的主要内容,如果未能解决你的问题,请参考以下文章