我们有一个网络应用程序,公司中的许多人都需要访问。有时,网络应用程序似乎停止响应请求。
例如,如果资源索引页面(例如订单表视图)尝试刷新资源列表,它将通过 API 请求数据并显示加载指示器,但一段时间后请求最终会默默失败。这种情况同时发生在多人身上,但在此中断/缓慢期间从另一个网络(例如移动数据)访问该应用程序似乎可行。其他网站在此期间似乎也没有受到影响。
浏览器网络选项卡显示请求在 20-40 秒后失败,但没有状态代码。选择请求时的状态文本为
failed net::ERR_CONNECTION_TIMED_OUT
。似乎当您在处理请求时未单击该请求并稍后打开详细信息时,计时选项卡会显示它卡在“Stalled”阶段。但是,如果您在处理请求详细信息时打开请求详细信息,它会说它卡在“初始连接”阶段。这使得请求详细信息的计时选项卡看起来不可靠,因为它显示的内容似乎取决于我在处理请求时是否正在检查请求。
服务器在此期间似乎没有显示出严重过载 - 最大 30% CPU/内存使用率。
该服务器在 Digital Ocean Droplet 上运行,并使用 nginx 托管 Laravel 应用程序。
应用程序本身确实启用了限制,但它绑定到用户 ID,返回“尝试次数过多”错误消息和定义的状态代码,因此如果这是限制的情况,则不应在应用程序级别进行限制。
我可以做什么来调试/调查问题的根源?据我了解,问题可能出在从 nginx 配置到 ISP 提供商限制的任何地方。我认为目前这是某种限制,但我可能错过了什么吗?
可能是 Laravel 中默认为所有 api 路由配置的 RateLimiter。
看看
/**
* Configure the rate limiters for the application.
*/
protected function configureRateLimiting(): void
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
}
干杯