RexUniNLU部署教程:Nginx反向代理+HTTPS配置实现内网WebUI安全访问
1. 为什么需要给RexUniNLU加一层安全防护
你可能已经成功跑起了RexUniNLU的WebUI,输入http://localhost:7860就能看到那个熟悉的Gradio界面,输入一段中文、配上schema,模型立刻给出结构化结果——NER、RE、EE、ABSA,样样都行。但问题来了:这个服务默认只监听本地回环地址,一旦你想让团队其他成员也能访问,或者从公司内网其他机器调用,直接暴露7860端口就不太稳妥了。
更现实的情况是:你在一台Linux服务器上部署了RexUniNLU,它没有公网IP,只在内网可访问;但你希望同事用https://nlu.your-company.local这种干净域名访问,而不是记一串IP加端口号,还要手动处理HTTP不安全警告。这时候,Nginx反向代理+HTTPS就是最轻量、最可靠、也最符合生产习惯的解法。
它不改变RexUniNLU本身一行代码,不增加模型负担,却能带来三重提升:
- 访问更友好:告别
http://192.168.1.100:7860,换成https://nlu.internal - 通信更安全:所有请求走TLS加密,防止内网抓包窃取敏感文本或schema定义
- 管理更统一:后续如果还要加认证、限流、日志审计,Nginx都是现成入口
这篇教程不讲原理堆砌,只聚焦一件事:手把手带你把RexUniNLU WebUI稳稳地“套进”Nginx HTTPS通道里,全程可复制、零踩坑。
2. 部署前的环境准备与确认
2.1 确认RexUniNLU已可本地运行
先确保基础服务没问题。打开终端,执行官方启动命令:
python3 /root/nlp_deberta_rex-uninlu_chinese-base/app_standalone.py等待几秒,看到类似这样的输出就说明模型加载成功:
Running on local URL: http://127.0.0.1:7860此时在服务器本机浏览器中打开http://localhost:7860,能正常加载WebUI界面,并完成一次NER测试(比如输入“马云是阿里巴巴创始人”,Schema为{"人物": null, "组织机构": null}),就代表后端一切就绪。
注意:不要修改
app_standalone.py里的launch()参数,尤其别加server_name="0.0.0.0"——我们不需要它直接暴露在外部网络,Nginx会负责转发。
2.2 检查系统必备组件
你需要一台运行Ubuntu 20.04/22.04或CentOS 7+/Rocky Linux 8+的服务器,且满足以下条件:
- 已安装
nginx(版本≥1.18) - 已安装
openssl(用于生成自签名证书) python3和pip可用(RexUniNLU依赖已装好)- 有
sudo权限(配置Nginx和证书需root)
快速验证命令:
nginx -v openssl version python3 --version如果Nginx未安装,Ubuntu/Debian执行:
sudo apt update && sudo apt install -y nginxCentOS/Rocky执行:
sudo dnf install -y nginx安装后立即启用并开机自启:
sudo systemctl enable nginx sudo systemctl start nginx此时访问服务器IP(如http://192.168.1.100),应看到Nginx默认欢迎页。
2.3 规划你的内网域名与路径
虽然你没有公网DNS,但在内网自己配一个“假域名”非常简单,而且能让整个流程更贴近真实场景。我们推荐使用.internal后缀(如nlu.internal),它不会与公网冲突,也符合RFC标准。
你需要做两件事:
- 在服务器本机
/etc/hosts中添加一行:127.0.0.1 nlu.internal - 如果团队其他成员也要访问,让他们也在各自电脑的
/etc/hosts(Mac/Linux)或C:\Windows\System32\drivers\etc\hosts(Windows)里加上同样一行,指向你的服务器IP。
这样,所有人访问https://nlu.internal时,都会被解析到你的服务器,而Nginx会接管后续所有请求。
3. 生成并配置HTTPS证书
3.1 创建证书存放目录
我们把证书统一放在/etc/nginx/ssl/下,便于管理:
sudo mkdir -p /etc/nginx/ssl cd /etc/nginx/ssl3.2 生成自签名SSL证书(适用于内网)
内网环境无需购买商业证书,用OpenSSL生成一套可信的自签名证书即可。执行以下命令(注意替换nlu.internal为你实际规划的域名):
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \ -keyout /etc/nginx/ssl/nlu.internal.key \ -out /etc/nginx/ssl/nlu.internal.crt \ -subj "/C=CN/ST=Beijing/L=Beijing/O=Internal/CN=nlu.internal"这条命令会生成两个文件:
nlu.internal.key:私钥(必须严格保护,不可泄露)nlu.internal.crt:公钥证书(将被Nginx加载)
验证证书是否有效:
sudo openssl x509 -in /etc/nginx/ssl/nlu.internal.crt -text -noout | grep "Subject:"
应输出包含CN=nlu.internal的行。
3.3 (可选)让浏览器信任该证书
如果你用Chrome/Firefox访问https://nlu.internal时看到“您的连接不是私密连接”警告,可以手动将nlu.internal.crt导入系统或浏览器的受信任根证书颁发机构。具体步骤因系统而异,但核心是:把.crt文件双击→选择“始终信任”→输入密码确认。导入后刷新页面,警告即消失。
4. 配置Nginx反向代理规则
4.1 编写专属站点配置文件
Nginx推荐为每个服务单独建配置文件,避免污染默认配置。创建:
sudo nano /etc/nginx/conf.d/nlu.internal.conf粘贴以下完整配置(已针对RexUniNLU WebUI深度优化):
upstream rexuninlu_backend { server 127.0.0.1:7860; } server { listen 443 ssl http2; server_name nlu.internal; # SSL证书配置 ssl_certificate /etc/nginx/ssl/nlu.internal.crt; ssl_certificate_key /etc/nginx/ssl/nlu.internal.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # 安全加固头 add_header X-Frame-Options "DENY" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline' 'unsafe-eval'; frame-ancestors 'none';" always; # Gradio WebUI关键代理设置 location / { proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; 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_redirect http:// https://; proxy_pass http://rexuninlu_backend; proxy_read_timeout 300; proxy_send_timeout 300; } # 静态资源缓存(提升Gradio加载速度) location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ { expires 1y; add_header Cache-Control "public, immutable"; } } # HTTP自动跳转HTTPS(强制加密) server { listen 80; server_name nlu.internal; return 301 https://$server_name$request_uri; }4.2 关键配置项说明
upstream rexuninlu_backend:定义后端服务地址,这里固定指向127.0.0.1:7860,即RexUniNLU WebUI。proxy_set_header Upgrade $http_upgrade和Connection "upgrade":这是Gradio WebSocket通信必需的,否则WebUI里实时响应、进度条等功能会失效。X-Forwarded-*系列头:确保RexUniNLU日志里记录的是真实客户端IP,而非Nginx本机IP。proxy_read/send_timeout 300:RexUniNLU处理复杂schema(如嵌套事件抽取)可能耗时较长,设为300秒防超时中断。Content-Security-Policy:专为Gradio定制,允许内联脚本和动态加载,同时禁止外链,兼顾功能与安全。
4.3 启用配置并重启Nginx
保存文件后,先检查语法是否正确:
sudo nginx -t输出syntax is ok且test is successful,即可重载配置:
sudo systemctl reload nginx小技巧:如果后续修改了Nginx配置,都用
reload而非restart,它会平滑切换,不中断现有连接。
5. 启动RexUniNLU并验证全流程
5.1 启动模型服务(保持后台运行)
回到RexUniNLU项目目录,用nohup让服务在后台持续运行:
cd /root/nlp_deberta_rex-uninlu_chinese-base nohup python3 app_standalone.py > nlu.log 2>&1 &查看是否启动成功:
ps aux | grep app_standalone应看到类似python3 app_standalone.py的进程。
5.2 浏览器访问验证
现在,在已配置好/etc/hosts的任意设备上,打开浏览器,输入:
https://nlu.internal你应该看到:
- 地址栏显示锁形图标(表示HTTPS已生效)
- 页面完全加载,Gradio UI与本地
http://localhost:7860一模一样 - 输入测试文本,点击Submit,结果正常返回
这表示:
- Nginx成功接收HTTPS请求
- 正确转发到本地7860端口
- WebSocket握手成功,所有交互功能完好
5.3 命令行curl验证(可选)
如果你习惯用命令行,也可以用curl模拟请求,确认底层通路:
curl -k https://nlu.internal-k参数忽略证书验证(因为是自签名)。返回内容应包含<title>Gradio</title>等HTML片段,证明Nginx代理层工作正常。
6. 常见问题排查与优化建议
6.1 “无法访问此网站”或“连接被拒绝”
- 检查
nlu.internal是否已正确写入/etc/hosts,且IP无误 - 执行
sudo ss -tuln | grep ':443',确认Nginx正在监听443端口 - 执行
sudo ss -tuln | grep ':7860',确认RexUniNLU进程在监听7860(注意:它应只监听127.0.0.1:7860,而非0.0.0.0:7860) - 查看Nginx错误日志:
sudo tail -f /var/log/nginx/error.log
6.2 WebUI加载卡在“Connecting…”或按钮无响应
这几乎100%是WebSocket配置问题。请重点检查:
nlu.internal.conf中location /块内是否完整包含proxy_set_header Upgrade和Connection "upgrade"两行- 是否遗漏了
proxy_http_version 1.1 proxy_pass末尾是否有斜杠?必须是http://rexuninlu_backend(无斜杠),否则路径会被错误拼接
6.3 如何让RexUniNLU开机自启(生产级建议)
把RexUniNLU服务做成systemd单元,比nohup更可靠。创建:
sudo nano /etc/systemd/system/rexuninlu.service内容如下:
[Unit] Description=RexUniNLU NLU Service After=network.target [Service] Type=simple User=root WorkingDirectory=/root/nlp_deberta_rex-uninlu_chinese-base ExecStart=/usr/bin/python3 /root/nlp_deberta_rex-uninlu_chinese-base/app_standalone.py Restart=always RestartSec=10 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target启用并启动:
sudo systemctl daemon-reload sudo systemctl enable rexuninlu sudo systemctl start rexuninlu此后RexUniNLU将随系统启动,且崩溃后自动重启。
6.4 性能小贴士:加速首次加载
RexUniNLU首次加载模型较慢(约30-60秒),用户可能误以为卡死。可在Nginx配置中加入proxy_cache缓存静态资源(JS/CSS),或在Gradio启动时加share=False, server_port=7860, server_name="127.0.0.1"参数确保最小化开销。实测开启GPU后,推理延迟可降至1-2秒内,大幅提升体验。
7. 总结:你已掌握内网AI服务安全交付的核心能力
到此为止,你已完成一项典型的AI工程化落地任务:
- 将一个本地运行的Gradio WebUI,通过Nginx反向代理封装为标准HTTPS服务
- 使用自签名证书实现内网通信加密,杜绝明文传输风险
- 配置了WebSocket支持、安全响应头、静态资源缓存等生产级细节
- 掌握了从启动、验证到排错的完整闭环方法论
这套模式不仅适用于RexUniNLU,对任何基于Flask/FastAPI/Gradio构建的NLP工具、模型演示站、内部标注平台都通用。下次当你需要把一个Hugging Face Demo、LangChain应用或自研模型接口“搬进”公司内网时,这套Nginx+HTTPS组合拳就是最值得信赖的起点。
更重要的是,你不再只是“跑通模型”,而是真正开始思考:如何让AI能力以安全、稳定、易用的方式,触达真实业务场景中的每一个使用者。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。