You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Nginx在单域名下通过不同端点部署两个Web应用并避冲突

问题分析与解决方案

你的核心问题出在根路径location里的错误rewrite规则,它把访问根路径的请求强制跳转到了/inventory/,直接违背了你的需求;另外Nginx的静态文件路径映射也存在逻辑问题,加上HTTPS的server块配置不完整,导致冲突和访问异常。

以下是修正后的完整配置,附带关键修改说明:

# HTTP 跳转 HTTPS(保留Certbot的配置)
server {
    listen 80;
    listen [::]:80;
    server_name www.mydomain.com;

    if ($host = www.mydomain.com) {
        return 301 https://$host$request_uri;
    }

    return 404;
}

# HTTPS 主配置块
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name www.mydomain.com;

    # 替换为你Certbot生成的证书路径,通常自动配置,缺失则手动添加
    ssl_certificate /etc/letsencrypt/live/www.mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/www.mydomain.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # 库存应用:匹配 /inventory/ 开头的请求
    location /inventory/ {
        # 使用alias代替root,避免路径拼接错误
        # 请求 /inventory/index.html 时,直接指向dist目录下的index.html
        alias /opt/mydomain/inventory/inventory-frontend/dist/;
        try_files $uri $uri/ /inventory/index.html;
    }

    # 用户应用:匹配根路径及其他未被捕获的请求
    location / {
        # 删除原来错误的rewrite规则
        root /opt/mydomain/frontend-build/build;
        try_files $uri $uri/ /index.html;
    }

    # 库存应用API:长前缀优先匹配,不会和/api冲突
    location /inventory/api/ {
        proxy_pass http://127.0.0.1:6091/;
        # 可选:添加代理头传递客户端真实信息
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 用户应用API
    location /api/ {
        proxy_pass http://127.0.0.1:3030/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

关键修改点说明:

  1. 移除错误rewrite规则:原来location /里的rewrite ^/$ /inventory/ permanent;会把根路径请求强制跳转到库存应用,完全不符合需求,直接删除即可。
  2. 用alias替换root处理库存路径:
    • 若用root,Nginx会把请求路径拼接在root路径后,比如请求/inventory/js/app.js会去/opt/mydomain/inventory/inventory-frontend/dist/inventory/js/app.js找文件,而你的静态文件实际在dist/根目录下,用alias直接映射到dist/才是正确的。
  3. 补全HTTPS配置:原来的主server块没监听443端口,导致HTTP跳转HTTPS后无对应配置,这里补上了Certbot标准SSL配置(若你的Certbot已自动生成,确保监听端口正确即可)。
  4. 优化API路径处理:在proxy_pass结尾加/,确保路径传递正确(比如/inventory/api/list会转发到http://127.0.0.1:6091/list),且长前缀的/inventory/api/会优先匹配,不会和/api/冲突。

验证步骤:

  • 重启Nginx:sudo nginx -s reload
  • 访问https://www.mydomain.com:打开用户应用
  • 访问https://www.mydomain.com/inventory:打开库存应用
  • 测试API:https://www.mydomain.com/api/xxx转发到3030端口,https://www.mydomain.com/inventory/api/xxx转发到6091端口

内容的提问来源于stack exchange,提问作者naved17

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:43:15