资讯动态

云服务器部署大模型推理服务:反向代理与公网鉴权实战

发布时间:2026/10/20 9:06:14 来源:尧图企业网站定制
1. 项目缘起与整体设计思路1.1 为什么要在云服务器上部署大模型推理服务把大模型跑在自己的云服务器上这件事在两年前还属于“有钱有闲的团队才折腾”的范畴但到了现在一台带独立显卡的云主机按小时计费成本已经压到很多人能接受的范围。我这次要做的就是把一个开源大模型推理服务完整地部署到一台公网云服务器上并且加上一层鉴权让外部请求必须携带合法凭证才能访问。先说清楚这个项目到底解决什么问题。很多人在本地跑模型图的是方便但本地机器有几个绕不开的痛点一是显卡显存有限跑不了参数量稍大的模型二是本地环境一旦关机服务就断了没法给其他人用三是本地网络环境复杂想让外部程序调用几乎不可能。而云服务器恰好能补上这三块短板——按需选配显卡、7×24小时在线、自带公网地址。这个项目适合谁参考我认为有三类人第一类是想把模型能力开放给自己其他项目调用的独立开发者第二类是需要给团队内部提供统一推理入口的技术负责人第三类是想学习服务部署与鉴权完整链路的运维或后端同学。哪怕你之前没接触过云服务器只要跟着流程走也能把整套东西跑起来。1.2 整体架构与关键选型考量在动手之前我先把整体架构在脑子里过了一遍。整个链路其实不复杂云服务器作为载体模型推理服务作为核心反向代理作为流量入口鉴权层作为安全闸门。这四层各司其职缺一不可。为什么需要反向代理因为推理服务本身通常只监听本地端口直接暴露到公网既不安全也不方便管理。反向代理可以做统一入口、统一鉴权、统一日志还能顺便处理跨域、限流这些事情。我选的是业界最常用的那套组合稳定性和资料丰富度都经过验证。为什么鉴权要放在代理层而不是应用层这是个很实际的问题。如果把鉴权做在推理服务内部一旦服务本身有漏洞或者配置失误鉴权就可能被绕过。而放在代理层所有流量必须先过这道关卡推理服务只接受来自本机的请求攻击面一下子缩小很多。这个思路和“把门卫放在大门口而不是每个房间门口”是一个道理。关于模型服务本身我选择的是社区里讨论度比较高的一个开源推理框架它对显存的利用比较友好支持量化加载部署文档也相对完整。这里要提醒一句不同框架对显卡驱动、CUDA版本的要求差异很大选型时一定要先确认自己的云主机环境是否匹配否则后面会踩很多坑。提示架构设计阶段多花十分钟想清楚数据流向比部署阶段花两小时排查问题划算得多。建议先在纸上画出“客户端→公网IP→代理→推理服务→显卡”这条链路标出每一层的端口和协议。2. 云服务器环境准备与核心细节解析2.1 云主机选型与系统初始化选云主机这件事核心就看三个指标显卡型号与显存、CPU与内存配比、磁盘类型与容量。显存直接决定你能跑多大的模型这是硬约束。以我这次的经验如果打算跑7B量级的模型并且用4bit量化8GB显存是底线16GB会比较从容如果要跑13B以上建议直接上24GB显存的卡。CPU和内存容易被忽视。很多人以为推理全靠显卡CPU随便选就行但实际上数据预处理、请求调度、代理转发都要吃CPU。我的建议是CPU核心数不低于4核内存不低于显存的1.5倍。磁盘方面一定要选SSD模型文件动辄几个GB到几十GB机械盘加载会让你等到怀疑人生。容量上系统盘之外最好再挂一块数据盘专门放模型方便后续迁移和备份。系统我选的是主流的Linux发行版版本不要太新也不要太旧选一个长期支持版本最稳妥。初始化的时候有几件事必须做更新系统包、安装基础工具编译工具、下载工具、文本编辑器、配置时区、创建非root的日常操作用户。这几步看起来琐碎但能避免后面很多权限相关的麻烦。# 更新系统包索引并升级 sudo apt update sudo apt upgrade -y # 安装常用基础工具 sudo apt install -y build-essential curl wget git vim htop # 设置时区 sudo timedatectl set-timezone Asia/Shanghai # 创建日常操作用户 sudo adduser deployer sudo usermod -aG sudo deployer2.2 显卡驱动与运行环境搭建显卡驱动是整个部署里最容易出问题的环节没有之一。我踩过的坑包括驱动版本和CUDA版本不匹配、系统内核更新后驱动失效、多版本CUDA共存导致路径混乱。所以这一步我建议按“先确认显卡型号→查官方兼容矩阵→装驱动→验证→再装运行时”的顺序来不要跳步。先确认显卡是否被系统识别lspci | grep -i nvidia如果这条命令没有任何输出说明显卡没被识别可能是云主机没正确挂载显卡需要先在控制台确认显卡已经绑定到这台实例。识别到之后去官方文档查清楚这张卡支持的驱动版本范围然后安装对应驱动。安装完成后用下面这条命令验证nvidia-smi这条命令会输出显卡型号、驱动版本、显存占用等信息。如果能看到这些说明驱动没问题。接下来是CUDA运行时和推理框架需要的其他依赖。这里有个经验不要盲目装最新版CUDA一定要看推理框架官方文档推荐的版本装错版本后面加载模型时会报各种奇怪的错误。注意显卡驱动安装后如果提示需要重启一定要重启。我见过有人跳过重启直接装CUDA结果运行时找不到设备排查了半天才发现是驱动没生效。2.3 推理框架的安装与模型准备推理框架的安装方式通常有两种pip直接装和源码编译。pip装省事但可能不是最新版源码编译麻烦但能针对自己的硬件做优化。我这次先用pip装跑通之后再考虑要不要编译优化。# 创建独立的Python虚拟环境避免污染系统环境 python3 -m venv /opt/llm-env source /opt/llm-env/bin/activate # 安装推理框架具体包名以官方文档为准 pip install --upgrade pip pip install 推理框架包名模型文件的准备有两种途径从官方模型仓库下载或者用转换工具把其他格式的模型转过来。下载大文件时建议用支持断点续传的工具并且放到数据盘而不是系统盘。模型目录结构要提前规划好我习惯按“模型名/版本/量化方式”三级目录来放这样以后模型多了也不会乱。# 创建模型存放目录 mkdir -p /data/models/模型名/版本 # 下载模型文件示例具体地址以官方为准 cd /data/models/模型名/版本 wget -c 模型下载地址下载完成后要校验文件完整性通常官方会提供校验值对一下再往下走。模型加载测试可以用框架自带的命令行工具先确认模型能正常加载并输出结果再去配置服务化。3. 服务化部署与公网鉴权实操3.1 推理服务的启动与参数调优模型能加载之后下一步是把它变成一个常驻服务。推理框架一般会提供一个服务启动命令核心参数包括监听地址、监听端口、模型路径、显存占用比例、最大并发数、最大输入长度。监听地址这里有个关键点服务本身只监听127.0.0.1不要监听0.0.0.0。因为我们要通过反向代理来暴露服务推理服务只需要接受本机请求即可。如果直接监听0.0.0.0等于把没有鉴权的服务直接扔到公网上非常危险。# 启动推理服务仅监听本地回环地址 推理框架启动命令 \ --model /data/models/模型名/版本 \ --host 127.0.0.1 \ --port 8000 \ --gpu-memory-utilization 0.85 \ --max-model-len 4096--gpu-memory-utilization这个参数值得说一下。它控制推理服务能用多少比例的显存。设成0.85意味着留15%给系统和其他进程。设太高容易OOM设太低浪费显存。我的经验是从0.8开始试观察nvidia-smi的显存占用逐步往上调找到稳定运行的临界点。--max-model-len控制最大上下文长度。这个值越大显存占用越高。如果业务场景不需要超长上下文不要盲目设大。我一般先设4096跑通再根据实际需求调整。服务启动后用curl在本地测试一下curl http://127.0.0.1:8000/v1/models如果能返回模型列表说明服务正常。这一步一定要在配置代理之前确认否则后面出问题分不清是服务的问题还是代理的问题。3.2 反向代理配置与鉴权层实现反向代理我选的是最主流的那款配置灵活、性能好、社区资料多。安装很简单配置才是重点。核心配置包括三块监听端口、鉴权规则、转发规则。鉴权我采用的是基于请求头的令牌校验方式。具体做法是在代理层配置一个密钥客户端请求时必须带上正确的请求头否则直接返回拒绝。这种方式实现简单兼容性好几乎所有编程语言都能轻松构造这样的请求。server { listen 443 ssl; server_name your-domain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { # 校验请求头中的令牌 if ($http_x_api_token ! 你的密钥) { return 403; } # 转发到本地推理服务 proxy_pass http://127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_read_timeout 300s; proxy_send_timeout 300s; } }这里有几个细节要展开说。第一proxy_read_timeout和proxy_send_timeout要设大一些因为大模型推理是慢操作默认的60秒很容易超时。我设的是300秒基本够用。第二密钥不要用简单的字符串建议用足够长的随机串并且定期更换。第三如果条件允许尽量走加密传输不要用明文否则令牌在传输过程中可能被截获。配置完成后先做语法检查再重载sudo nginx -t sudo systemctl reload nginx3.3 公网访问测试与安全加固代理配好之后从外部机器测试访问。先测不带令牌的情况应该返回403再测带正确令牌的情况应该能正常拿到响应。# 不带令牌预期返回403 curl -k https://your-domain.com/v1/models # 带令牌预期返回模型列表 curl -k -H X-API-Token: 你的密钥 https://your-domain.com/v1/models两个测试都符合预期说明鉴权层工作正常。接下来是安全加固这部分很多人会忽略但恰恰是最重要的。第一限制来源IP。如果服务只给特定几个客户端用可以在代理层加IP白名单其他IP一律拒绝。第二开启访问日志记录每个请求的来源、时间、令牌是否正确方便事后审计。第三限制请求频率防止令牌泄露后被恶意刷量。第四关闭不必要的端口云主机的安全组只开放必要的端口其他一律关闭。# 限流配置示例 limit_req_zone $binary_remote_addr zoneapi_limit:10m rate10r/s; location / { limit_req zoneapi_limit burst20 nodelay; # ... 其他配置 }提示安全加固不是一次性的工作建议每隔一段时间复查一次配置尤其是令牌是否该更换、日志里有没有异常请求。我习惯每月初花十分钟做一次例行检查。4. 常见问题排查与实操经验实录4.1 部署阶段高频问题速查部署过程中遇到的问题我整理成了一张速查表方便对照排查。问题现象可能原因排查方向解决方法显卡识别不到驱动未装或未生效lspci和nvidia-smi重装驱动并重启模型加载报错CUDA版本不匹配查看框架文档要求安装对应版本CUDA显存不足OOM模型太大或并发太高nvidia-smi观察占用降低量化精度或并发数本地能访问公网不能代理配置或安全组检查代理日志和安全组开放端口、修正转发规则请求超时超时时间设太短查看代理超时配置调大读写超时鉴权总是失败请求头名称或值不对对比配置和请求统一名称和值这张表里的每一条我基本都实际遇到过。其中“显存不足OOM”是最常见的尤其是在并发请求上来的时候。我的处理经验是先看单请求的显存占用再乘以预估并发数留20%余量。如果超了要么降量化精度要么限制并发。4.2 性能调优的几个实操心得服务跑起来只是第一步跑得好不好是另一回事。我分享几个实测有效的调优心得。第一个是批处理。推理框架通常支持把多个请求合并成一个批次处理这样能显著提升显卡利用率。但批处理会增加单个请求的延迟所以要根据业务场景权衡。如果是离线批量任务批处理越大越好如果是实时对话批次要小一些。第二个是量化。把模型从高精度转成低精度显存占用能降一半甚至更多速度也会提升代价是精度略有下降。对于大多数应用场景4bit量化后的效果已经足够好。我实测下来量化后的响应质量在可接受范围内但显存占用从14GB降到了6GB左右性价比很高。第三个是预热。服务刚启动时第一次请求会特别慢因为要加载模型到显存、初始化各种缓存。我的做法是服务启动后先发几个预热请求把常用路径跑一遍这样正式请求进来时就不会有冷启动的卡顿。# 预热脚本示例 for i in {1..3}; do curl -s -H X-API-Token: 你的密钥 \ -X POST https://your-domain.com/v1/chat/completions \ -d {messages:[{role:user,content:你好}]} /dev/null done4.3 长期运维的注意事项服务上线不是终点长期稳定运行才是。我总结了几个运维要点。监控是必须的。至少要监控三项显卡显存占用、服务响应时间、请求成功率。显存占用持续走高可能是内存泄漏响应时间变长可能是负载过高成功率下降可能是服务异常。我用的是一套轻量监控方案每分钟采集一次数据异常时发通知。日志轮转也要做。访问日志和错误日志会不断增长不处理的话迟早把磁盘占满。配置日志按天切割、保留最近30天老日志自动清理。备份同样重要。模型文件、配置文件、密钥都要有备份。模型文件大可以备份到对象存储配置文件小直接版本管理。密钥要单独保管不要和代码放在一起。版本管理容易被忽视。推理框架会更新模型会更新配置会调整。每次变更都要记录改了什么、为什么改、改完效果如何。这样出问题时能快速回滚也能积累经验。注意不要在业务高峰期做变更。我一般选在流量最低的时段操作并且提前准备好回滚方案。变更后观察至少半小时确认稳定再收工。5. 扩展玩法与个人体会5.1 这套架构还能怎么玩跑通基础版本之后这套架构其实还能扩展出不少玩法。多模型共存是一个方向。一台服务器上可以同时跑多个不同规模的模型代理层根据请求特征路由到不同的后端。比如简单问题走小模型复杂问题走大模型既省资源又保证效果。接入应用是另一个方向。推理服务跑起来之后可以对接各种前端应用聊天界面、文档问答、代码助手等等。只要应用能发HTTP请求就能用上这个服务。团队共享也值得考虑。给团队每个成员分配不同的令牌代理层记录每个人的用量方便做资源核算。令牌可以设置有效期人员变动时及时回收。5.2 我踩过的坑和真实体会最后说几个我实际踩过的坑希望能帮你少走弯路。第一个坑是磁盘空间。我一开始只挂了系统盘模型下载到一半磁盘满了下载失败还留了一堆临时文件。后来加了数据盘把模型和日志都放数据盘系统盘只放系统清爽很多。第二个坑是权限。我用root跑服务结果生成的文件都是root权限后来换普通用户操作时各种权限拒绝。正确做法是一开始就用普通用户跑服务需要提权时再用sudo。第三个坑是密钥硬编码。我一开始把密钥直接写在配置文件和脚本里后来要换密钥时发现到处都是改起来很麻烦。正确做法是把密钥放在环境变量或独立的配置文件里代码和配置分离。第四个坑是忘记限流。有一次令牌不小心泄露被人疯狂刷量显卡一直满载正常请求全被挤掉了。后来加了限流每个令牌每分钟最多多少次请求超了就拒绝问题解决。这些坑说到底都是工程细节但恰恰是这些细节决定了服务能不能稳定跑下去。技术方案本身不难难的是把每个环节都考虑到、做到位。我个人在实际操作中的体会是部署一次不难难的是长期稳定运行。所以从一开始就要按“要跑很久”的标准来设计而不是“先跑起来再说”。前者多花的时间后面会加倍省回来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