当前位置: 首页 > news >正文

nginx配置https域名后,代理后端服务器流式接口变慢

目录

  • 问题描述
    • 原因
    • 解决办法

问题描述

使用nginx配置域名和https的ssl证书后,代理后端web服务器,发现流式接口比原来直接用服务器外部ip+后端web服务器端口变慢了很多。

原因

在于 HTTP 和 HTTPS 在 Nginx 代理中的处理方式不同。以下几点解释了为什么 HTTP 请求可以正常响应,而 HTTPS 请求在没有关闭 proxy_buffering 时表现出卡顿的现象。

  1. Nginx 代理行为差异:

HTTP:在 HTTP 请求中,Nginx 默认会使用缓冲机制,但由于 HTTP 请求本身并不涉及加密和解密,数据的传输和处理通常比较快,即使启用了 proxy_buffering,只要后端响应速度快,客户端也不会明显感受到延迟。Nginx 能够较快速地将缓冲的数据传递给客户端,因此你感受不到 HTTP 请求的卡顿。
HTTPS:HTTPS 请求涉及加密、解密过程,Nginx 需要处理 SSL/TLS 协议,导致响应的数据经过更多处理环节。在这种情况下,proxy_buffering 缓冲机制可能会导致 Nginx 等待完整的响应数据块,再将其推送到客户端,增加了数据传输的延迟感,尤其在流式数据的场景中更明显。

  1. 缓冲的作用:

proxy_buffering 的默认行为:Nginx 默认会缓冲来自后端服务器的响应数据,缓冲满了之后再一次性发送到客户端。对于 HTTP 请求,数据包小而且无需解密,Nginx 处理较为快速,通常不会影响用户体验。
HTTPS 的复杂性:在 HTTPS 情况下,由于涉及加密和较大的数据包,Nginx 可能需要更长的时间来处理响应。而当启用缓冲时,Nginx 会先缓冲较大的数据块,再推送到客户端,这使得 HTTPS 的流式响应延迟更为明显。关闭 proxy_buffering 后,Nginx 可以直接将流式数据传递给客户端,无需等待缓冲区填满。

  1. 流式传输的需求:

流式响应要求数据能够即时从后端传递给前端,而不是经过代理服务器的缓冲。对于流式传输来说,proxy_buffering 可能会阻碍这种即时时性。HTTP 由于传输开销小,能承受一定的缓冲延迟,而 HTTPS 的加密过程放大了这个问题。

  1. 数据包大小和网络开销:

HTTPS 请求的每个数据包相对更大,因为它包含了加密后的数据。Nginx 可能需要缓冲这些较大的数据包,而一旦 Nginx 使用 proxy_buffering 进行缓冲处理,这种额外的等待时间会被放大。而 HTTP 请求没有这种加密开销,响应更快。

总结:
简单来说,HTTPS 请求的流式响应之所以卡顿,主要是因为:

数据包更大:HTTPS 请求的数据包经过加密后确实比 HTTP 大一些,加密增加了开销。
缓冲机制的影响:在 HTTPS 请求中,Nginx 的缓冲机制需要更多时间来处理这些加密的数据包,导致延迟。相比之下,HTTP 没有加密开销,即使启用缓冲,数据传输也相对流畅。

因此,同样的请求,HTTPS 因为加密、数据包较大,加上 Nginx 的缓冲,导致流式响应出现卡顿。关闭 proxy_buffering 后,Nginx 不再等待缓冲区填满,而是直接传输数据,HTTPS 响应也就变得流畅了。

解决办法

综上的原因,直接关闭nginx代理https的缓冲就好了

location /streaming_path {
    proxy_pass http://backend_service;
    proxy_buffering off;  # 关闭代理缓冲,确保流式传输
}

为了更好的避免因https的原因造成流式接口响应速度变慢,最终决定直接用外网ip+后端服务器端口号的形式,绕过nginx反向代理,直接访问后端接口。

参考文章:https://juejin.cn/post/7417521775586770995

相关文章:

  • Kubernetes的Replica Set和ReplicaController有什么区别
  • 计划管理工具应该具备的能(甘特图)
  • Qt高分屏自适应
  • 框架的CVE漏洞利用 php类 java类 手工操作和自动化操作蓝队分析漏洞利用的流量特征
  • Python网络编程入门
  • 【测试篇】关于自动化测试前言,自动化测试的基本概念
  • 每日学习总结
  • 前端常见面试题(不断更新版)
  • Linux部署若依前后端分离版
  • 【yolo】yolo推理报错,以及解决方案
  • 数字化转型驱动卫生用品安全革新
  • 从零开始实现 C++ TinyWebServer 数据库连接池 SqlConnectPool详解
  • 第5节:AWK环境准备
  • 新增菜品-03.代码开发2
  • 在Windows和Linux系统上的Docker环境中使用的镜像是否相同
  • C++函数与STL
  • 区块链交易
  • [AI速读]用脚本加速高速链路验证:一个高效覆盖率收敛方案
  • 【Tips】Vim文档的使用
  • mysql 对json的处理?
  • AI智能体,是不是可以慢一点? | ToB产业观察
  • 戴维·珀杜宣誓就任美国驻华大使
  • 这个五月,有三部纪录电影值得一看
  • 建筑瞭望|融入自然的新泳池,治愈了中央公园的历史旧伤
  • 上海虹桥高铁站拦门事件反转,谁在带偏网友?
  • 丁薛祥在学习《习近平经济文选》第一卷专题研讨班上强调:深入学习贯彻习近平经济思想,加强党中央对经济工作的集中统一领导