Nginx反向代理服务流式输出设置

nginx,反向,代理服务,流式,输出,设置 · 浏览次数 : 242

小编点评

**问题:** 由于您使用的是Nginx反向代理服务,设置流式输出时可能出现以下问题: 1. **缓存问题:**由于Nginx缓存设置可能导致响应被缓存,导致流式输出无法进行。 2. **网络协议问题:**由于您使用的是内网映射和反向代理,网络协议可能出现兼容性问题,导致响应延迟。 3. **代理服务器设置问题:**您可能设置的代理服务器设置不当,导致无法进行流式输出。 **解决方案:** **1. 分析缓存问题:** * 使用 `ngrep` 命令测试代理服务器和 OpenAI API的响应时间。 * 确保代理服务器支持流式输出并设置 appropriate缓存时间。 **2. 分析网络协议问题:** * 确保您的代理服务器支持 HTTP 1.1 和 TCP 协议。 * 尝试使用 `tcpdump` 或其他网络调试工具分析网络流量。 **3. 分析代理服务器设置问题:** * 检查代理服务器的日志文件,以了解设置是否正确。 * 确保您使用的代理服务器支持流式输出。 * 使用 `ngrep` 或其他代理监控工具测试代理服务器的设置。 **4. 建议解决方案:** * **使用代理服务器:**如果您能,请使用代理服务器将您的代理地址与 OpenAI API 的 IP 地址关联起来。 * **使用 HTTP 1.1:**确保您的代理服务器支持 HTTP 1.1,以确保流式输出正常。 * **优化代理服务器设置:**例如,设置适当的缓存时间和缓冲大小。 * **测试网络性能:**确保您的代理服务器能够提供足够的高性能网络连接。 * **检查日志记录:**确保您能够正常获得响应并检查代理服务器和 OpenAI API 的日志记录。

正文

Nginx反向代理服务流式输出设置

1.问题场景

提问:为什么我部署的服务没有流式响应

最近在重构原有的GPT项目时,遇到gpt回答速度很慢的现象。在使用流式输出的接口时,接口响应速度居然还是达到了30s以上。

2.现象分析

分析现象我发现,虽然前端还是流式打印的结果,但是,好像是接口处理完了,再以流式返回到的前端。

3.解决过程记录

起初

因为新的重构项目中用MASA 的minimalAPI代替了传统的MVC。所以在接口实现上跟之前有所不同,在对Stream流的处理方式上也有不同。我以为是我处理的方式不对,为此,我的代码做过多次改进。最终的接口如下:

/// <summary>
/// 聊天接口(gpt-4)返回流
/// </summary>
/// <param name="req"></param>
/// <returns></returns>
[Authorize]
[Produces("application/octet-stream")]
public async Task ChatCompletionStream(ChatReq req, CancellationToken cancellationToken = default)
{
    if (_httpContextAccessor.HttpContext?.Items["key"] != null)
    {
        req.Key = _httpContextAccessor.HttpContext?.Items["key"]?.ToString();
    }
    _logger.Information($"ChatStream1开始时间:{DateTime.Now},key【{req.Key}】");
    var userId = long.Parse(_httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.UserData));
    req.UserId = userId;
    req.IP = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress?.MapToIPv4().ToString();
    var response = _httpContextAccessor.HttpContext.Response;
    response.ContentType = "application/octet-stream";
    var enumerable = _chatService.ChatCompletionStream(req);
    await foreach (var item in enumerable)
    {
        var bytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(item, new JsonSerializerOptions()
        {
            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
        }) + "\n");
        await response.BodyWriter.WriteAsync(bytes);
    }
    _logger.Information($"ChatStream1结束时间:{DateTime.Now}");
}

后来

在优化代码后,本地速度提升明显。但是在服务器上速度任然不理想。让我怀疑,是不是代码问题?难道是别的问题。

与此同时,昨天,我的搭档同样向我抛出了这个问题:“聊天的接口好慢”

我说出了两种可能:1.代码,是minimalAPI的锅。2.网络,我们的服务部署在自己的服务器上,然后通过内网映射,又通过反向代理调用的OpenAI的接口,网络复杂,造成了速度慢。

最后发现问题

今天,我想到问题所在,我们的反向代理服务,是通过nginx做了反向代理的,之前我们解决过后端服务的nginx反向代理设置流式传输的问题。问题就在这里。对应的yarn服务的nginx配置同样需要设置流式传输。

2.解决问题的方法

如果你使用 ngnix 反向代理,需要在配置文件中增加下列代码:

