☰
云服务器部署Harness推理服务:公网鉴权与反向代理实战
2026/10/22 18:49:55 网站建设 项目流程

1. 从零理解这套部署方案到底在解决什么问题

1.1 为什么要在云服务器上跑推理服务

很多人第一次接触大模型,习惯在自己笔记本上装个客户端,填个接口地址就开始用。但真要把模型能力接进自己的业务流、给团队内部用、或者做成一个对外的小工具,本地跑就完全不够看了。原因很直接:本地机器的算力、内存、带宽都是瓶颈,而且你不可能要求每个使用者都去装一套环境。

把推理服务放到云服务器上,本质上是把“算力”和“访问入口”这两件事解耦。算力交给云主机,访问入口交给一个带鉴权的网关。这样带来的好处是:团队成员用浏览器或接口就能访问,不用关心后端跑在哪;你自己也能随时扩容、换模型、调参数,而不用挨个通知使用者改配置。

标题里提到的“Harness”,在这个语境下我理解为一套把模型推理能力包装成可访问服务的中间层框架——它负责加载模型、管理会话、暴露接口,并且通常自带一个简易的 Web 交互界面。而“公网鉴权访问”则是这套方案里最容易被忽视、却最要命的一环:服务一旦暴露在公网,没有鉴权就等于把自家大门敞开。

1.2 公网鉴权为什么是这套方案的命门

我见过太多人部署完服务,图省事直接把端口全开,结果没几天就发现账单暴涨、日志里全是陌生 IP 的请求。推理服务跟普通静态网站不一样,它消耗的是实打实的 GPU 或 CPU 算力,一次恶意刷请求可能就让你当月的云费用翻好几倍。

所以“公网鉴权”这四个字,不是可选项,是必选项。它要解决三个层面的问题:第一,确认访问者是谁(身份认证);第二,确认他能访问哪些资源(权限控制);第三,防止请求被中途窃听或篡改(传输加密)。这三个层面缺一个,整套方案就是纸糊的。

我个人的经验是,鉴权方案的选择要跟使用场景匹配。如果只是团队内部几个人用,一个反向代理加基础认证就够了;如果要做成对外的小产品,那就得上令牌机制,配合访问频率限制。下面我会把两种思路都讲清楚,你按自己的实际情况选。

1.3 这套方案适合哪些人参考

如果你属于下面这几类人,这篇内容会对你有直接帮助:

  • 手里有一台云主机,想把它变成团队内部可用的模型服务入口;
  • 已经能在本地跑通推理,但不知道怎么安全地开放给外部访问;
  • 做过基础的服务部署,但对鉴权、反向代理、传输加密这些概念还比较模糊;
  • 想搭一个自己的实验环境,用来测试不同模型或不同参数的效果。

需要提前说明的是,这套流程假设你对 Linux 命令行有基本的操作能力,知道怎么用 SSH 连服务器、怎么编辑配置文件。如果这些还不熟,建议先补一下基础,否则后面每一步都会卡住。

2. 部署前的整体设计与关键选型考量

2.1 服务架构的分层思路

一套完整的部署方案,我习惯把它拆成四层来看,这样排查问题时能快速定位是哪一层出了毛病:

层级职责常见组件
接入层接收公网请求、做鉴权、转发流量反向代理服务
应用层加载模型、处理推理请求、管理会话Harness 框架本体
运行层提供 Python 环境、依赖库、进程管理运行时与进程守护工具
系统层提供算力、内存、存储、网络云主机与操作系统

这个分层不是为了好看,而是为了“改一处不影响其他处”。比如你后面想换鉴权方式,只需要动接入层;想换模型,只需要动应用层。如果一开始就把所有东西揉在一起,后面维护会非常痛苦。

2.2 云主机规格怎么选才不浪费钱

选规格这件事,我的原则是“先够用,再优化”。很多人一上来就买顶配,结果模型跑起来发现瓶颈根本不在算力,而在内存带宽或者磁盘读写速度。

对于中等规模的模型推理,我建议按下面的思路估算:

  • 内存:模型参数占用的内存大约是“参数量 × 精度字节数”。比如一个 7B 参数的模型,用半精度存储,光权重就要占大约 14GB,再加上推理过程中的中间激活值、KV 缓存,实际占用会更高。所以内存至少要给到权重占用的 1.5 到 2 倍。
  • 显存:如果有独立加速卡,显存同理,而且要额外留出 KV 缓存的空间。上下文长度越长,KV 缓存越大,这个增长是线性的。
  • 磁盘:模型文件本身加上依赖库,建议预留 50GB 以上。如果要做多模型切换,按每个模型单独算。
  • 带宽:公网访问的带宽决定了并发能力。如果只是几个人用,基础带宽就够;如果要给几十人同时用,带宽要往上提。

