【问题标题】:Connect simple docker compose to nginx?将简单的docker compose连接到nginx?
【发布时间】:2019-08-06 19:27:54
【问题描述】:

我在这方面已经很长时间了,但我似乎无法解决这个问题。我真的被困住了......所以我求助于你们。

我正在尝试一些可能很简单的东西。我想使用 nginx 作为前端的反向代理。

Docker-compose

version: '3.7'

services:
  frontend:
    expose:
      - 9080
    build: "./"...""
    volumes:
      - ./"..."/build:/usr/src/kitschoen-rj/
  nginx:
    build: ./nginx
    volumes:
      - static_volume:/usr/src/"..."/staticfiles
    ports:
      - 8080:8080
    depends_on:
      - restapi

volumes:
  static_volume:

nginx.conf

upstream kitschoen_frontend {
    server frontend:9080;
}

server {

    listen 8080;

    location / {
        proxy_pass http://kitschoen_frontend;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

}

我根本想不通,为什么我在访问“localhost:8080”时收到“Bad Gateway”错误。

【问题讨论】:

  • 您的前端容器已启动并在容器内监听 0.0.0.0:9080? (不是本地主机)。
  • kitschoen_docker_frontend "nginx -g 'daemon of ..." 19 分钟前 Up 4 seconds 80/tcp, 9080/tcp kitschoen_docker_frontend_1
  • 是的,据我所知,docker 容器已启动并运行,正在侦听端口 9080。如果我自己构建 react 映像,它可以正常工作。我可以在本地主机上看到页面。
  • 这可能是由于 nginx 启动并在您的 API 准备好之前尝试到达上游造成的。请参阅此帖子:stackoverflow.com/questions/32845674/… 尝试docker exec -it nginx sh 并运行getent hosts frontend,它应该返回您尝试运行的前端容器的IP。使用 curl 或 wget(例如 curl frontend:9080)验证它是否正在响应,如果它确实检查 nginx 错误日志以确保它能够在启动时加入前端。
  • 感谢您的回答。 getent 主机前端返回了 ip。但是在容器上运行 wget frontend: 9080 返回:Connecting to frontend:9080 (xxx.xx.x.x:9080) wget: can't connect to remote host (xxx.xxx.x.x): Connection refused。我不确定这告诉我什么

标签: docker nginx


【解决方案1】:

经过一些认真的故障排除后,我结束了我的折磨。这个问题完全是愚蠢的。我为我的 react 应用程序创建了一个多阶段构建,它还为 react 应用程序提供了一个 nginx 服务器(这确实减少了 react 的图像大小)。

但是 react nginx 服务器为 react 应用程序暴露了端口 80 并相应地转发所有请求。

So 解决方案是将我的 nginx.conf 更改为:

upstream kitschoen_frontend {
    server frontend:80;
}

server {

    listen 8080;

    location / {
        proxy_pass http://kitschoen_frontend;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;
        proxy_redirect off;
    }

}

多么可怕的一天! 如果您到目前为止阅读了这篇文章,并且您认为通过单独的 nginx 服务器为我的前端提供服务的方法是非常糟糕的设计。请随时告诉我...

【讨论】:

  • 不,我猜你是在正确的轨道上。我们还使用 nginx 作为反向代理来为多个 webapps 自动配置 https。我已经在你的另一个问题中发布了the answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 2018-07-21
  • 2015-05-19
  • 2020-09-19
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多