后端经典面试题合集, 如何用 Nginx 做限流,有几种限流算法,分别如何实现?
后端经典面试题合集, 如何用 Nginx 做限流,有几种限流算法,分别如何实现?
QA
Step 1
Q:: 如何用 Nginx 做限流?
A:: Nginx 的限流功能主要依靠 ngx_http_limit_req_module
和 ngx_http_limit_conn_module
模块。limit_req
是基于请求速率的限流,limit_conn
是基于并发连接数的限流。限流配置通常通过定义一个共享内存区域来跟踪请求速率或连接数。例如:
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location / {
limit_req zone=mylimit burst=5 nodelay;
proxy_pass http://backend;
}
}
}
该配置表示每秒允许一个请求,burst 允许短时间的突发请求,nodelay 表示超过速率时立即返回错误而不是等待。
Step 2
Q:: Nginx 中常见的限流算法有哪些?分别如何实现?
A:: Nginx 常见的限流算法包括漏桶算法和令牌桶算法。
1.
漏桶算法:请求以固定速率通过漏桶处理,多余的请求被丢弃。Nginx 的 limit_req
模块就使用了漏桶算法。
2.
令牌桶算法:令牌以固定速率加入桶中,请求需要消耗令牌,若无令牌则限流。Nginx 实现令牌桶算法可以使用 Lua 脚本与 lua-resty-limit-traffic
模块,虽然默认 Nginx 并不支持令牌桶算法。
Step 3
Q:: 如何在 Nginx 中实现复杂的限流策略?
A:: 可以结合多个限流模块、不同的共享内存区域,以及使用 Nginx Plus 提供的高级限流功能来实现复杂的限流策略。例如,结合 limit_req
和 limit_conn
限制同一 IP 的请求速率和并发连接数,或者使用第三方模块如 Lua 插件来进行复杂的逻辑判断。配置示例:
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_req zone=one burst=20;
limit_conn addr 5;
proxy_pass http://backend;
}
}
该配置限制每个 IP 每秒最多发送 10 个请求,并且最多允许 5
个并发连接。
Step 4
Q:: 如何监控和调整 Nginx 的限流策略?
A:: 可以通过 Nginx 的 stub_status
模块或结合监控工具(如 Prometheus、Grafana)对限流效果进行监控。此外,Nginx Plus 提供更丰富的监控和可视化工具。根据监控数据,可以实时调整 limit_req_zone
和 limit_conn_zone
的参数,比如调整请求速率、突发容量、并发连接数等,以更好地适应业务流量变化。