Laravel应用并发连接超200时遭拒绝,节流配置无效求助
你的问题并非Laravel节流配置导致,而是底层Web服务器、PHP-FPM、系统资源或数据库连接池的并发限制引发的,按以下步骤逐一排查:
1. 检查Web服务器(Nginx/Apache)的并发参数
Nginx配置调整
编辑Nginx主配置文件(通常为/etc/nginx/nginx.conf),确保参数满足高并发需求:
http { # 自动匹配CPU核心数设置进程数 worker_processes auto; # 提升进程可打开的最大文件句柄数 worker_rlimit_nofile 65535; events { # 每个worker进程的最大连接数,需大于目标并发数 worker_connections 65535; # 启用epoll优化Linux高并发性能 use epoll; # 让worker进程一次性接收所有新连接 multi_accept on; } server { # 增大监听队列长度,避免连接被直接拒绝 listen 80 backlog=1024; # ...其他站点配置 } }
修改后重启Nginx:sudo systemctl restart nginx
Apache配置调整
编辑Apache的mpm.conf文件(如/etc/httpd/conf.modules.d/00-mpm.conf),调整进程相关参数:
<IfModule mpm_prefork_module> # 最大并发请求数,需大于200 MaxRequestWorkers 300 # 每个子进程处理的最大请求数,防止内存泄漏 MaxConnectionsPerChild 500 # 初始启动的子进程数 StartServers 20 # 最小空闲子进程数 MinSpareServers 10 # 最大空闲子进程数 MaxSpareServers 30 </IfModule>
重启Apache:sudo systemctl restart httpd
2. 调整PHP-FPM的进程限制
编辑PHP-FPM的www.conf文件(如/etc/php/8.2/fpm/pool.d/www.conf,版本号按需调整):
# 推荐用dynamic或ondemand模式,避免static模式内存占用过高 pm = dynamic # 最大子进程数,需结合服务器内存计算(每个PHP进程约20-50M) pm.max_children = 300 # 启动时的初始进程数 pm.start_servers = 20 # 最小空闲进程数 pm.min_spare_servers = 10 # 最大空闲进程数 pm.max_spare_servers = 30 # 每个子进程处理的最大请求数,防止内存泄漏 pm.max_requests = 500
重启PHP-FPM:sudo systemctl restart php8.2-fpm
3. 检查数据库连接池限制
数据库自身连接数
以MySQL为例,登录数据库执行命令查看当前限制:
SHOW VARIABLES LIKE 'max_connections';
若结果小于目标并发数,修改MySQL配置文件(如/etc/my.cnf或/etc/mysql/my.cnf):
[mysqld] max_connections = 300
重启MySQL:sudo systemctl restart mysqld
Laravel数据库连接池(若使用)
如果用了Laravel Octane或第三方连接池扩展,修改config/database.php:
'mysql' => [ // ...其他配置 'pool' => [ 'min' => 10, 'max' => 300, 'idle' => 60, ], ],
4. 提升系统文件句柄限制
Linux默认文件句柄数(每个进程可打开的文件/连接数)可能不足,临时调整命令:
ulimit -n 65535
永久生效需编辑/etc/security/limits.conf:
* soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535
重启服务器后设置生效。
5. 确认Laravel节流的缓存驱动
Laravel节流依赖缓存,file缓存在高并发下性能不足会导致节流判断异常,修改.env改用Redis或Memcached:
CACHE_DRIVER=redis
内容的提问来源于stack exchange,提问作者Vasanthan R

