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. Django4全栈进阶之路15 项目实战(用户管理):login.html登录画面设计

    要编写登录页面,我们需要完成以下步骤: template文件夹中创建 login.html 模板文件,输入以下 HTML 代码: {% extends 'base.html' %} {% block ...

  2. django model字段类型

    1.models.AutoField 自增列=int(11) 如果没有的话,默认会生成一个名称为id的列,如果要显示的定义一个自增列,必须把该列设置为主键(primary_key=True)2.mod ...

  3. 【HDU】1312 Red andBlack (DFS&BFS经典好题)

    Red and Black 题目 我是题目链接 题解 找出所能到达的所有黑色的数量,用DFS和BFS均可. BFS: #include <iostream> #include <qu ...

  4. web自动化01-环境搭建

    1.自动化测试是什么? 借助工具实现 借助代码编写脚本实现  2.自动化测试需要掌握那些? web自动化测试基础 移动端自动化基础 pytest自动化测试框架 po设计模式 数据驱动 日志模块使用 自 ...

  5. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-1-环境准备与搭建

    1.简介 有很多人私信留言宏哥问能不能介绍一下Playwright这款自动化神器的相关知识,现在网上的资料太少了.其实在各大博客和公众号也看到过其相关的介绍和讲解.要不就是不全面.不系统,要不就是系统 ...

  6. RocketMQ 顺序消费机制

    顺序消息是指对于一个指定的 Topic ,消息严格按照先进先出(FIFO)的原则进行消息发布和消费,即先发布的消息先消费,后发布的消息后消费. 顺序消息分为分区顺序消息和全局顺序消息. 1.分区顺序消 ...

  7. Vue——前端发展史、Vue介绍和使用、插值语法、文本指令、事件指令

    前端的发展史 # 1 HTML(5).CSS(3).JavaScript(ES5.ES6):编写一个个的页面 -> 给后端(PHP.Python.Go.Java) -> 后端嵌入模板语法 ...

  8. 【Azure K8S】AKS升级 Kubernetes version 失败问题的分析与解决

    问题描述 创建Azure Kubernetes Service服务后,需要升级AKS集群的 kubernetes version.在AKS页面的 Cluster configuration 页面中,选 ...

  9. 没用,随便写的(Dec_8_2022)

    import numpy as np from PIL import Image import pandas as pd import matplotlib.pyplot as plt # 第一个 # ...

  10. Centos7安装配置Hive

    Centos7安装配置 一 . 安装 安装就不多做详述,选择好自己的镜像设置好路径即可 二 .配置 2.1 网络配置 桌面右键进入 cmd 命令编辑窗口,在 Linux 中设置网络的相关配置都需要管理 ...