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

时间:2020-04-24 11:16:01

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

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;
}

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

应用程序执行以下操作:

  • 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

2 个答案:

答案 0 :(得分:0)

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

# vi /etc/security/limits.conf

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

nginx       soft    nofile   10000
nginx       hard    nofile  30000

答案 1 :(得分:0)

(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_backlogsysctl中的net.core.netdev_max_backlog个值。
  2. 创建多个php-fpm池,然后使用upstream nginx config使用这些池。