部署在 docker 容器中的 Nginx 不会暴露部署在另一个 docker 容器中的 nuxtjs(502 Bad Gateway)

Posted

技术标签:

【中文标题】部署在 docker 容器中的 Nginx 不会暴露部署在另一个 docker 容器中的 nuxtjs(502 Bad Gateway)【英文标题】:Nginx deployed in docker container doesn't expose nuxtjs deployed in another docker container (502 Bad Gateway) 【发布时间】:2019-11-11 22:48:14 【问题描述】:

我正在尝试使用 nginx 作为 docker 容器中的代理服务器来运行 nuxtjs 应用程序。所以,我有 2 个容器:nginx 和 nuxt

这是我构建 nuxt 应用程序的方式

FROM node:11.15
ENV APP_ROOT /src
RUN mkdir $APP_ROOT
WORKDIR $APP_ROOT
ADD . $APP_ROOT
RUN npm install
RUN npm run build
ENV host 0.0.0.0

结果似乎还不错

接下来是nginx配置

server 
  listen 80;
  server_name dev.iceik.com.ua;

  location / 
      proxy_pass http://nuxt:3000;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  

我也试过这个 nginx 配置

upstream nuxt 
  server nuxt:3000;

server 
  listen 80;
  server_name dev.iceik.com.ua;

  location / 
      proxy_pass http://nuxt;
      proxy_set_header Host $host;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  

最后是我的 docker-compose 文件

version: "3"

services:
  nuxt:
    build: ./app/
    container_name: nuxt
    restart: always
    ports:
      - "3000:3000"
    command:
      "npm run start"

  nginx:
    image: nginx:1.17
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - nuxt

我可以从 nginx 容器 ping nuxt 容器

这里还有开放的端口

所以,预期的结果是我可以访问我的 nuxt 应用程序。 但是我得到 502 Bad Gateway

你知道为什么 nginx 不暴露我的 nuxt 应用吗?

感谢您的任何建议!

【问题讨论】:

请在访问dev.iceik.com.ua时发布nginx错误日志 尝试curl -k -v http://nuxt:3000检查端口3000是否打开 你好@ThanhNguyenVan 我已经更新了第一篇文章,其中添加了打开端口的屏幕​​截图。然而 curl -k -v nuxt:3000 检索 * 重建 URL 到:nuxt:3000 * 无法解析主机:nuxt * 关闭连接 0 curl:(6) 无法解析主机:nuxt 你明白为什么吗? 访问nginx 容器然后获取curl 检查您的 node.js 是否将端口 3000 公开到 0.0.0.0? 【参考方案1】:

Nodejs 公开localhost:3000 而不是0.0.0.0:3000

请改正。它会工作

【讨论】:

【参考方案2】:

如果您的容器需要相互通信,将它们放入网络总是好的,另一种方法是使用主机网络(仅适用于 linux)。试试下面docker-compose.yml 他们应该可以通过容器名称互相交谈。

version: "3"

services:
  nuxt:
    build: ./app/
    container_name: nuxt
    restart: always
    ports:
      - "3000:3000"
    command:
      "npm run start"
    networks:
      - my_net

  nginx:
    image: nginx:1.17
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./nginx:/etc/nginx/conf.d
    depends_on:
      - nuxt
    networks:
      - my_net

networks:
  my_net:
    driver: "bridge"

【讨论】:

我按照您的建议修改了 docker-compose,但没有帮助。我还在文档中发现默认情况下 Compose 会为您的应用程序设置一个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以通过与容器名称相同的主机名发现。

以上是关于部署在 docker 容器中的 Nginx 不会暴露部署在另一个 docker 容器中的 nuxtjs(502 Bad Gateway)的主要内容,如果未能解决你的问题,请参考以下文章

使用 nginx 反向代理的 Docker 容器内的闪亮服务器不会遵循 301 重定向

使用 EBS 部署多容器 docker 环境(flask 和 nginx)

Linux运维之docker虚拟化部署nginx

Docker容器简单部署nginx

Docker中使用Nginx部署多应用

docker部署nginx服务器