如何用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; } }
关键修改点说明:
- 移除错误rewrite规则:原来
location /里的rewrite ^/$ /inventory/ permanent;会把根路径请求强制跳转到库存应用,完全不符合需求,直接删除即可。 - 用alias替换root处理库存路径:
- 若用
root,Nginx会把请求路径拼接在root路径后,比如请求/inventory/js/app.js会去/opt/mydomain/inventory/inventory-frontend/dist/inventory/js/app.js找文件,而你的静态文件实际在dist/根目录下,用alias直接映射到dist/才是正确的。
- 若用
- 补全HTTPS配置:原来的主server块没监听443端口,导致HTTP跳转HTTPS后无对应配置,这里补上了Certbot标准SSL配置(若你的Certbot已自动生成,确保监听端口正确即可)。
- 优化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
相关产品推荐
相关产品推荐