\# 不缓存,支持流式输出

proxy_cache off;  # 关闭缓存

proxy_buffering off;  # 关闭代理缓冲

chunked_transfer_encoding on;  # 开启分块传输编码

tcp_nopush on;  # 开启TCP NOPUSH选项,禁止Nagle算法

tcp_nodelay on;  # 开启TCP NODELAY选项,禁止延迟ACK算法

keepalive_timeout 300;  # 设定keep-alive超时时间为65秒

3 什么是代理,如何使用?

由于 OpenAI 的 IP 限制,中国和其他一些国家/地区无法直接连接 OpenAI API,需要通过代理。你可以使用代理服务器(正向代理),或者已经设置好的 OpenAI API 反向代理。

- 正向代理例子:梯子。docker 部署的情况下,设置环境变量 HTTP_PROXY 为你的代理地址(例如:10.10.10.10:8002)。

- 反向代理例子:可以用别人搭建的代理地址,或者通过 Cloudflare 免费设置。设置项目环境变量 BASE_URL 为你的代理地址。

4.搭建反向代理服务

yarn 服务反向代理GPT部署方案:yarn 反向代理

阅读如遇样式问题,请前往个人博客浏览: https://www.raokun.top

拥抱ChatGPT:https://chat111.terramours.site

开源项目地址:https://github.com/raokun/YarpProject

与Nginx反向代理服务流式输出设置相似的内容:

Nginx反向代理服务流式输出设置

# Nginx反向代理服务流式输出设置 # 1.问题场景 提问:为什么我部署的服务没有流式响应 最近在重构原有的GPT项目时,遇到gpt回答速度很慢的现象。在使用流式输出的接口时,接口响应速度居然还是达到了30s以上。 # 2.现象分析 分析现象我发现,虽然前端还是流式打印的结果,但是,好像是接口处

[转帖]关于nginx 反向代理upstream中的 keepalive配置

一、关于nginx upstream 在nginx的模块中,分为3种类型,分别是handler,filter和upstream,其中upstream可以看做一种特殊的handler,它主要用来实现和后端另外的服务器进行通信,由于在nginx中全部都是使用非阻塞,并且是一个流式的处理,所以upstre

[转帖]【官方文档】Nginx负载均衡学习笔记(三) TCP和UDP负载平衡官方参考文档

本章介绍如何使用NGINX Plus和NGINX开放源代理和负载平衡TCP和UDP流量。 目录 介绍先决条件配置反向代理配置TCP或UDP负载平衡被动健康监控 选择负载平衡方法配置会话持久性 主动健康监控 怎么运行的先决条件基本配置微调健康检查使用匹配配置块进行微调健康检查 TCP的微调健康检查UD

[转帖]Traefik中诡异的502和504问题

https://zhuanlan.zhihu.com/p/156138704 我们都知道在 Kubernetes 集群中通常会使用 Ingress 方案来统一代理集群内部的流量,而常用的 Ingress 方案为 traefik 和 nginx,和传统的 Nginx 作为企业内部的反向代理以及负载设备

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

[转帖]nginx 反向代理 URL替换方案

nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案。 1.直接替换location 匹配部分 1.proxy_pass的目标地址,默认不带/,表示只代理域名,url和参数部分不会变(把请求的path拼

性能提升-如何设置Windows操作系统TIME_WAIT状态的TCP连接快速回收时间?

大规模Windows环境下,采用Nginx反向代理服务后,操作系统会产生较多TIME_WAIT的TCP(Transmission Control Protocol)连接,操作系统默认TIME_WAIT的TCP连接回收时间是4分钟,TCP默认动态端口范围为开始端口49152,结束端口65535。这样会

Nginx性能调优5招35式不可不知的策略实战

Nginx是一个高性能的HTTP和反向代理服务器,它在全球范围内被广泛使用,因其高性能、稳定性、丰富的功能以及低资源消耗而受到青睐。今天V哥从5个方面来介绍 Nginx 性能调优的具体策略,希望对兄弟们有帮助,废话不多说,马上开整。 1. 系统层面: 调整内核参数:例如,增加系统文件描述符的限制、T

Nginx命令(查询nginx配置文件)

Nginx命令(查询nginx配置文件) Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。 Nginx常用命令 1.查看Ngin

[转帖]从零开始学nginx

1. nginx简介 nginx(发音同engine x)是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like协议下发行。 nginx由俄罗斯的程序设计师Igor Sysoev所开发,最初供俄国大型的入口网站及搜寻引擎Rambler使用。 第