ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

TensorZero 部署实践:用 SGLang + NGINX Docker 镜像搭建带 Bearer 认证的安全推理端点

TensorZero 部署实践:用 SGLang + NGINX Docker 镜像搭建带 Bearer 认证的安全推理端点 TensorZero 部署实践用 SGLang NGINX Docker 镜像搭建带 Bearer 认证的安全推理端点【免费下载链接】tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.项目地址: https://gitcode.com/GitHub_Trending/te/tensorzero导读TensorZero 是一个开源的 LLMOps 平台它把 LLM 网关、可观测性、评估、优化与实验能力统一在一起。当你在 E2E 测试或生产环境中需要持续、安全、可复用的 SGLang 推理端点时TensorZero 仓库内提供了一个开箱即用的组合镜像SGLang NGINX Docker 镜像位于 crates/tensorzero-core/fixtures/deployment/sgl-nginx。本文将带你完整理解该镜像的架构设计SGLang 推理服务 NGINX 反向代理 Bearer Token 认证、四个核心文件的实现原理以及如何通过docker run一条命令把它跑起来。读完你就能独立部署一个带认证的持久化 LLM 推理端点并知道如何把它接入 TensorZero 的 E2E 测试与配置体系。镜像要解决的问题SGLang 推理端点缺一把锁SGLang 是一个高性能的开源 LLM 推理框架。在 TensorZero 的 E2E 测试中需要一个持久、安全的端点来持续服务 SGLang 模型例如HuggingFaceTB/SmolLM-1.7B-Instruct。如果直接把裸的 SGLang 服务暴露出去任何人都能调用你的推理资源既无法控制访问权限也无法统计调用方。仓库内的 sgl-nginx README 明确说明了设计目标This image is used to run SGLang behind an NGINX proxy that provides Bearer token authentication. We use it to provide a persistent secure endpoint serving SGLang for our E2E tests.也就是说该镜像的核心价值是在 SGLang 前面加一层 NGINX 反向代理用 Bearer Token 做访问认证。任何没有携带合法Authorization: Bearer token头的请求都会被 NGINX 直接拒绝返回 401只有携带正确 token 的请求才会被转发到后端的 SGLang 服务。镜像整体架构与端口约定该镜像是一个二合一容器内部同时运行两个进程SGLang 推理服务python3 -m sglang.launch_server --host 0.0.0.0 --port 8081监听容器内部的8081端口只接受来自本机NGINX的代理转发NGINX 反向代理监听容器对外暴露的80端口负责 Bearer Token 校验并把合法请求代理到127.0.0.1:8081。端口规划是固定的这是镜像的正常工作前提端口服务说明80NGINX容器对外唯一暴露的端口所有外部请求都从这里进入8081SGLang容器内部推理端口只允许 NGINX 本机代理访问不直接对外这一点在 Dockerfile 中有明确注释Nginx listens on port 80; SGLang will listen on 8081并通过EXPOSE 80对外声明。因此使用docker run时你只需要映射宿主机的某个端口到容器的 80 端口即可千万不要再给 SGLang 传--port参数——容器启动脚本已经替你把 SGLang 固定在 8081 上见 entrypoint.sh你传入的自定义参数会被追加到该启动命令末尾若同时传入--port会导致启动参数冲突。一条命令跑起来docker run 完整用法README 给出的标准用法如下docker run \ -p 8080:80 \ # 将宿主机的 8080 端口映射到容器的 80 端口 # 端口号可自行更改但容器内部固定监听 80 -e BEARER_TOKENSUPER_SECRET_TOKEN \ # 设置 BEARER_TOKEN 环境变量为你的密钥 tensorzero/sgl-nginx:latest \ --model-path HuggingFaceTB/SmolLM-1.7B-Instruct \ # 要服务的模型 --trust-remote-code \ --disable-overlap # 注意不要传 --port 参数该参数由容器内部固定设置逐项拆解各参数的作用-p 8080:80宿主机端口映射。8080是宿主机端口可随意更改80是容器内 NGINX 监听端口固定不变。容器启动后访问http://localhost:8080即等价于访问容器内的 NGINX。-e BEARER_TOKENSUPER_SECRET_TOKEN认证密钥。它是整个认证体系的安全基础必须设置——如果未设置入口脚本会直接报错退出见下文。请把SUPER_SECRET_TOKEN替换成你自己的强随机密钥。tensorzero/sgl-nginx:latest镜像名。它基于lmsysorg/sglang:latest构建见 Dockerfile所以 SGLang 的所有启动参数如--model-path、--trust-remote-code、--disable-overlap、--tp、--mem-fraction-static等都可以直接追加在镜像名后面透传给 SGLang。--model-path HuggingFaceTB/SmolLM-1.7B-Instruct指定要加载的 Hugging Face 模型。README 示例用的是小体量的SmolLM-1.7B-Instruct实际可按需替换为其他模型。--trust-remote-code允许加载模型仓库中的自定义代码某些模型需要。--disable-overlap关闭 SGLang 的调度与执行重叠优化适用于对延迟抖动敏感或调试场景。--port严禁传入容器入口脚本已将 SGLang 固定在 8081--port会被视为冲突参数破坏 NGINX 代理链。启动后用携带 token 的方式调用推理接口curl http://localhost:8080/v1/chat/completions \ -H Authorization: Bearer SUPER_SECRET_TOKEN \ -H Content-Type: application/json \ -d {model: HuggingFaceTB/SmolLM-1.7B-Instruct, messages: [{role: user, content: Hello}]}而不带 token 或 token 错误的请求会得到401 Unauthorized从而保证端点安全。逐文件拆解这个镜像到底做了什么该镜像目录下共有 4 个文件职责清晰一个 Dockerfile 负责装配一个 nginx 配置负责认证与代理一个入口脚本负责串联两个进程一个 README 负责使用说明。Dockerfile三层式装配Dockerfile 的结构非常简单可以拆成三件事FROM lmsysorg/sglang:latest # 1. 安装 nginx 并移除默认站点 RUN apt-get update apt-get install -y nginx \ rm -rf /var/lib/apt/lists/* \ rm /etc/nginx/sites-enabled/default # 2. 拷贝认证代理配置与入口脚本 COPY default.conf /etc/nginx/conf.d/default.conf COPY entrypoint.sh /entrypoint.sh RUN chmod x /entrypoint.sh # 3. 端口与启动入口 EXPOSE 80 ENTRYPOINT [/entrypoint.sh]基础镜像直接基于官方lmsysorg/sglang:latest继承了完整的 SGLang 运行环境Python、CUDA 依赖、SGLang 本体等。安装 NGINX用 apt 安装 nginx并删除 Debian 自带的默认站点/etc/nginx/sites-enabled/default避免它与我们自己的default.conf冲突。配置注入把default.conf放到/etc/nginx/conf.d/该目录下的.conf会被 nginx 自动加载把entrypoint.sh放到根目录并赋予可执行权限。入口ENTRYPOINT [/entrypoint.sh]保证容器启动时先执行我们的脚本而不是直接启动 SGLang。default.confNGINX 里的 Bearer Token 校验逻辑default.conf 是整个认证机制的核心。它监听 80 端口对每一个请求做三件事server { listen 80; location / { # 默认 token 校验失败 set $valid_token 0; # 比较 Authorization 头与环境中替换进来的 token if ($http_authorization Bearer _MY_SECRET_) { set $valid_token 1; } # 校验失败则返回 401 if ($valid_token 0) { return 401; } # 校验通过则代理到 SGLang proxy_pass http://127.0.0.1:8081; } }原理拆解set $valid_token 0;先把标记变量初始化为 0默认拒绝这是一种默认失败的安全写法避免配置漏洞导致越权if ($http_authorization Bearer _MY_SECRET_)精确比对请求头的Authorization值与占位符Bearer _MY_SECRET_命中则把标记置 1。注意这里比对的是完整字符串因此 token 格式必须严格是Bearer token且大小写敏感if ($valid_token 0) { return 401; }对校验失败的请求直接返回 401不会转发到后端也就不会消耗任何推理资源proxy_pass http://127.0.0.1:8081;对校验通过的请求做反向代理转发到同容器内的 SGLang 服务。占位符_MY_SECRET_是刻意设计的它永远不会是一个真实 token因此即使有人误用了未经替换的原始配置所有请求也会因 token 不匹配而被 401 拒绝——做到了默认安全。entrypoint.sh把两个进程串起来的胶水层entrypoint.sh 是容器的实际启动逻辑共分四步#!/bin/bash # 1. 校验 BEARER_TOKEN 环境变量缺失则退出 if [ -z $BEARER_TOKEN ]; then echo Missing BEARER_TOKEN env var. Exiting. exit 1 fi # 2. 用真实 token 替换 nginx 配置中的占位符 sed -i s#_MY_SECRET_#${BEARER_TOKEN}#g /etc/nginx/conf.d/default.conf # 3. 后台启动 SGLang透传所有命令行参数 ldconfig 2/dev/null || echo Note: ... python3 -m sglang.launch_server --host 0.0.0.0 --port 8081 $ # 4. 前台启动 nginx保持容器存活 exec nginx -g daemon off;关键设计点强制安全第 1 步先检查BEARER_TOKEN缺失立即exit 1拒绝启动绝不允许无认证裸奔的容器被拉起运行时注入第 2 步用sed -i s#_MY_SECRET_#${BEARER_TOKEN}#g把 nginx 配置里的占位符替换为真实 token#作为分隔符避免 token 中的/等字符破坏 sed 语法。这是构建期镜像不含密钥、运行期注入密钥的安全实践镜像本身可以被安全地推送到任意镜像仓库双进程编排第 3 步把 SGLang 以放入后台固定监听0.0.0.0:8081并把docker run时镜像名后的所有参数$原样透传第 4 步用exec nginx -g daemon off;让 NGINX 以前台模式运行——这是 Docker 容器保持存活的经典做法主进程nginx在前台SGLang 作为其后台子进程共存。该镜像在 TensorZero 中的角色E2E 测试的持久化推理端点为什么 TensorZero 需要一个带认证的 SGLang 端点而不是直接在测试里裸跑 SGLang原因在于持久化E2E 测试见 crates/tensorzero-core/tests/e2e需要反复调用同一推理端点若每次测试都重新拉起 SGLang 进程冷启动成本极高用容器常驻端点可以大幅提升测试效率安全隔离该端点由 NGINX 用 Bearer Token 保护未授权的请求在代理层就被 401 拦截避免测试基础设施被滥用接入自然SGLang 是 TensorZero 原生支持的推理服务商之一。在 crates/tensorzero-core/src/config/provider_types.rs 中定义了SGLangProviderTypeConfig/SGLangDefaults配置类型在 crates/tensorzero-core/src/model.rs 中注册了SGLang提供方变体并在 crates/tensorzero-core/src/providers/sglang 中实现了SGLangProvider。因此你可以在 TensorZero 的配置tensorzero.toml中用[models.sglang]或[models.some_model] providers.sglang ...的方式声明模型把上面这个带认证端点的 URL 填入base_url即可让 TensorZero 网关把推理请求发往该安全端点。从源码结构看该镜像正是为 TensorZero 官方 E2E 测试链路服务的配套组件与仓库内另一组同类组件 tgi-nginxTGI NGINX 认证代理互为姊妹方案当你的推理后端选择 SGLang 时用本镜像选择 Hugging Face TGI 时用 tgi-nginx二者架构与认证模式完全一致。安全注意事项与常见误区基于对镜像源码的分析部署时有几点值得注意BEARER_TOKEN是唯一的访问凭据请使用高熵随机字符串并通过环境变量注入不要把密钥写死在镜像或配置文件中。由于 token 是在容器启动时由sed写入 nginx 配置的同一个镜像可以被不同 token 复用非常适合按环境隔离密钥。nginx 的if比对是精确字符串匹配客户端请求头必须恰好是Bearer token注意大小写与空格否则即使 token 正确也会被 401。不要传--port给容器。SGLang 固定监听 8081端口冲突会让 NGINX 代理链失效同理外部访问只能走 80 端口映射8081 在容器内部不对外暴露。镜像使用lmsysorg/sglang:latest作为基础镜像构建时拉取的是当时最新的 SGLang 版本如需可复现的测试环境建议把基础镜像固定到具体版本标签。小结TensorZero 的 sgl-nginx 镜像用不到一百行的组合Dockerfile nginx 配置 入口脚本解决了给 SGLang 推理端点加认证这个真实工程问题NGINX 在 80 端口做 Bearer Token 校验并反向代理SGLang 在内部 8081 端口提供推理sed在容器启动时注入密钥实现镜像无密、运行期注入。这套模式不仅是 TensorZero E2E 测试的基础设施也完全可以作为你自建 LLM 推理服务的参考模板——照搬这套文件结构你就能为任何推理框架SGLang、TGI 等快速套上一层标准化的认证代理。【免费下载链接】tensorzeroTensorZero is an open-source LLMOps platform that unifies an LLM gateway, observability, evaluation, optimization, and experimentation.项目地址: https://gitcode.com/GitHub_Trending/te/tensorzero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表