优化策略
全局配置优化
worker_processes auto;:指定工作进程的数量,利用多核处理能力提高并发worker_cpu_affinity auto;:将Nginx进程绑定到特定CPU核心,减少CPU上下文切换- Nginx Event模块使用epoll模型,实现非阻塞I/O,提高并发连接处理效率
epoll模型 epoll是Linux下多路复用IO接口,相比传统的select和poll,epoll更加高效,能够处理更多的并发连接。它使用事件通知方式,应用程序可以一次性注册多个文件描述符(FD),当有IO事件发生时,只通知那些真正活跃的FD,减少了不必要的轮询,大大提高了性能。Nginx use epoll默认工作在边缘触发这种工作模式
http配置优化
- 格式化日志输出为json格式,方便收集并进行监控;
- 超时时间优化:
- reset_timedout_connection on;:连接超时后,不再等待客户端的应答,而是直接向客户端发送RST包来重置连接
- keepalive_timeout 25;:默认的75秒改为25秒,减少服务器上空闲连接的数量,释放资源并提高服务器的性能和效率
- resolver_timeout 6;:DNS解析的超时时间,确保Nginx不会因长时间等待DNS解析而消耗过多资源或导致请求失败
- client_header_timeout 10;:设置客户端在发送请求头时的超时时间。如果在这个时间内客户端没有发送完请求头,Nginx会返回“408 Request Time-out”错误。调整参数有助于减少恶意请求或客户端故意阻塞服务器的攻击
- client_body_timeout 20; :设置读取客户端请求主体数据的超时时间
upstream配置优化
- 由被动健康检查改为主动健康检查
主动健康检查 check interval=5000 rise=2 fall=3 timeout=1000; Interval:向后端发送的健康检查包的间隔是5000ms rise:如果连续成功次数达到2次,服务器就被认为是可用的 fall:如果连续失败次数达到3次,服务器就被认为是不可用的 timeout:后端健康请求的超时时间是1000毫秒,如果在这个时间内没有收到响应,那么这次健康检查就被认为是失败的
应对突发流量
基于连接速率/频率的限流
- ngx_http_limit_req_module :控制每个客户端请求的频率
限制每个IP地址每秒发送的请求
这个配置允许每个IP地址每秒发送最多1个请求到Nginx服务器。如果请求速率超过了这个限制,Nginx会允许额外的5个请求进入队列等待处理,并且由于
nodelay选项,这些请求不会被延迟。当队列满了之后,任何额外的请求都会按照限流策略处理(通常是返回503错误)
http {
# 定义一个名为mylimit的限流区域,使用客户端IP地址作为键。
# 该区域的大小为10MB,允许的请求速率为每秒1个请求。
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location / {
# 对这个location应用限流规则。
# 使用上面定义的mylimit限流区域。
# 当请求超过速率限制时,允许burst队列中有5个额外的请求。
# 使用nodelay选项,不延迟处理超过速率的请求,而是立即处理队列中的请求。
limit_req zone=mylimit burst=5 nodelay;
}
}
}
根据地域信息做限流
- 安装GeoIP模块:编译时增加
--with-http_geoip_module - 下载GeoIP数据库:下载GeoIP数据库文件,从数据库文件中获取IP地址的地理位置信息
- 指定GeoIP数据库路径:
geoip_country /etc/nginx/GeoIP/GeoIP.dat; - 使用geo模块:
geo $allowed_country {
default no;
BJ yes;
}
http {
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;
server {
location / {
limit_req zone=mylimit burst=5 nodelay;
if ($allowed_country = no) {
return 403;
}
}
}
}
lua-resty-limit-traffic:基于客户端IP、URI等的限流
github项目地址:github.com/openresty/l…
resty.limit.count
resty.limit.req
resty.limit.conn
基于并发连接数限流
- ngx_http_limit_conn_module模块:可以通过配置来限制每个客户端的并发连接数,保护服务不被过多连接占用资源
限制IP并发连接数
这个配置允许每个IP地址的客户端最多同时建立10个并发连接到Nginx服务器。如果尝试建立的连接数超过这个限制,Nginx会拒绝额外的连接,并返回错误。 这样的配置有助于防止单个IP地址打开过多的连接,从而耗尽服务器资源。这对于保护服务器免受恶意流量或滥用非常有用,同时仍然允许合法用户建立适量的并发连接
http {
# 定义一个名为mylimit的限流区域,使用客户端IP地址作为键。
# 该区域的大小为10MB。
limit_conn_zone $binary_remote_addr zone=mylimit:10m;
server {
location / {
# 对这个location应用并发连接限制规则。
# 使用上面定义的mylimit限流区域。
# 限制每个客户端IP地址的并发连接数为10个。
limit_conn mylimit 10;
}
}
}