提示:不要一次性买长期套餐。先用按量计费跑几天,观察实际的资源占用曲线,再决定买什么规格的包年包月。我见过太多人买了高配结果利用率不到两成。

2.3 鉴权方案的两条路线

鉴权这块,我把常见做法归为两类,你可以根据自己的技术储备和需求复杂度来选。

路线一:反向代理层做基础认证。这是最简单直接的方式,在反向代理配置里加一段认证规则,访问者需要输入用户名密码才能进入。优点是配置简单、不依赖应用层改造;缺点是粒度粗,所有使用者共享同一套凭证,没法区分谁是谁,也没法做细粒度的权限控制。

路线二:应用层做令牌认证。在 Harness 框架或它前面的网关里实现令牌校验,每个使用者分配独立的令牌。优点是粒度细、可追溯、可撤销;缺点是需要改代码或加中间件,配置复杂度高一些。

我的建议是:内部小团队用路线一,够用且省事;如果要做成对外服务,或者使用者超过十个人,直接上路线二,不然后面迁移成本更高。

2.4 传输加密的必要性

不管选哪条鉴权路线,传输加密都必须开。原因很简单:基础认证的用户名密码、令牌认证的令牌本身,如果在传输过程中是明文,那鉴权就形同虚设。中间任何一个节点都能截获这些凭证。

传输加密的落地方式就是配置证书。证书可以自己签发,也可以用受信任的证书颁发机构签发的。自己签发的证书浏览器会报警告,适合内部测试;对外服务建议用受信任的证书,用户体验更好。

3. 核心环节的实操步骤与配置细节

3.1 系统环境初始化

拿到云主机后的第一件事,不是急着装东西,而是把系统环境收拾干净。我习惯按下面的顺序来:

# 更新系统包索引和已安装的包 sudo apt update && sudo apt upgrade -y # 安装常用工具 sudo apt install -y curl wget git vim htop net-tools # 设置时区(按自己所在区域调整) sudo timedatectl set-timezone Asia/Shanghai # 确认系统版本和内核 uname -a lsb_release -a

这几步看起来简单,但能避免后面很多莫名其妙的兼容性问题。特别是系统包更新,有些依赖库的版本冲突就是因为基础包太旧导致的。

接下来创建一个专用的运行账户,不要用 root 直接跑服务。这是安全实践的基本要求,万一服务被攻破,攻击者拿到的也只是受限账户的权限。

# 创建专用用户 sudo useradd -m -s /bin/bash harness sudo passwd harness # 把需要的目录归属给这个用户 sudo mkdir -p /opt/harness sudo chown -R harness:harness /opt/harness

注意:给这个账户设置一个强密码,并且不要给它 sudo 权限。日常操作需要提权时,用你自己的管理账户切换过去。

3.2 运行时环境的准备

Harness 这类框架通常依赖 Python 环境。我强烈建议用虚拟环境隔离,不要直接装在系统 Python 里。原因有两个:一是避免污染系统环境导致其他工具出问题;二是方便后续做版本切换和依赖管理。

# 切换到专用用户 sudo su - harness # 安装 Python 虚拟环境工具 sudo apt install -y python3-venv python3-pip # 创建虚拟环境 cd /opt/harness python3 -m venv venv # 激活虚拟环境 source venv/bin/activate # 升级 pip 并安装基础依赖 pip install --upgrade pip pip install wheel setuptools

虚拟环境激活后,命令行提示符前面会出现(venv)字样,说明你已经在这个隔离环境里了。后面所有 Python 相关的安装操作都要确保在这个环境下进行。

如果框架需要编译某些依赖,可能还要装构建工具:

sudo apt install -y build-essential python3-dev

这一步不是必须的,但如果安装依赖时报编译错误,回来补上就行。

3.3 Harness 框架的安装与模型加载

框架的安装方式取决于它提供的分发形式。常见的有三种:从代码仓库克隆、从包管理工具安装、或者下载打包好的发行版。我以从代码仓库安装为例,因为这种方式最灵活,方便你后续改配置。

# 在虚拟环境下操作 cd /opt/harness git clone <框架仓库地址> harness-app cd harness-app # 安装依赖 pip install -r requirements.txt

模型文件的准备是另一个关键环节。模型通常比较大,下载需要时间,而且要注意存放路径和权限。

