【问题标题】:Optimal Nginx config to handle thousands of request within seconds最佳 Nginx 配置可在几秒钟内处理数千个请求
【发布时间】:2023-03-18 22:41:01
【问题描述】:

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

标签: php laravel nginx nginx-config php-7.3


【解决方案1】:

(11: Resource temporarily unavailable)

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

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

  1. 在您的 PHP-FPM 池配置中增加 listen.backlog 配置值,其 对应的net.ipv4.tcp_max_syn_backlognet.ipv6.tcp_max_syn_backlognet.core.netdev_max_backlog 中的 sysctl 值。
  2. 创建多个 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"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 2021-01-27
    • 2017-03-12
    • 1970-01-01
    • 2018-07-12
    相关资源
    最近更新 更多