Docker Compose和Nginx反向代理:我无法通过代理访问后端

我有一个包含3个容器的项目:反向代理容器(jwilder-nginx-proxy image),fontend容器(nginx容器,用于开发和绑定Vue js的应用程序)和一个后端容器(一个Node6容器提供NodeJs + ExpressJs应用程序)。 后端和前端均位于反向代理之后。 下面是它应该如何在我的本地主机上工作:

  1. 访问http:// localhost:80 /并为gui服务
  2. gui应该通过http:// localhost:3500从后端检索数据

一切似乎都工作得很好,除了后端容器。 当我尝试访问后端时,出现“502错误网关”错误。 这里是什么nginx日志:

2017/12/19 06:47:28 [error] 6#6: *3 connect() failed (111: Connection refused) while connecting to upstream, client: 172.22.0.1, server: , request: "GET /favicon.ico HTTP/1.1", upstream: "http://172.22.0.3:3000/favicon.ico", host: "localhost:3500", referrer: "http://localhost:3500/" 
  • GUI加载完全正常。 我对后端使用相同的逻辑,但没有任何工作。
  • 后端应用绑定到端口3000内部的容器,并映射到3500以外。

在我的后端Dockerfile中,我使用了这个:

 EXPOSE 3000 

这里是我的docker-compose.yml文件:

  version: '3' services: api: image: myapp/api restart: always networks: - myapp_network gui: image: myapp/gui restart: always networks: - myapp_network reverse: image: nginx-reverse depends_on: - api - gui ports: - 80:8080 - 3500:3500 restart: always volumes: - /var/run/docker.sock:/tmp/docker.sock networks: - myapp_network networks: myapp_network: driver: bridge 

gui也是如此,gui是一个nginx服务器,在容器内部监听8080,并映射到外部80端口,我在Dockerfile中使用了这个:

 EXPOSE 8080 

我相信我的nginx.conf文件(我用来configuration反向代理而不是GUI应用程序)有一些问题:

nginx.conf(反向代理configuration):

 http { sendfile on; upstream myapp-api { server api:3000; } server { listen 3500; add_header Access-Control-Allow-Origin * always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Content-Type'; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; location / { proxy_pass http://myapp-api/; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } upstream myapp-gui { server gui:8080; } server { listen 8080; add_header Access-Control-Allow-Origin * always; add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS'; add_header 'Access-Control-Allow-Headers' 'Content-Type'; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; location / { proxy_pass http://myapp-gui; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; } } } 

在我的docker-compose文件中是否有错误? 或者nginxconfiguration? 我对前端和后端都使用相同的逻辑。 只有后端不工作。 前端正在工作。

我没有使用nginx-reverse-proxy的Dockerfile中的expose指令,因为我正在映射撰写文件中的端口。

希望有人能帮助我。

谢谢

编辑:似乎一切都configuration好。 问题是节点的js应用程序。 看起来像Nginx不能处理请求到一个nodejs应用程序… anone可以帮助吗?

对于每个有同样问题的人,这里是解决scheme: – 从nginxconfiguration中删除访问控制设置。 Hande在Nodejs应用程序中的Cors。 – 如果您在nginx.conf中使用“localhost”,请configurationNodeJs Express应用程序以使用ipv6(而不是.listen('localhost')put .listen('::'))。 – 如果这个问题仍然存在,请确保您完成了前两个步骤,并将您的networking模式切换到主机:如果您使用的是Docker compose v2,请为每个容器添加“network_mode:host”。 或者–network = docker运行的主机。