nginx-proxy.md 5.6 KB

生产部署:nginx 需代理的接口

与 dist/DEPLOY-nginx-proxy.md 同源说明,便于仓库内查阅。
打生产包时请同步更新 dist/ 内副本(或重新 npm run build 后覆盖写入)。

前端请求均为同源路径,协议由 nginx 决定(http/https)。
下列「参考上游」为开发/测试机地址,政务网部署请改成内网实际地址与端口。

一、四条反向代理(必配)

前端前缀 改写 参考上游(外网测试) 用途
/chat-api/ 剥掉 /chat-api http://192.168.2.23:8000 对话 SSE、企业分类
/dms/ 直通(不改路径) http://121.43.55.7:10081 DMS 数据 / 文件 / 政策库静态文件
/oauth/ 直通 http://121.43.55.7:10086 未登录访客换 DMS token
/api/ 剥掉 /api http://121.43.55.7:10011 取本机 IP、NLS 语音 token

说明:

  • 页面若是 HTTPS、上游是 HTTP,必须由 nginx 转发,浏览器不能直连上游(混合内容)。
  • DMS 鉴权头名是 token(不是 Authorization)。前端会自己带;nginx 不要覆盖已有 token 头(可选:请求未带时再注入兜底 token)。

二、各前缀下前端实际调用的路径

1. /chat-api/ → 聊天后端(剥前缀后)

方法 浏览器请求 上游真实路径
POST(SSE) /chat-api/api/chat /api/chat
POST /chat-api/api/company/classify /api/company/classify

对应 env:VITE_CHAT_API="/chat-api"

2. /dms/ → DMS(直通)

方法 浏览器请求 上游真实路径
POST /dms/content/selectContentList /dms/content/selectContentList
POST /dms/content/addContent /dms/content/addContent
POST /dms/content/updateContent /dms/content/updateContent
POST /dms/content/updateAudit /dms/content/updateAudit(删除=改状态)
POST /dms/file/uploadFile /dms/file/uploadFile
GET /dms/static/file/…(或 photo) 同路径(政策库 json、附件预览)

对应 env:VITE_DMS_API="/dms"
政策库远端相对路径见部署包内 config.js 的 dms.policyRemotePath。

3. /oauth/ → 登录服务(直通)

方法 浏览器请求 上游真实路径
POST /oauth/api/user/login /oauth/api/user/login

对应 env:VITE_OAUTH_LOGIN_URL="/oauth"(代码再拼 /api/user/login)

4. /api/ → 后端网关(剥前缀后)

方法 浏览器请求 上游真实路径
GET /api/proxy/verify/getIPByBrowser /proxy/verify/getIPByBrowser(纯文本 IP)
GET /api/proxy/verify/getALYToken /proxy/verify/getALYToken(NLS token)

对应 env:VITE_GATEWAY_API="/api"

三、不走 nginx 同源代理的请求

目标 说明
VITE_API(当前 //qingpu-data-api.metamaker.cn) 企业登录 / 企业信息,绝对地址,不经上述四条代理。内网若换网关需改 .env.production 后重新构建。
wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1 阿里云实时语音;页面非安全上下文时麦克风入口已隐藏。
https://zwdtuser.sh.gov.cn/… 一网通办企业登录(浏览器整页跳转);回跳白名单需另行对接。
一网通办政策详情等外链 target=_blank 打开,非 XHR。

四、nginx 配置示例(请替换 upstream)

# 静态前端(dist 目录)
root /path/to/dist;
index index.html;
location / {
  try_files $uri $uri/ /index.html;
}

# 对话后端 —— 剥 /chat-api
location /chat-api/ {
  proxy_pass http://<对话机>:<端口>/;   # 注意末尾 /,等价剥前缀
  proxy_http_version 1.1;
  proxy_set_header Host $host;
  proxy_set_header Connection "";
  proxy_buffering off;                  # SSE 建议关闭缓冲
  proxy_read_timeout 3600s;
}

# DMS —— 直通(保留 /dms 前缀)
location /dms/ {
  proxy_pass http://<DMS机>:<端口>;     # 无末尾 /,把完整 URI 转给上游
  proxy_set_header Host $host;
  # 可选:仅当客户端未带 token 时注入兜底(勿覆盖前端已带的 token)
}

# OAuth —— 直通
location /oauth/ {
  proxy_pass http://<OAuth机>:<端口>;
  proxy_set_header Host $host;
}

# 网关 —— 剥 /api
location /api/ {
  proxy_pass http://<网关机>:<端口>/;   # 末尾 / 剥掉 /api
  proxy_set_header Host $host;
}

五、部署后建议自检

# 网关
curl -sS "http://<站点>/api/proxy/verify/getIPByBrowser"
curl -sS "http://<站点>/api/proxy/verify/getALYToken"

# OAuth(应能打到业务层;假账号可能返回业务错误而非 502)
curl -sS -X POST "http://<站点>/oauth/api/user/login" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "userName=x&password=x&clientId=0"

# DMS(需有效 token 头才有数据)
curl -sS -X POST "http://<站点>/dms/content/selectContentList" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -H "token: <JWT>" \
  -d "columnId=<栏目id>&page=0&pageSize=1"

# 聊天(SSE,需按实际协议带 body)
curl -sS -N -X POST "http://<站点>/chat-api/api/chat" \
  -H "Content-Type: application/json" \
  -d '{"thread_id":"ping","question":"ping"}'

六、与运行时配置的关系

文件 作用
本包 config.js DMS 栏目/模型 id、双 c_ 开关、政策库 policyRemotePath(部署后可改,无需重建)
构建期 .env.production VITE_* 同源前缀与 VITE_API(改完需重新 npm run build)

当前 config.js 默认按政务网栏目配置;切互联网见文件内注释。