当前位置:

nginx(二十七)长连接和短连接

访客 2024-01-05 1055 0

一长连接和短连接概念

  • 1)'HTTP'的长连接和短连接'本质'上是'TCP'长连接和短连接
  • 2)在'HTTP/1.0'中默认使用'短'连接;
  • 解读:客户端和服务器'每进行一次HTTP操作',就'建立一次tcp连接',任务结束就'中断'连接
  • 长连接和短连接的形象比喻

    二nginx如何做到长连接

  • 重点:'服务器'和'客户端'都要进行设置,也即'长连接'要客户端和服务端都支持
  • 思考:哪些场景必须使用'长连接'?-->已知:'chunk'、'websocket'
  • ①client和nginx保持长连接

    1)keepalive_timeout

    2)keepalive_requests

    了解keepalive_disable即可

    3)keepalive_timeout和keepalive_request关系

    ②nginx保持和后端服务器[上游、源站]的长连接

    1)典型的配置

  • 让nginx和后端server"[nginx称为upstream]"之间保持长连接
  • http{
  • upstreambackend{
  • ...
  • keepalive300;//这个很重要,一般'默认'
  • }
  • location/{
  • proxy_passhttp://backend;
  • proxy_http_version1.1;#设置http版本为1.1
  • #机制:转发请求头为空字符串,不会透传
  • #由于HTTP/1.1不指定Connection,默认是'keepalive'长连接
  • proxy_set_headerConnection"";#设置Connection为长连接
  • }
  • }
  • 2)upstream的keepalive指令设置

  • 说明:一般保持'默认'值即可
  • 含义:nginx向这'一组'upstream中,最多'保持'多少个'空闲的tcp连接'用于'httpkeepalive'请求
  • 官方keepalive指令解读

    关于Nginxupstreamkeepalive的说明

    keepalive_requestskeepalive_time

    2)proxy_http_version

    3)proxy_set_header

  • proxy_set_headerConnection"";设置为""空值,则'不会传递'给后端服务器,相当于不指定'Connection'请求头
  • #proxy_set_headerConnection默认是'close',会'关闭'长连接;
  • #HTTP/1.1,如果不指定'Connection'请求头,默认值是'keep-alive',长连接
  • 思考:HTTP/1.0如何建立长连接,协议'不一致'场景
  • http协议中connection头的作用

    ConnectionRFC解释

    ④了解ntlm即可

    使用NTLM的windows身份验证的nginx反向代理

    优点:实现nginx代理ntlm验证,'无需lua编码'或使用商业版nginxplus

    三高级技巧

  • 说明:关于'upstream'中的'keepalive'指令不再赘述
  • 备注:只列出两个'核心'配置
  • 核心:客户端自定义'请求头',决定'是否使用'长连接
  • 浏览器提供的开发者工具通过ConnectionID判断是否是长连接

    tcpdump查看Nginx长连接还是短连接

    长连接和端连接的应用场景

    nginx与tomcat、client之间请求的长连接配置不一致问题解决查看连接过程中socket状态

    四案例

    ①现象

    说明:'具体复现'后续有时间了再'重现'

    nginx分发请求错误日志报错upstreamsentinvalidchunkedresponsewhilereadingupstream

    ②解决策略

  • 背景:'nginx和upstream'之间通信,'nginx侧'未配置'长连接'导致
  • location中'设置如下'即可
  • proxy_http_version1.1;#设置http版本为1.1
  • proxy_set_headerConnection"";#设置Connection为长连接
  • ③chunk分片传输原理

    client知道响应体大小的三种方式

    ④nginx的chunk模块

  • 一个是'内置的ngx_http_chunked_filter_module',是一个filter的模块,是'默认编译'进去的
  • 1)必须是'开启长连接'的HTTP/1.1
  • 2)请求和响应双方必须'同时存在'该头
  • 其它参考

    ⑤nginx关闭chunked

  • '取消掉Transfer-Encoding:chunked'
  • 方式1:'不让'服务器"这里特指nginx的后端服务器"返回Transfer-Encoding:chunked,在客户端"nginx端"请求的时候可以'使用http1.0'的协议。
  • 方式2:'nginx侧'-->chunked_transfer_encodingoff;
  • 发表评论

    • 评论列表
    还没有人评论,快来抢沙发吧~