翼度科技»论坛 编程开发 .net 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

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

1.问题场景

提问:为什么我部署的服务没有流式响应
最近在重构原有的GPT项目时,遇到gpt回答速度很慢的现象。在使用流式输出的接口时,接口响应速度居然还是达到了30s以上。
2.现象分析

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

起初

因为新的重构项目中用MASA 的minimalAPI代替了传统的MVC。所以在接口实现上跟之前有所不同,在对Stream流的处理方式上也有不同。我以为是我处理的方式不对,为此,我的代码做过多次改进。最终的接口如下:
  1. /// <summary>
  2. /// 聊天接口(gpt-4)返回流
  3. /// </summary>
  4. /// <param name="req"></param>
  5. /// <returns></returns>
  6. [Authorize]
  7. [Produces("application/octet-stream")]
  8. public async Task ChatCompletionStream(ChatReq req, CancellationToken cancellationToken = default)
  9. {
  10.     if (_httpContextAccessor.HttpContext?.Items["key"] != null)
  11.     {
  12.         req.Key = _httpContextAccessor.HttpContext?.Items["key"]?.ToString();
  13.     }
  14.     _logger.Information($"ChatStream1开始时间:{DateTime.Now},key【{req.Key}】");
  15.     var userId = long.Parse(_httpContextAccessor.HttpContext.User.FindFirstValue(ClaimTypes.UserData));
  16.     req.UserId = userId;
  17.     req.IP = _httpContextAccessor.HttpContext?.Connection.RemoteIpAddress?.MapToIPv4().ToString();
  18.     var response = _httpContextAccessor.HttpContext.Response;
  19.     response.ContentType = "application/octet-stream";
  20.     var enumerable = _chatService.ChatCompletionStream(req);
  21.     await foreach (var item in enumerable)
  22.     {
  23.         var bytes = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(item, new JsonSerializerOptions()
  24.         {
  25.             Encoder = JavaScriptEncoder.Create(UnicodeRanges.All)
  26.         }) + "\n");
  27.         await response.BodyWriter.WriteAsync(bytes);
  28.     }
  29.     _logger.Information($"ChatStream1结束时间:{DateTime.Now}");
  30. }
复制代码
后来

在优化代码后,本地速度提升明显。但是在服务器上速度任然不理想。让我怀疑,是不是代码问题?难道是别的问题。
与此同时,昨天,我的搭档同样向我抛出了这个问题:“聊天的接口好慢”
我说出了两种可能:1.代码,是minimalAPI的锅。2.网络,我们的服务部署在自己的服务器上,然后通过内网映射,又通过反向代理调用的OpenAI的接口,网络复杂,造成了速度慢。
最后发现问题

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

如果你使用 ngnix 反向代理,需要在配置文件中增加下列代码:
  1. \# 不缓存,支持流式输出
  2. proxy_cache off;  # 关闭缓存
  3. proxy_buffering off;  # 关闭代理缓冲
  4. chunked_transfer_encoding on;  # 开启分块传输编码
  5. tcp_nopush on;  # 开启TCP NOPUSH选项,禁止Nagle算法
  6. tcp_nodelay on;  # 开启TCP NODELAY选项,禁止延迟ACK算法
  7. 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

来源:https://www.cnblogs.com/raok/archive/2023/08/15/17631549.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具