【发布时间】: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