【ChatGLM2-6B】nginx转发配置

背景

好不容易把ChatGLM2-6B大语言模型部署好了,使用streamlit方式启动起来了,终于可以愉快的玩耍了,然后想着申请一个域名,使用HTTPS协议访问,但实践过程中,发现这个大语言模型的nginx转发配置还是有点小小的与众不同,折腾了半天,终于研究出来了。如何在只有CPU的Linux服务器上部署ChatGLM2-6B,可以参考这篇文章

先请教下ChatGLM2这个问题

不错,回答的很是专业,使用这个配置还是有点用,但并不能解决所有问题。可能会出现如下几个错误

ERR_INCOMPLETE_CHUNKED_ENCODING

在请求/static/js/main.ccfdda4f.js这个js文件的时候,可能会报ERR_INCOMPLETE_CHUNKED_ENCODING错误,这是因为main.ccfdda4f.js这个js文件有1.1M,nginx的缓冲区不够用,需要修改nginx缓冲区设置

text 复制代码
location / {
    proxy_pass http://LLM;

    # main.ccfdda4f.js文件有1.1M,需要修改缓冲区大小
    proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
    proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的设置
    proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2)
    proxy_temp_file_write_size 2048k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
}

websocket报403错误

查看/_stcore/stream请求,是与大模型建立websocket连接,错误信息大致如下
failed: Error during WebSocket handshake: Unexpected response code: 403,但如果使用80或443端口,则不会报这个错,只要是非80和443就会报这个错,根本原因是nginx转发的时候必须设置Host和Origin请求头,并且值还要一样

text 复制代码
    location /_stcore/stream {
        proxy_pass http://LLM;

        # websocket配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_cache_bypass $http_upgrade;
        # Host与Origin必须设置,并且Host的值与Origin的值//后面的部分必须一致
        proxy_set_header Host "$http_host";
        proxy_set_header Origin "$scheme://$http_host";
    }
  • 这里使用 h t t p h o s t 比 http_host比 httphost比host更准确
  • 经过实测,只要Host和Origin请求头$http_host部分的值相同就可以成功转发,即使随便写一个值,只要相同也可以成功转发

关于nginx中$host、$http_host、$proxy_host的区别

变量 是否显示端口 值
$host 不显示端口 浏览器请求的ip,不显示端口
$http_host 端口存在则显示 浏览器请求的ip和端口号
$proxy_host 默认80端口不显示,其它显示 被代理服务的ip和端口号

完整的nginx配置如下

text 复制代码
upstream LLM {
    server 127.0.0.1:8501;
}

server {
    listen       30443 ssl;
    listen       443 ssl;
    listen       80;
    server_name  chatglm.xxx.cn;

    ssl_certificate /etc/nginx/ssl/chatglm.xxx.cn.pem;
    ssl_certificate_key /etc/nginx/ssl/chatglm.xxx.cn.key;

    location / {
        proxy_pass http://LLM;

        # main.ccfdda4f.js文件有1.1M,需要修改缓冲区大小
        proxy_buffer_size 1024k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers 16 1024k; #proxy_buffers缓冲区,网页平均在32k以下的设置
        proxy_busy_buffers_size 2048k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 2048k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }

    location /_stcore/stream {
        proxy_pass http://LLM;

        # websocket配置
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_cache_bypass $http_upgrade;
        # Host与Origin必须设置,并且Host的值与Origin的值//后面的部分必须一致
        proxy_set_header Host "$http_host";
        proxy_set_header Origin "$scheme://$http_host";
    }
}

总结

  • 以上是一步一步摸索出来的,研究成果来之不易
  • 任何看似简单的东西,动手实践后,才能理解的更加深刻
  • 终于对ChatGLM2-6B有了一定的了解,还会继续对大语言模型进行训练和微调,与君共勉
相关推荐
回眸&啤酒鸭20 分钟前
【回眸】自动化白盒测试落地实战指南
运维·自动化·log4j
闲云野鹤在人间1 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
资料库012 小时前
Linux 8个常见运维故障排查
java·linux·运维
Knight_AL3 小时前
基于 Netty 实现的 WebSocket 服务端
网络·websocket·网络协议
机核研创社3 小时前
睡裤明橡筋自动化选型指南与落地四步走
运维·自动化
志栋智能3 小时前
超自动化运维,告别复杂系统的新范式
运维·自动化
零基础1233 小时前
Ubuntu 常用命令汇总
linux·运维·开发语言
Android系统攻城狮3 小时前
Linux Gstreamer深度解析之gst_audio_sink_get_type调用流程与实战(六十五)
linux·运维·服务器·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
云贝贝贝5 小时前
PostgreSQL 分区表:从设计到运维,大表不再卡
运维·数据库·postgresql
fengkai45456 小时前
十二、Redis -1
运维·数据库·redis