Nginx upstream_keepalive_module 优化后端连接

nginx连接后端服务时,使用upstream的方式,并且设置keepalive可以建立长连接,减少创建连接的消耗,提升效率。

但是,nginx默认采用http1.0协议,如果后端没有返回Connection:keepalive的header,设置的长连接是不生效的,大并发下会出现大量time_wait的连接。

两种解决方案:

1、后台服务在response header中加Connetion:keepalive
2、在nginx配置中显示指明http1.1协议(默认长连接),并且设置header Connnction=""

location ~ /XXX {
....
proxy_http_version 1.1;
proxy_set_header Connection "";
}


应用场景


nginx 通常情况下都是用来当作一个反向代理,通常一个请求都需要经过 client -> nginx -> backend_server 这么几成关系。通常情况下 client -> nginx 使用的 HTTP 1.1 或者 2.0 的协议,keep-alive 复用了 TCP 的连接,减少了 TCP 频发创建和销毁带来的性能损失。但是默认情况下,nginx -> backend_server 是 HTTP 1.0 的协议,并没有复用 TCP 的连接

对发往上游请求当中要加上http头部图片里面的两条指令proxy_http_version和proxy_set_header,因为http 1.0协议是不支持keepalive长连接的,为了防止用户发来的是http 1.0协议我们需要重置http_version为1.1,这样一直可以使用keepalive长连接。其次为了防止用户connection头部给我们传入的是closed而不是keepalived,我们需要主动设置向上游发的Connection值为Connection ""。

 

Nginx Upstream连接后端有两种方式:短连接和长连接 


Keep-Alive即俗称的长连接,使客户端到服务端建立的连接持续有效,当对服务器发起后续请求时,Keep-Alive功能可以复用先前使用过的连接,减少了重新建立连接所需的开销。通常使用HTTP协议采用的是请求应答模式,客户端到服务端的一次请求完成了,它们之间的连接也随之关闭。在某些应用场景下,比如后端RESTful服务,就需要保持住连接,这时就可以启用HTTP Keep-Alive。

 

开启 upstream keepalive(对上游连接启用 HTTP keepalive长连接)


Syntax: keepalive connections;
Default: —
Context: upstream

Syntax: keepalive_requests number;
Default: keepalive_requests 100;
Context: upstream

针对上诉场景的,我们需要使用 nginx upstream keepalive 来优化。

摘录官方文档的说明如下。该参数开启与上游服务器之间的连接池,其数值为每个nginx worker可以保持的最大连接数,默认不设置,即nginx作为客户端时keepalive未生效。

keepalive128 – Enables keepalive connections from NGINX Plus to upstream servers, defining the maximum number of idle keepalive connections preserved in the cache of each worker process. When this number is exceeded, the least recently used connections are closed. Without keepalives, there is more overhead and both connections and ephemeral ports are not used efficiently.

For HTTP traffic, when you include this directive in an upstream block you must also include the following directives in the configuration so that they apply to all location blocks that proxy traffic to that upstream group (you can place them in individual such location blocks, in the parent server blocks, or at the http level):

  • proxy_http_version1.1 – NGINX Plus uses HTTP/1.1 for proxied requests
  • proxy_set_headerConnection"" – NGINX Plus strips any Connection headers from the proxied request
upstream http_backend {
    server 127.0.0.1:8080;
    keepalive 256;
}
server {
    ...
 
    location /http/ {
        proxy_pass http://http_backend;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        ...
    }
}

下图是nginx upstream keepalive长连接的实现原理。首先每个进程需要一个connection pool,里面都是长连接,多进程之间是不需要共享这个连接池的。 一旦与后端服务器建立连接,则在当前请求连接结束之后不会立即关闭连接,而是把用完的连接保存在一个keepalive connection pool里面,以后每次需要建立向后连接的时候,只需要从这个连接池里面找,如果找到合适的连接的话,就可以直接来用这个连接,不需要重新创建socket或者发起connect()。这样既省下建立连接时在握手的时间消耗,又可以避免TCP连接的slow start。如果在keepalive连接池找不到合适的连接,那就按照原来的步骤重新建立连接。

如果你的连接池的数控制在128,总共线程池内的线程数是128 * nginx worker ,但因为你要应对更多的并发请求,所以临时又加了很多的连接,但这临时的连接是短连接和长连接要看你的nginx版本,我这1.8是长连接,那他如何被收回,两点保证,一点是他会主动去释放,另一点是keepalive timeout的时间。


 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值