本文主要是介绍了NGINX Plus的相关功能,横跨了NGINX Plus R5/R6/R7/R9等各个不同版本的更新。涉及的是Nginx反向代理和负载均衡的更为高级的用法。主要包含:HTTP负载均衡,HTTP长连接,TCP和UDP的负载均衡,上游连接数限制,最短时间的均衡算法,Session一致性,实时健康检查,DNS重解析,访问控制,客户端连接数限制,客户端带宽限制,无缓冲上传文件,SSL/TLS优化,,缓存优化,API功能,配置的最佳实践等。
什么是NGINX Plus?
顾名思义,就是Nginx的加强版或者扩展版。我们知道Nginx是开源的、免费的,但是NGINX Plus的很多功能就需要收费了。Nginx Plus 可以作为一个负载均衡器,一个web服务器,还可以作为一个内容缓存。既然是Nginx的加强版,那无疑功能会比Nginx更加强大。NGINX Plus在开源Nginx已有的功能基础上,提供了许多适合生产环境的专有功能,包括session一致性、实时更新API配置、有效的健康检查等。
NGINX Plus的版本更新
NGINX Plus R5 和更新的版本可以支持基于TCP应用的负载均衡(比如MySQL)。这就不仅仅限制于Http的负载均衡,而是大大扩充了Nginx作为负载均衡器的作用范围。R6中TCP负载均衡功能得到很大的扩充,加入了健康检查、动态更新配置、SSL终端等。等到了R7,TCP负载均衡功能就基本和Http负载均衡差不多了。z再到了R9,就可以支持UDP了。通过这些更新,NGINX Plus 远远超过了web应用的层面,成为了一款意义更为广泛的负载均衡器。毕竟协议是基础层面的东西,支持的协议越多,应用面也越广。从最初的Http/SMTP到TCP再到UDP,NGINX Plus一步步的变得越来越强大。
开源Nginx和NGINX Plus 都支持HTTP, TCP, 和UDP应用的负载均衡。但NGINX Plus 提供了一些企业级别的功能,这些功能是收费的,包括session一致性,健康检查,动态更新配置等。
HTTP负载均衡
NGINX Plus对Http负载均衡做了很多功能优化,诸如HTTP 升级、长连接优化、内容压缩和响应缓存等。在NGINX Plus中Http负载均衡的实现也非常简单:
http {
upstream my_upstream {
server server1.example.com;
server server2.example.com;
}
server {
listen 80;
location / {
proxy_set_header Host $host;
proxy_pass http://my_upstream;
}
}
}
可以通过proxy_set_header
指令来设置Host,而proxy_pass
将请求转发到上游的my_upstream
中。
HTTP长连接
HTTP长连接——HTTP Keepalives,是指NGINX PLus和上游服务器建立的长连接。客户端和NGINX PLus建立长连接的话,可以在客户端指定Http协议为1.1/2.0。
HTTP协议是用的底层TCP协议来传输请求,接收响应的。HTTP1.1/2.0支持TCP的长连接或者重利用,以免反复的创建和销毁TCP连接所带来的开销。
我们看看客户端到NGINX PLus之间的Http长连接:
NGINX是一个完全意义的反向代理,在长连接上也毫不含糊。它管理所以来从客户端到Nginx的长连接,同样也会管理从Nginx到上游服务器的长连接,二者是完全独立的。
Nginx管理的长连接:
NGINX 将连接上游服务器的空闲连接做了“缓存”,并不直接关掉它们。如果有请求过来,NGINX先从缓存的活跃连接中去拿一个使用,而不是立马创建一个新的,如果缓存为空那么NGINX 再去新建一个连接。这种操作保持了和上游之间连接的最小必要的数目,从而降低了Nginx和上游服务器之间的延迟并减少了临时端口的利用率,所以NGINX能处理大的并发。这种技术加上别的负载均衡技术,有时候可以被称为连接池,或者连接复用。
为了配置闲置长连接缓存,你需要指定几个指令:proxy_http_version,proxy_set_header,keepalive
server {
listen 80;
location / {
proxy_pass http://backend;
proxy_http_version 1.1; # 只有Http1.1/2.0才能支持长连接
proxy_set_header Connection "";
}
}
upstream backend {
server webserver1;
server webserver2;
# maintain a maximum of 20 idle connections to each upstream server
keepalive 20; # 闲置长连接缓存时间为20
}
TCP和UDP的负载均衡
作为对HTTP协议的扩展,NGINX Plus可以直接支持基于TCP和UDP协议的应用。基于TCP的如MySQL,支持UDP的如DNS 和RADIUS应用。对于TCP请求来说,NGINX Plus接收了客户端的TCP请求,然后再创建一个TCP请求对上游服务器发起访问。
stream {
upstream my_upstream {
server server1.example.com:1234;
server server2.example.com:2345;
}
server {
listen 1123 [udp];
proxy_pass my_upstream; #注意这里没有http://了
}
}
对TCP请求的支持出现在NGINX Plus R5,R6