广告位联系
返回顶部
分享到

nginx反向代理下的长连接实现

nginx 来源:互联网 作者:佚名 发布时间:2024-11-27 21:10:12 人浏览
摘要

一、nginx使用场景 大型应用架构中,一般会使用nginx反向代理,分为三层: 1.调用层,浏览器或APP; 2.中间层,反向代理nginx; 3.服务层,server一般是apche、tomcat 请求调用过程: 1.浏览器/app发起

一、nginx使用场景

大型应用架构中,一般会使用nginx反向代理,分为三层:

1.调用层,浏览器或APP;

2.中间层,反向代理nginx;

3.服务层,server一般是apche、tomcat

请求调用过程:

1.浏览器/app发起请求

2.DNS解析网址为ip地址

3.通过外网ip访问nginx

4.nginx发送请求给内网ip的server

上面架构,要想支持全链路的长连接,需要做到两点:

1.从client到nginx的连接是长连接;

2.从nginx到server的连接是长连接;

二、长连接设置

1.client到nginx的长连接:

由于目前浏览器默认使用HTTP/1.1,请求header中默认设置Connection:keep-alive,所以只需在nginx配置中做如下配置:

1

2

3

4

http {

       keepalive_timeount 120s 120s;

       keepalive_requests 10000;

}

#语法

1

keepalive_timeout timeout [header_timeout]

第一个参数(timeout):设置keep_alive客户端(浏览器)连接在服务端(nginx端)保持开启的超时值(默认75s);值为0会禁用keep_alive客户端连接;

第二个参数(header_timeout):可选,在响应的header中设置值“Keep-Alive:timeout=time”;通常可以不用设置;

keepalive_requests这个配置项用于设置一个keep-alive连接上可以服务的请求最大数量,当达到配置的最大请求数时,连接会被关闭,默认值为100.具体过程时指一个keep-alive连接建立之后,nginx会为这个连接设置一个计数器,记录这个长连接上已经接收并处理的客户端请求的数量,一旦达到设置的最大值时,nginx会强行关闭这个长连接,此时如果客户端有新请求,就需要重新建立新的长连接。

注:在QPS较高的场景下,服务端需要将keepalive_requests设置大一些,默认数值就不够了,否则服务端可能会出现大量的TIME_WAIT状态的TCP连接数异常!另外nginx(version 1.15.3)在Upstream内增加了keepalive_requests配置项,默认值也是100,也是需要手动设置,而且这两个数量可以不一致,一般服务端要设置的大些,因为多数情况是一个nginx代理对应多个服务端。

2.nginx和server的长连接

默认情况下,nginx访问后端都是用的短连接(HTTP/1.0)一个请求来了,nginx会新开一个端口和后端建立连接,后端执行完毕后主动关闭该tcp连接。为了让nginx和后端server(nginx称之为upstream)之间保持长连接,典型设置如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

