4.4.1 七层代理配置指南

Nginx 是七层负载均衡的典型实现相信,常见的网关 OpenResty、Kong 核心都是基于 Nginx,它们的配置也基本延续 Nginx 的配置规范。本节,笔者选取部分代理相关的参数配置进行说明,以便读者了解 Nginx 或以 Nginx 为核心的网关配置操作。

Nginx 的主配置文件是 nginx.conf,这个配置文件一共由三部分组成:main、event 和 http。http 中又嵌套虚拟机。它们的嵌套关系如图 4-14所示。


图 4-14 Nginx 配置

1. Buffer 配置

在反向代理中,Buffer(缓冲)主要解决后端服务器与用户网络不对等的情况。如 Nginx 到后端服务器是 100KiB/s,用户到 Nginx 是 10Kib/s。这种情况下,如果没有启用 Buffer,会导致 Nginx 使用较长的时间处理用户端与后端服务器的连接,高并发下容易出现连接积压。

配置正确的 Buffer,将后端服务器的响应缓冲到 Nginx 服务器,Nginx 根据客户端的网络质量以匹配的网速将响应传递给客户端。这样既解决了连接积压问题,也实现了持续稳定地向客户端传递响应。Nginx 配置 Buffer 的示例如下:

location / {
    proxy_buffering on;
    proxy_buffers 4 32k;
    proxy_buffer_size 2k;
    # 其他 nginx 配置
}

proxy_buffers 指令设置了为每个请求分配的 Buffer 大小和数量,4 指定了每个请求的 Buffer 数量,32K 指定了每个 Buffer 的大小(一个接口的响应一般在 32k)。proxy_buffer_size 指令设置了为处理响应头部分(HTTP header 部分)分配的 Buffer 的大小。

2. Cache 配置

缓存静态内容(如图片、CSS、JS 文件)可加速静态内容的访问,缓存动态内容可减少对后端服务器的请求次数,降低后端服务器的压力。

启用缓存后,Nginx 将响应保存在磁盘中,返回给客户端的数据首先从缓存中获取,这样子相同的请求不用每次都发送给后端服务器,减少到后端请求的数量。

启用缓存,需要在 http 上下文中使用 proxy_cache_path 指令,定义缓存的本地文件目录,名称和大小。缓存区可以被多个 server 共享,使用 proxy_cache 指定使用哪个缓存区。

http {
    proxy_cache_path /data/nginx/cache keys_zone=mycache:10m;
    server {
        proxy_cache mycache;
        location / {
            proxy_pass http://localhost:8000;
        }
    }
}

缓存目录的文件名是 proxy_cache_key 的 MD5 值, proxy_cache_key 默认设置如下。

proxy_cache_key $scheme$proxy_host$uri$is_args$args;

当然也可以自定义缓存 key。

proxy_cache_key "$host$request_uri$cookie_user";

缓存不应该设置的太敏感,可以使用 proxy_cache_min_uses 设置相同的 key 的请求,访问次数超过指定数量才会被缓存。

proxy_cache_min_uses 5;

缓存设置的示例。

http {
	proxy_cache_path /var/cache/nginx/data keys_zone=mycache:10m;
	server {
 		location = /html/demo.html {
	        proxy_cache mycache;
	        proxy_cache_valid 200 302 10m;
	        proxy_cache_valid 404      1m;
	        proxy_cache_valid any 5m;

	        proxy_pass http://localhost:8088;  
    	}
 	}
}

3. 七层负载均衡模式

跨多个应用程序实例的负载平衡是一种常用技术,用于优化资源利用率、最大化吞吐量、减少延迟和确保容错配置,Nginx 支持 6 种负载均衡模式:

模式介绍
轮循机制默认机制,以轮循机制方式分发
最小连接将下一个请求分配给活动连接数最少的服务器
ip-hash客户端的 IP 地址将用作哈希键,来自同一个 ip 的请求会被转发到相同的服务器
hash通用 hash,允许用户自定义 hash 的 key,key 可以是字符串、变量或组合
随机‎‎每个请求都将传递到随机选择的服务器
权重按照 weight 参数进行分配

作为反向代理,如果后端服务器在某个周期内响应失败次数超过规定值,Nginx 会将此服务器标记为失败,并在之后的一个周期不再将请求发送给这台服务器。在 upstream 配置中:

  • 通过 fail_timeout‎‎ 来设置检查周期,默认为 10 秒;
  • 通过 max_fails‎ 来设置检查失败次数,默认为 1 次。‎

配置案例如下所示。

upstream backend {
  server backend.thebyte.com.cn max_fails=3 fail_timeout=30s; 
} 
总字数:1062
Last Updated:
Contributors: isno