为什么企业偏爱子目录部署?以及如何“破解”ONLYOFFICE的限制

51 阅读4分钟

 在实际的企业运维、Web 架构设计以及多系统整合场景中,将应用部署到 Nginx 子目录(Subdirectory) 是一种非常常见且实用的方式。本文将从原理、典型应用场景、注意事项入手,系统讲解 Nginx 子目录部署 的常见模式,并重点讨论 ONLYOFFICE Document Server 是否能部署到子目录?如何实现?需要注意什么?


一、为什么将应用部署到 Nginx 子目录?

将应用部署到子目录,例如:

相比独立子域名(如  office.example.com )有以下优势:

1. 单域名管理多个应用

同一个域名下运行多个系统,无需额外开子域名或端口,降低 DNS、证书、网关管理复杂度。

2. 更友好的网络拓扑,减少端口暴露

后端真实端口(如 3000/8082)隐藏在内网。

用户访问 → Nginx → 内网应用

提升系统安全性。

3. 兼容性好,适用于旧系统或第三方组件

一些程序不支持自定义端口或必须使用固定目录,通过 Nginx Subdirectory 可轻松适配。

4. 前后端独立部署,多应用共存

多个 SPA、后端服务、脚本工具可通过不同路径共存于一个域名下。


二、Nginx 子目录常见部署模式

1. 子目录反向代理后端服务

最典型场景:访问  /app/ → 转发到内网 3000 端口。

location /app/ {
    proxy_pass http://127.0.0.1:3000/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

✔  proxy_pass  末尾  /  不能漏,否则路径拼接错误。


2. 子目录部署静态前端(Vue/React/Angular)

location /app/ {
    alias /var/www/app/;
    try_files $uri $uri/ /app/index.html;
}

注意区别:

  •  root  会自动拼接子目录;
  •  alias  适合子目录映射;

前端框架必须配置 base path

Vue Router:

base: '/app/'

React:

PUBLIC_URL=/app/

3. 多应用复合部署示例

server {
    listen 80;
    server_name example.com;

    location /admin/ {
        proxy_pass http://127.0.0.1:8080/;
    }

    location /app/ {
        alias /var/www/app/;
        try_files $uri $uri/ /app/index.html;
    }

    location /api/ {
        proxy_pass http://127.0.0.1:9000/;
    }
}

三、子目录部署需要特别注意的问题

1. 路径斜杠细节

 /app  与  /app/  在 Nginx 中完全不同,会影响 proxy_pass 拼接规则。

2. alias vs root

子目录使用 alias 更自然,否则路径容易错误。

3. SPA 路由需要 try_files 重写 index.html

否则刷新页面会 404。

4. 资源路径必须带前缀

如果前端或后端写死根路径  / ,放在子目录下会立即失效。

这点对于 ONLYOFFICE 非常关键。


四、ONLYOFFICE 能否部署到子目录?

官方明确:ONLYOFFICE Document Server 不支持子目录部署(8以前版本)

ONLYOFFICE 默认所有路径都写死为根路径  /  :

/web-apps/
/doc/...
/sdkjs/
/fonts/
/cache/

直接代理到  /office/  会导致:

  • 静态资源加载失败
  • WebSocket 无法连接
  • 编辑器界面打不开
  • “Document Server is not available”

但实际生产中,企业确实有必须将 OnlyOffice 放到子目录的需求,例如:

https://example.com/office/

因此,虽然官方宣称不支持,但翻阅9.1版本代码 ,可以通过 Nginx + 路径重写 + sub_filter 的方式实现子目录部署

接下来讲如何实现。


五、ONLYOFFICE 子目录部署可行方案(实战验证可用)

1. 部署架构

外部访问路径:

https://example.com/office/

Document Server 内部服务:

http://127.0.0.1:8082/

六、Nginx 子目录代理 ONLYOFFICE 配置(可用示例)

子目录部署需要你在前一层的代理服务器上配置转发规则,并携带关键头部信息。

只需增加 proxy_set_header X-Forwarded-Prefix /myeditor(根据实际配置,以下三处myeditor保持一致) ;具体如下:


location /myeditor/ {

proxy_pass http://127.0.0.1:9000/;

# 代理头设置

proxy_set_header X-Forwarded-Prefix /myeditor;

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 REMOTE-HOST $remote_addr;

proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header X-Forwarded-Port $server_port;

proxy_set_header X-Forwarded-Host $host;

# Websocket 支持

proxy_set_header Upgrade $http_upgrade;

proxy_set_header Connection "upgrade";

proxy_http_version 1.1;

# 超时设置

proxy_read_timeout 3600s;

proxy_send_timeout 3600s;

proxy_connect_timeout 60s;

# 缓冲和重定向

proxy_buffering off;

proxy_redirect off;

# Cookie 路径处理 - 如果后端应用需要

# proxy_cookie_path / /myeditor/;

# 缓存头

add_header X-Cache $upstream_cache_status;

add_header Cache-Control no-cache;

# SSL 相关

proxy_ssl_server_name on;

proxy_ssl_verify off;

}

七、子目录部署的潜在问题与风险

1. 官方不支持 → 升级可能破坏 rewrite(9以上版本没有明确)

若升级 OnlyOffice 版本,可能需要重新测试 sub_filter 规则。

2. 原生写死的绝对路径太多,rewrite 成本高

尤其是  /web-apps/  与  /doc/  的资源引用。

总结

推荐优先使用 子域名部署: office.example.com 

若企业受限,才使用子目录方案。虽然 ONLYOFFICE 子目录部署可行,但需要清晰认识到其兼容性问题和维护成本。因此生产环境更建议使用子域名;若必须使用子目录部署,务必充分测试静态资源、WebSocket、协作文档保存等关键功能。

 相关资源


OnlyOffice最新版本镜像,可访问:  OnlyOffice9.x  

版本介绍:  documentserver 中国版  

OnlyOffice 中国版技术交流:qm.qq.com/q/YzEIuNe1y…