http {

         upstream http_backend {

                  server 192.168.2.154:8080;

                  server 192.168.2.109:8080;

                  keepalive 32;                  # 长连接缓存池大小为32

                  keepalive_timeout  120s;       # 长连接失效时间

                  keepalive_requests 2000;       # 每条长连接最大复用请求数为2000

          }

 

        server {

                 location /http/ {

                 proxy_pass http://http_backend;

                 proxy_http_version 1.1;        # 启用HTTP/1.1版本与被代理服务器建立连接

                 proxy_set_header Connection "Keep-Alive";  # 设置发送被代理服务器请求头属性字段Connection

         }

 }

nginx 与被代理服务器间建立的长连接是通过启用 HTTP/1.1 版本协议实现的。由于 HTTP 代理模块默认会将发往被代理服务器的请求头属性字段 Connection 的值设置为 Close,因此需要通过配置指令设置请求头属性字段 Connection 的内容为“Keep-Alive”或者空值。

另外upstream中的keepalive_timeout和keepalive_requests参数与上面的含义一样,不做过多解析,需要重点关注keepalive参数,他的含义是指设置到upstream服务器的空闲keepalive连接的最大数,当这个数量被突破时,最近最少使用的连接将被关闭,另外这个参数不会限制一个nginx worker进程到upstream服务器连接的总数量,有点像线程池中的核心线程数。

注:keepalive参数设置一定要合理,尤其对于QPS比较高的场景,推荐做一下估算,根据QPS和平均响应时间大概计算出需要长连接的数量,尽量避免系统运行时产生连接数量的反复震荡,比如keepalive设置为10,前一秒系统qps较低,只需50个长连接,用完立马关闭其中50-10=40个连接,而后一秒系统qps突增,需要150个连接,空缺了150-10=140个连接,此时nginx不得不新建140个新连接来满足要求。

三、问题总结

综上所述,nginx反向代理的情况下,tcp长连接设置完成。在实际系统应用长连接的场景中,可能会出现大量TIME_WAIT的情况,这里简单做个总结:

1.导致nginx端出现大量TIME_WAIT的情况有两种:

a.keepalive_requests设置比较小,高并发下超过此值后nginx会强制关闭和客户端的长连接;(主动关闭连接后导致nginx出现TIME_WAIT)

b.keepalive设置比较小(空闲数太小),导致高并发下nginx会频繁出现连接数震荡,不停的关闭、开启和后端server的长连接;

2.导致后端server端出现大量TIME_WAIT的情况:

nginx没有打开和后端的长连接,即:没有设置proxy_http_version 1.1和proxy_set_header Connection "Keep-Alive",从而导致后端server每次请求后就关闭连接,高并发下就会出现server端的大量TIME_WAIT.


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 怎么使用nginx代理ws或是wss的请求
    遇到的问题: 如何使用nginx代理ws或是wss的请求 起因是,为了降本增效要做服务器合并的需求,但两个服务器之间的进程存在对外连接的端口冲
  • nginx反向代理下的长连接实现

    nginx反向代理下的长连接实现
    一、nginx使用场景 大型应用架构中,一般会使用nginx反向代理,分为三层: 1.调用层,浏览器或APP; 2.中间层,反向代理nginx; 3.服务层,
  • linux安装nginx和前端部署vue项目全过程(实测react项

    linux安装nginx和前端部署vue项目全过程(实测react项
    1、打包前端项目 1 npm run build 执行完后会在根目录下生成一个dist文件夹,这个dist文件夹就是我们需要的东西 2、将dist包上传到服务器 自己
  • Nginx+Tomcat集群环境的实现

    Nginx+Tomcat集群环境的实现
    一、集群环境架构 一台Nginx可以与多台Tomcat服务器挂钩,此时客户端访问的都是Nginx反向代理的IP地址和端口,然后Nginx通过一些分流策略等
  • nginx指定conf文件路径的方法介绍
    在使用 Nginx 时,有时需要指定配置文件(nginx.conf)的路径,而不是使用默认的路径。你可以通过以下几种方式来指定配置文件路径: 1. 使
  • Nginx的流式响应配置教程介绍
    Nginx的流式响应配置 Nginx的流式响应(streaming response)是指在Nginx作为反向代理服务器时,将响应内容一边接收,一边逐步发送给客户端的过
  • Nginx设置Access-Control-Allow-Origin多域名跨域实现

    Nginx设置Access-Control-Allow-Origin多域名跨域实现
    修改配置文件 可通过如下配制进行多域名的设置。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 map $http_origin $corsHost { default 0; ~https://www.itbiancheng.com https://
  • Nginx修复CORS漏洞的实现方法
    漏洞描述 CORS 不安全配置漏洞指的是在跨域资源共享过程中,由于资源服务器的响应头 Access-Control-Allow-Origin 配置不当导致本应该受限访问的
  • Nginx配置超时时间的排查方法
    如果在 Nginx 中设置了 keepalive_timeout、client_header_timeout 和 client_body_timeout 后仍然不起作用,可以尝试以下排查步骤: 1. 确认配置的生效范围
  • Nginx中配置防盗链的方法实现介绍
    在当今数字化的时代,网站内容就如同珍贵的宝藏,而盗链则像是可恶的盗贼,企图不劳而获地窃取这些宝藏。想象一下,您辛辛苦苦打造
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计