# 基于 Nginx 的统一入口多业务代理方案

# 背景

随着OA系统的持续迭代和功能不断扩展,除OA外,还有数科、文档通、Comi、BI 等多个服务需要独立部署并暴露端口到客户端。这些系统在技术架构、运行环境及访问方式上各不相同,通常以不同的 IP 地址和端口对外提供服务。

在实际使用和运维过程中,逐渐暴露出以下问题和需求:

  • 客户端访问入口分散,不利于统一管理;

  • 多服务对外暴露端口,增加网络、防火墙及安全策略配置成本;

  • 后端服务地址变更时,客户端侧需要频繁调整配置,系统耦合度较高。

为解决上述问题,有必要在客户端与后端服务之间引入统一的代理层,由代理层对外提供访问入口,并根据请求特征将流量转发至对应的后端服务。Nginx 作为成熟、稳定的反向代理组件,能够满足多服务代理、灵活路由及统一管理的需求。

在代理方式的选择上,常见方案包括以下三种:

  • 1、不同域名 + 同端口 通过不同的子域名区分后端服务(如 oa.seeyon.com、comi.seeyon.com),端口保持一致。 该方式语义清晰,扩展性好,客户端和运维侧配置相对规范,推荐作为首选方案。

  • 2、同域名 + 不同端口 通过同一域名下的不同端口区分服务(如 oa.seeyon.com:8081、oa.seeyon.com:8082)。 实现简单,但端口暴露较多,不利于安全管控和客户端统一配置,通常不作为长期方案。

  • 3、同域名 + 同端口,通过 location 区分 在同一域名和端口下,根据 URL 路径(/seeyon、/ai-manager、/suwell 等)将请求转发至不同后端服务。 该方式可进一步减少对外暴露入口,适用于特定部署和兼容性场景。

基于以上背景和需求,本文档将说明如何通过 Nginx 构建统一代理入口,并结合实际场景对不同代理方式进行说明与配置示例,为 OA 及其关联服务提供清晰、可扩展的访问方案。

# 同域名同端口下基于 Location 的多业务代理配置

# 演示环境介绍

以下数科、Comi等服务均以默认端口举例,为区分数科是否带签章版本,这里以不同IP服务器为例

  • 对外域名:https://oa.seeyon.com/
  • Nginx:10.13.213.1:443
  • OA主:10.13.217.1:8080
  • OA从:10.13.217.2:8080
  • 数科带签章:10.13.217.3:81、10.13.217.3:8080
  • 数科不带签章:10.13.217.4:8080
  • Comi-Builder(AI-Manager):10.13.217.5:8181
  • BI:10.13.217.6:8058
  • 文档通:10.13.217.7:80

# 配置文件结构

数科不带签章

nginx/conf/ ├── nginx.conf ├── comi.conf ├── bi.conf ├── suwell-viewer.conf ├── wdt.conf

数科带签章 nginx/conf/ ├── nginx.conf ├── comi.conf ├── bi.conf ├── dzqz-weboffice.conf ├── wdt.conf

# 详细配置文件

随着Comi功能的不断迭代,不同版本下 comi.confbi.conf 配置文件可能有所差异,请参考AI应用手册 (opens new window)中指定版本的comi代理配置

注意:请完全复制location下的请求头设置,保持完全一致。

以OA代理配置为例(数科文档通需要开启websocket):

location / {
    ...
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}

# 文档通配置

  • wdt.conf
location /web-apps/ {
    proxy_pass http://wdt;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}

location /1.6.72-1/ {
    proxy_pass http://wdt;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}

location /cache/ {
    proxy_pass http://wdt;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /healthcheck {
    proxy_pass http://wdt;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}

# 数科不带签章

  • nginx.conf
# 代理OA服务
upstream seeyon_v5_cluster {
    sticky;
    server 10.13.217.1:8080 max_fails=300 fail_timeout=30s;
    server 10.13.217.2:8080 max_fails=300 fail_timeout=30s;
}

# 代理Comi-Builder(AI-Manager)
upstream ai_manager {
    server 10.13.217.5:8181;
}

# 代理BI
upstream data_pulse {
    server 10.13.217.6:8058;
}

# 代理数科服务
upstream suwell_viewer {
    10.13.217.4:8080;
}

# 代理文档通
upstream wdt {
    10.13.217.7:80;
}

server {
    listen 443 ssl;
    server_name  oa.seeyon.com;
    ssl_certificate ssl/www.seeyon.com.pem;
    ssl_certificate_key ssl/www.seeyon.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    charset utf-8;

    # 关联配置文件
    include comi.conf;
    include bi.conf;
    include suwell-viewer.conf;
    include wdt.conf;

    location / {
        proxy_pass http://seeyon_v5_cluster;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect http:// $scheme://;
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
  • suwell-viewer.conf
location /web-reader/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /office/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /api/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /websocket/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}

# 数科带签章

  • nginx.conf
# 代理OA服务
upstream seeyon_v5_cluster {
    sticky;
    server 10.13.217.1:8080 max_fails=300 fail_timeout=30s;
    server 10.13.217.2:8080 max_fails=300 fail_timeout=30s;
}

# 代理Comi-Builder(AI-Manager)
upstream ai_manager {
    server 10.13.217.5:8181;
}

# 代理BI
upstream data_pulse {
    server 10.13.217.6:8058;
}

# 代理数科服务(注意带签章版本有2个upstream)
upstream suwell_viewer {
    10.13.217.3:81;
}
upstream dzqz_weboffice {
    10.13.217.3:8080;
}

# 代理文档通
upstream wdt {
    10.13.217.7:80;
}

server {
    listen 443 ssl;
    server_name  oa.seeyon.com;
    ssl_certificate ssl/www.seeyon.com.pem;
    ssl_certificate_key ssl/www.seeyon.com.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    charset utf-8;

    # 关联配置文件
    include comi.conf;
    include bi.conf;
    include dzqz-weboffice.conf;
    include wdt.conf;

    location / {
        proxy_pass http://seeyon_v5_cluster;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_redirect http:// $scheme://;
        proxy_connect_timeout 300;
        proxy_read_timeout 300;
        proxy_send_timeout 300;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
  • dzqz-weboffice.conf
location /web-reader/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /office/ {
    proxy_pass http://dzqz_weboffice;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /api/ {
    proxy_pass http://dzqz_weboffice;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /websocket/ {
    proxy_pass http://dzqz_weboffice;
    proxy_http_version 1.1;

}
location /reader/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /microSealWe/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}

location /sealWeb/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /sealWebPlugins/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /managementCenter/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /sealMakerWeb/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /sealPublishWeb/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /elsh5sign/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /publicLoginPage/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /sealmaker/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /management/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
location /elseal/ {
    proxy_pass http://suwell_viewer;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header REMOTE-HOST $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect http:// $scheme://;
    proxy_connect_timeout 300;
    proxy_read_timeout 300;
    proxy_send_timeout 300;
}
编撰人:wangyxyf