# 创建模型存放目录 mkdir -p /opt/harness/models cd /opt/harness/models # 下载模型文件(具体命令取决于模型分发方式) # 假设是通过命令行工具下载 <下载工具> <模型标识> --local-dir ./model-name

下载完成后,检查一下文件完整性。有些模型分发会提供校验值,对一下能避免文件损坏导致的加载失败。

# 查看模型目录大小和文件列表 du -sh /opt/harness/models/model-name ls -lh /opt/harness/models/model-name

3.4 服务配置文件的编写

框架的配置文件通常是一个结构化的文本文件,里面定义了模型路径、监听地址、端口、并发数等参数。我拿一个典型的配置结构来举例说明每个参数的含义:

# 服务监听配置 server: host: 127.0.0.1 # 只监听本地,公网访问交给反向代理 port: 8080 # 应用层端口 workers: 2 # 工作进程数,按 CPU 核心数调整 # 模型配置 model: path: /opt/harness/models/model-name precision: fp16 # 精度,fp16 省显存,fp32 更精确 max_context: 4096 # 最大上下文长度,影响 KV 缓存大小 # 推理参数 inference: batch_size: 1 # 批处理大小,显存够可以调大 timeout: 120 # 单次请求超时时间(秒)

这里有几个参数值得展开说。host设成127.0.0.1是故意的,意思是应用只接受本机请求,公网流量必须经过反向代理进来。这样即使应用层有漏洞,也不能被直接访问。workers的数量不是越多越好,每个工作进程都会占用一份内存,设太多反而会因为内存不足导致进程被杀。max_context直接决定了 KV 缓存的大小,设得越大内存占用越高,要根据实际可用内存来定。

提示:配置文件改完后,先用小规模请求测试一下,确认服务能正常响应,再去做反向代理的配置。分步验证比一次性全配好再调试要高效得多。

3.5 进程守护与开机自启

服务不能靠手动敲命令启动,那样一旦终端断开或者服务器重启,服务就没了。需要用进程守护工具来管理。

现在主流的做法是用 systemd,它是大多数 Linux 发行版自带的初始化系统。写一个服务单元文件:

[Unit] Description=Harness Inference Service After=network.target [Service] Type=simple User=harness Group=harness WorkingDirectory=/opt/harness/harness-app Environment="PATH=/opt/harness/venv/bin" ExecStart=/opt/harness/venv/bin/python -m harness_app --config /opt/harness/harness-app/config.yaml Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target

把这个文件保存到/etc/systemd/system/harness.service,然后执行:

# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start harness # 设置开机自启 sudo systemctl enable harness # 查看服务状态 sudo systemctl status harness

Restart=on-failure这行很重要,它保证服务意外退出后会自动重启。RestartSec=10是重启前的等待时间,给系统一点缓冲,避免频繁重启把资源耗尽。

4. 公网鉴权与反向代理的落地实现

4.1 反向代理服务的安装与基础配置

反向代理我选的是 Nginx,因为它成熟、文档多、配置灵活。安装很简单:

sudo apt install -y nginx sudo systemctl enable nginx sudo systemctl start nginx

安装完成后,默认会有一个站点配置。我习惯把默认配置禁用掉,自己新建一个专用的配置文件,这样结构更清晰。

# 禁用默认站点 sudo rm /etc/nginx/sites-enabled/default # 新建配置文件 sudo vim /etc/nginx/sites-available/harness

基础的反向代理配置长这样:

