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反向代理服务流式输出设置的更多相关文章

  1. HttpURLConnection的流式输出的缺陷和解决方法

    转自:http://www.mzone.cc/article/198.html 最近在用applet写文件上传控件的时候发现使用URLConnection来对服务器进行流式输出时的一些问题.我们通常要 ...

  2. 文件下载(StreamingHttpResponse流式输出)

    文件下载(StreamingHttpResponse流式输出) HttpResponse会直接使用迭代器对象,将迭代器对象的内容存储成字符串,然后返回给客户端,同时释放内存.可以当文件变大看出这是一个 ...

  3. nginx反向代理-后端服务器组设置

    nginx服务器的反向代理时其最常用的重要功能之一,在实际工作中应用广泛,涉及的配置指令也比较多.下面会尽量详细地介绍对应的指令,及其使用状态. 反向代理一般是互联网需要向内网拉取资源,比如访问一个w ...

  4. 11、Nginx反向代理服务

    1Nginx代理服务基本概述 1.代理一词并不陌生, 该服务我们常常用到如(代理理财.代理租房.代理收货等等),如下图所示 2.在没有代理模式的情况下,客户端和Nginx服务端,都是客户端直接请求服务 ...

  5. nginx 反向代理服务

    目录 Nginx代理服务基本概述 Nginx代理服务常见模式 Nginx代理服务支持协议 Nginx反向代理配置语法 Nginx反向代理场景实践 配置代理实战 在lb01上安装nginx Nginx代 ...

  6. Linux 部署Nginx反向代理服务 使用openssl自生成证书并配置https

    1.安装Nginx编译所依赖的包 正常centos中可以使用yum安装一下依赖包: yum install -y gcc gcc-c++ pcre pcre-devel zlib zlib-devel ...

  7. 动态PHP电商网站伪静态的 Nginx反向代理Cache缓存终极设置

    转自: http://www.ttlsa.com/nginx/dynamic-php-nginx-cache/

  8. DJANGO的HTTPRESPONSE流式输出

    在项目当中遇到的问题,网上有样例代码,但都不行,后来,发现在了1.5版本之后,新的STREAMHTTPRESPONSE对象, 搞定. from django.http import HttpRespo ...

  9. Openresty的同步输出与流式响应

    Openresty的同步输出与流式响应 默认情况下, ngx.say和ngx.print都是异步输出的,先来看一个例子: location /test { content_by_lua_block { ...

  10. Nginx反向代理部署指南

    一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...

随机推荐

  1. 2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子。 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子。 如果剩余橘子数 n 能被

    2022-04-29:厨房里总共有 n 个橘子,你决定每一天选择如下方式之一吃这些橘子: 吃掉一个橘子. 如果剩余橘子数 n 能被 2 整除,那么你可以吃掉 n/2 个橘子. 如果剩余橘子数 n 能被 ...

  2. 2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754。

    2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754.给定一个整数num,判断它是不是某个数的step sum? 福大大 答案2021 ...

  3. IBM小型机 - 检测码:B150B10C,设备卡住不运行

    检测码:B150B10C 问题 开机后,出现检测码:B150B10C,然后就卡在这里不动,无法进行下一步: 这里的错误码表示--机器的内存控制模块被deconfig(取消配置): 解决方法 登录cel ...

  4. vue全家桶进阶之路37:Vue3 路由守卫

    在 Vue.js 3.x 中,我们可以使用路由守卫来拦截路由的跳转,从而实现一些功能,例如:登录验证.页面权限控制等. Vue.js 3.x 中的路由守卫和 Vue.js 2.x 中的基本相同,都包含 ...

  5. [Docker] Docker之安装Nginx

    0 序言 略 1 安装步骤 Step1 下载镜像 搜素.下载镜像 https://hub.docker.com/_/nginx?tab=tags 这里选择官方镜像1.22.0版本 docker sea ...

  6. 驱动开发:内核解析PE结构导出表

    在笔者的上一篇文章<驱动开发:内核特征码扫描PE代码段>中LyShark带大家通过封装好的LySharkToolsUtilKernelBase函数实现了动态获取内核模块基址,并通过ntim ...

  7. 利用APIFOX对ABAP函数进行调用

    1.安装APIFOX,当然也可以使用在线版,无需下载 官网地址:https://apifox.com/ 2.新建项目 3.为项目起一个名称,为相关开发测试人员授权 4.在根目录新增子目录 5.编辑开发 ...

  8. logging 模块因权限问题写入日志失败

    哈喽大家好,我是咸鱼 今天跟大家分享一个使用 Python 的 logging 模块写入日志文件时遇到的权限问题,不知道你们有没有遇到过 1.案例现象 今天上班的时候手机短信收到了 zabbix 告警 ...

  9. 生物信息培训之WGCNA-权重基因共表达网络分析

    本文分享自微信公众号 - 生信科技爱好者(bioitee).如有侵权,请联系 support@oschina.cn 删除.本文参与"OSC源创计划",欢迎正在阅读的你也加入,一起分 ...

  10. [Kotlin Tutorials 22] 协程中的异常处理

    协程中的异常处理 Parent-Child关系 如果一个coroutine抛出了异常, 它将会把这个exception向上抛给它的parent, 它的parent会做以下三件事情: 取消其他所有的ch ...