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

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


http://www.kler.cn/a/598595.html

相关文章:

  • Sqoop 常用命令
  • LeetCode(27):移除元素
  • mybatis操作数据库报错Cause: Cannot find class: ${com.mysql.cj.jdbc.Driver}
  • sgpt 终端使用指南
  • python每日十题(6)
  • 贪心算法(9)(java)最优除法
  • 深入解析 Redis 实现分布式锁的最佳实践
  • 基于Spring Boot的二手物品交易管理系统的设计与实现(LW+源码+讲解)
  • 无人机动平衡-如何在螺旋桨上添加或移除材料
  • 2025年优化算法:龙卷风优化算法(Tornado optimizer with Coriolis force,TOC)
  • 常见中间件漏洞攻略-Jboss篇
  • 社群输出价值重构:AI技术驱动的持续内容生产体系研究
  • 蓝桥杯单片机刷题——串口发送显示
  • Java设计模式之备忘录模式
  • Linux 常用命令 - last 【显示历史登录用户列表】
  • 使用Docker运行 Ollama本地部署 DeepSeek 模型并用Dify实现可视化操作
  • Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础03
  • 音视频学习(三十):fmp4
  • Shell正则表达式
  • fastapi+playwright爬取google搜索1-3页的关键词返回json