server { listen 80; server_name your-domain.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

proxy_set_header这几行是把原始请求的信息透传给后端应用,方便应用层做日志记录和访问控制。特别是X-Real-IP,如果后面要做基于 IP 的限制,没有这个头就拿不到真实客户端地址。

配置写完后,先测试语法再重载:

sudo nginx -t sudo systemctl reload nginx

4.2 基础认证的配置方法

给反向代理加基础认证,需要两个东西:一个密码文件,和配置里的一段引用。

生成密码文件用htpasswd工具:

# 安装工具 sudo apt install -y apache2-utils # 创建密码文件并添加第一个用户 sudo htpasswd -c /etc/nginx/.htpasswd username1 # 添加更多用户(注意不要加 -c,否则会覆盖) sudo htpasswd /etc/nginx/.htpasswd username2

然后在 Nginx 配置里加上认证指令:

server { listen 80; server_name your-domain.com; location / { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }

这样访问者打开页面时,浏览器会弹出登录框,输入正确的用户名密码才能进入。密码文件里的密码是加密存储的,即使文件泄露,攻击者也需要时间破解。

注意:基础认证的凭证在传输时是 Base64 编码的,不是加密的。所以必须配合传输加密使用,否则凭证等于明文传输。

4.3 传输加密的证书配置

证书的获取方式有两种:自己签发,或者用受信任机构签发的。自己签发的适合内部测试,配置如下:

# 生成自签名证书 sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/harness.key \ -out /etc/nginx/ssl/harness.crt

执行过程中会要求填写一些信息,其中 Common Name 要填你的域名或服务器地址。生成后,修改 Nginx 配置启用加密:

server { listen 443 ssl; server_name your-domain.com; ssl_certificate /etc/nginx/ssl/harness.crt; ssl_certificate_key /etc/nginx/ssl/harness.key; location / { auth_basic "Restricted Access"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } # 把 HTTP 请求重定向到 HTTPS server { listen 80; server_name your-domain.com; return 301 https://$host$request_uri; }

自签名证书的问题是浏览器会显示安全警告,需要手动确认才能继续。如果只是内部几个人用,这个警告可以接受;如果对外,建议换成受信任的证书。

4.4 访问频率限制的配置

鉴权解决了“谁能访问”的问题,但没解决“能访问多少次”的问题。一个合法用户如果账号被盗,或者自己写了个死循环脚本,照样能把你的算力吃光。所以频率限制也要加上。

Nginx 的频率限制配置分两步。先在http块里定义限制区域:

# 在 /etc/nginx/nginx.conf 的 http 块内添加 limit_req_zone $binary_remote_addr zone=harness_limit:10m rate=10r/s;

这行的意思是:以客户端 IP 为键,分配 10MB 内存来记录状态,限制速率是每秒 10 个请求。然后在站点配置里引用:

location / { limit_req zone=harness_limit burst=20 nodelay; # ... 其他配置 }

burst=20表示允许突发 20 个请求,nodelay表示突发请求立即处理而不是排队。这两个参数要根据实际使用模式调整。如果使用者是真人操作,10r/s 绰绰有余;如果是程序调用,按程序的请求频率来定。

5. 常见问题排查与实战避坑经验

5.1 服务启动失败的排查思路

服务起不来是最常见的问题,排查要按层次来,不要东一榔头西一棒子。

第一步,看服务状态和日志。systemd 管理的服务,用systemctl status看状态,用journalctl看日志:

sudo systemctl status harness sudo journalctl -u harness -n 100 --no-pager

日志里通常会直接告诉你失败原因,比如“端口被占用”、“配置文件语法错误”、“依赖库缺失”。

第二步,确认端口占用情况。如果日志提示端口冲突,用这个命令查:

sudo netstat -tlnp | grep 8080 # 或者 sudo ss -tlnp | grep 8080

找到占用端口的进程后,要么停掉它,要么改自己服务的端口。

第三步,手动运行验证。如果日志信息不够明确,可以手动执行启动命令,让错误直接输出到终端:

sudo su - harness cd /opt/harness/harness-app source /opt/harness/venv/bin/activate python -m harness_app --config config.yaml

手动运行能看到最原始的错误信息,比翻日志快得多。

5.2 鉴权配置不生效的几种情况

鉴权配了但没起作用,通常逃不出下面几种原因:

现象可能原因排查方法
不弹登录框直接进入认证指令没生效或配置未重载检查配置位置,执行nginx -t后重载
输入正确密码仍被拒密码文件路径错误或权限不足确认文件存在且 Nginx 进程可读
部分路径不需要认证location 匹配规则问题检查 location 的匹配优先级
认证通过但后端报错请求头未正确透传检查 proxy_set_header 配置

我踩过的一个坑是:密码文件放在了/root目录下,Nginx 进程没有权限读取,导致认证一直失败。后来把文件移到/etc/nginx/下就正常了。所以密码文件的存放位置和权限要特别注意。

5.3 性能瓶颈的定位方法

服务跑起来后如果响应慢,要定位瓶颈在哪一层。我常用的工具组合是:

# 看系统整体负载 htop # 看内存和交换分区使用 free -h # 看磁盘 IO iostat -x 1 # 看网络连接状态 ss -s

如果 CPU 占用高但 GPU 空闲,说明瓶颈在预处理或后处理;如果内存占用接近上限,说明模型太大或者并发太高;如果磁盘 IO 持续满载,说明模型加载或日志写入有问题。

提示:推理服务的响应时间由“排队时间 + 推理时间 + 传输时间”组成。如果排队时间长,说明并发数设得太高或者算力不够;如果推理时间长,考虑换更小的模型或降低精度;如果传输时间长,检查网络带宽。

5.4 安全加固的补充措施

除了鉴权和加密,还有几个加固措施值得做:

  • 关闭不必要的端口:只开放 80 和 443,其他端口一律关掉。用防火墙规则控制:
sudo ufw allow 80/tcp sudo ufw allow 443/tcp sudo ufw enable
  • 限制 SSH 访问来源:如果管理端 IP 固定,可以在防火墙层面限制 SSH 只接受特定来源。

  • 定期更新系统和依赖:安全漏洞是持续发现的,定期更新能堵住已知问题。

  • 日志审计:保留访问日志和错误日志,定期检查异常请求模式。Nginx 的访问日志默认在/var/log/nginx/下。

  • 禁用目录列表:确保 Nginx 配置里没有autoindex on,避免目录结构被窥探。

5.5 日常维护的检查清单

服务上线后,我习惯每周做一次例行检查,清单如下:

  1. 确认服务进程存活,systemctl status显示 active;
  2. 检查磁盘使用率,模型和日志目录不要超过 80%;
  3. 查看错误日志,确认没有异常报错;
  4. 检查访问日志,看有没有异常高频请求;
  5. 确认证书有效期,快到期时提前续期;
  6. 检查系统更新,有安全补丁及时打上。

这套检查花不了十分钟,但能避免绝大多数突发故障。我见过太多人部署完就不管了,等到服务挂了才去查,那时候往往已经影响使用了。

6. 后续可扩展的方向与个人经验补充

6.1 从单机到多实例的扩展思路

单机部署跑通之后,如果访问量上来了,可以考虑横向扩展。思路是在反向代理层做负载均衡,后面挂多个应用实例。Nginx 的负载均衡配置很简单:

upstream harness_backend { server 127.0.0.1:8080; server 127.0.0.1:8081; server 127.0.0.1:8082; } location / { proxy_pass http://harness_backend; # ... 其他配置 }

但要注意,多实例模式下会话状态的管理会变复杂。如果框架本身是无状态的,直接加实例就行;如果框架维护了会话状态,需要引入共享存储来同步状态,否则同一个用户的请求打到不同实例上会出问题。

6.2 监控与告警的搭建

服务稳定运行后,监控是下一步该做的事。最简单的监控是写个脚本定时检查服务状态,异常时发通知:

#!/bin/bash # 检查服务是否响应 if ! curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:8080/health | grep -q "200"; then echo "服务异常,请检查" | mail -s "Harness 服务告警" your-email@example.com fi

把这个脚本加到定时任务里,每五分钟跑一次。更完善的方案是上专业的监控工具,采集 CPU、内存、响应时间等指标,画出趋势图,设置阈值告警。但对个人或小团队来说,脚本加邮件通知已经能覆盖大部分场景了。

6.3 我踩过的几个印象深刻的坑

第一个坑是模型路径用了相对路径。配置文件里写的是./models/model-name,手动运行时工作目录正确所以没问题,但 systemd 启动时工作目录不一样,导致找不到模型。后来改成绝对路径就解决了。这个教训是:配置文件里涉及路径的地方,一律用绝对路径。

第二个坑是虚拟环境没激活就装依赖。有次用sudo pip install装了个包,结果装到了系统 Python 里,虚拟环境里反而没有。服务启动时报模块找不到,查了半天才发现是装错地方了。所以操作前一定要确认命令行提示符前面有(venv)。

第三个坑是证书续期忘了做。自签名证书设了一年有效期,到期那天服务突然无法访问,浏览器直接拒绝连接。后来加了个定时提醒,提前一个月续期。如果用受信任的证书,很多签发工具支持自动续期,配置好之后就不用操心了。

6.4 给刚上手的朋友几句实在话

这套流程看起来步骤不少,但真正核心的其实就三件事:把服务跑起来、把鉴权加上、把加密配上。其他的都是锦上添花。我建议第一次部署时不要追求一步到位,先把最小可用版本跑通,确认能访问、能推理,然后再逐步加鉴权、加加密、加限制。

另外,配置文件一定要做版本管理。我习惯把改过的配置文件都提交到一个私有仓库里,每次改动都有记录。这样出问题时能快速回滚,换服务器时也能直接复用。这个习惯帮我省了很多重复劳动。

最后说个细节:部署完成后,用不同的网络环境测试一下访问。有时候本地能访问不代表公网能访问,防火墙规则、安全组配置、DNS 解析这些环节都可能出问题。多测几个场景,心里才有底。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询