interview
backend-classic
如何用 Nginx 做限流有几种限流算法分别如何实现

后端经典面试题合集, 如何用 Nginx 做限流,有几种限流算法,分别如何实现?

后端经典面试题合集, 如何用 Nginx 做限流,有几种限流算法,分别如何实现?

QA

Step 1

Q:: 如何用 Nginx 做限流?

A:: Nginx 的限流功能主要依靠 ngx_http_limit_req_modulengx_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_reqlimit_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_zonelimit_conn_zone 的参数,比如调整请求速率、突发容量、并发连接数等,以更好地适应业务流量变化。

用途

Nginx 限流功能在实际生产环境中的应用非常广泛。它用于防止恶意爬虫、DDoS 攻击、以及意外的大量请求对后端服务造成的压力过大。面试中询问这类问题,是为了考察候选人对高并发场景下的流量控制和服务稳定性的理解与实践经验。限流的配置和调优是保障服务可用性、提高系统稳定性的重要手段,特别是在需要处理大量并发请求或防御恶意流量时,这些技术尤为重要。\n

相关问题

🦆
Nginx 如何配置负载均衡?

Nginx 通过 upstream 模块配置负载均衡,支持轮询(默认)、权重、IP 哈希、最少连接等策略。例如:

 
upstream backend {
    server backend1.example.com weight=3;
    server backend2.example.com;
}
server {
    location / {
        proxy_pass http://backend;
    }
}
 
🦆
Nginx 如何处理静态资源?

Nginx 可以高效地处理静态资源,通过 location 指令设置资源路径。例如:

 
location /images/ {
    root /data;
}
 

此配置将 /images/ 下的请求映射到 /data/images/ 目录。

🦆
Nginx 和 Apache 相比有什么优势?

Nginx 以高并发处理能力著称,采用事件驱动架构,适合处理大量短连接,资源占用较少。而 Apache 是模块化设计,灵活性强,适合复杂的配置需求。Nginx 更适合反向代理和负载均衡,Apache 则更适合静态页面和模块化应用。

🦆
如何优化 Nginx 的性能?

优化 Nginx 性能可以从以下几个方面入手: 1. 使用 worker_processesworker_connections 充分利用多核 CPU 和网络连接。 2. 启用 sendfiletcp_nopushtcp_nodelay 优化传输效率。 3. 使用缓存、压缩(如 gzip)减少网络流量。 4. 合理配置超时时间、限制日志级别减少 I/O 开销。