Nginx+Docker+Angular部署时上游请求路径缺失问题求助
Nginx+Docker+Angular部署时上游请求路径缺失问题求助
看起来你遇到了两个核心问题:连接被拒绝和上游请求路径缺失,我来一步步帮你排查解决:
首先解决「连接被拒绝」的问题
你的servertwo容器用的是nginx:stable-alpine镜像,这个镜像默认的Nginx是监听80端口的,但你在Dockerfile里只EXPOSE 4201却没修改Nginx的监听端口配置。这就导致主Nginx尝试连接servertwo:4201时,根本没有服务在这个端口上响应,所以出现了111: Connection refused的错误。
有两种修复方式:
- 方式一:修改主Nginx的代理端口
直接把主Nginx配置里的proxy_pass目标端口改成80(servertwo容器实际监听的端口):location /profile { proxy_pass http://servertwo:80/profile; proxy_intercept_errors on; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-XSS-Protection "1; mode=block" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; add_header Content-Security-Policy "default-src * data: 'unsafe-eval' 'unsafe-inline'" always; } - 方式二:修改servertwo容器的Nginx监听端口
先给servertwo创建一个自定义Nginx配置文件(比如servertwo-nginx.conf):
然后修改servertwo的Dockerfile,复制这个配置并把构建后的Angular文件放到对应路径:server { listen 4201; root /var/www/html; index index.html index.htm; # 处理Angular路由刷新的问题,避免直接访问子路径返回404 location /profile/ { try_files $uri $uri/ /profile/index.html; } }FROM node:18.8.0-alpine AS servertwo-build WORKDIR /usr/src/servertwo COPY . . RUN npm ci && npm run build FROM nginx:stable-alpine # 替换默认Nginx配置 COPY servertwo-nginx.conf /etc/nginx/conf.d/default.conf # 把Angular构建产物放到/profile路径下,对应baseHref配置 COPY --from=servertwo-build /usr/src/servertwo/dist/servertwo /var/www/html/profile EXPOSE 4201
然后解决「上游路径缺失」的问题
你当前的主Nginx配置proxy_pass http://servertwo:4201/profile;其实逻辑是对的:当收到/profile/home请求时,Nginx会把匹配/profile后的/home追加到代理路径后,最终代理到http://servertwo:4201/profile/home。
出现路径缺失的可能原因:
- 之前的配置缓存没清:重启主Nginx容器,确保新配置生效。
- Angular构建产物的路径没对应上:你已经在
angular.json里设置了"baseHref": "/profile/",构建后的文件需要放到servertwo容器的/var/www/html/profile目录下(对应上面方式二的Dockerfile配置),这样servertwo的Nginx才能正确找到资源。
最后验证配置
- 重启所有相关容器,确保所有配置修改都生效。
- 可以在主Nginx容器里执行
curl http://servertwo:80/profile/home(如果用方式一),测试是否能正常返回Angular页面。 - 查看servertwo容器的Nginx日志,确认请求路径是否正确到达。
备注:内容来源于stack exchange,提问作者Galina
相关产品推荐
相关产品推荐

