【问题标题】:Setting nginx reverse proxy to serve from another docker container将 nginx 反向代理设置为从另一个 docker 容器提供服务
【发布时间】:2016-10-28 06:30:52
【问题描述】:

我有一个 docker 容器中的应用程序在端口号 3000 上运行,暴露给主机(端口 3050 映射到容器的端口 3000),我想用这个 nginx-proxy 指向像 @ 这样的 URL 987654323@指向/代理http://localhost:3050/users

我的docker-compose.yml 文件中有这个块:

 nginx_service:
   image: jwilder/nginx-proxy
   container_name: nginx_server
   ports:
    - "80:80"
    - "443:443"
   volumes:
    - ./ssl_certs:/etc/nginx/certs
    - /var/run/docker.sock:/tmp/docker.sock:ro

下面是docker-compose.yml 中定义的容器,它在 docker 容器的 3000 端口上运行我的应用程序:

api:
   build: .
   container_name: api
   environment:
    - VIRTUAL_HOST= service.myserver.com
    - VIRTUAL_PROTO=https
   volumes:
    - "./API:/host"
   links:
    - Mongo:Mongo
   ports:
    - "3050:3000"

启动 docker 容器后,我可以在浏览器中打开 http://localhost:3050/users,但不能打开 http://localhost/users,这会导致 Service Temporarily Unavailable 出现 503 错误。

也许我的整个想法都错了,有人可以用 nginx 反向代理帮助或纠正我吗?

【问题讨论】:

  • 需要在nginx配置中添加转发规则。你做到了吗?
  • 其实不是转发规则的原因。谢谢

标签: nginx docker reverse-proxy docker-compose


【解决方案1】:

在进行了一些搜索之后,我能够将一个有效的 docker-compose.yml 汇集到 node.js基于 Web 应用程序,我在一个单独的容器中。

使其发挥作用的关键如下:

  1. 在nginx反向代理容器中设置VIRTUAL_HOST=port,这个port应该是我的node.js应用在其容器中运行的端口(不是映射到主机上的端口!)
  2. 如果你想让 nginx 反向代理在https,你应该设置一个 SSL 证书,但应该在 web 应用容器中将http(不是 https)设置为环境变量VIRTUAL_PROTO=http

下面是工作中的 docker-compose.yml

nginx_service:
   image: jwilder/nginx-proxy
   container_name: nginx_server
   ports:
    - "80:80"
    - "443:443"
   volumes:
    - ./ssl_certs:/etc/nginx/certs
    - /var/run/docker.sock:/tmp/docker.sock:ro
   environment:
    - VIRTUAL_PORT=3000  # 3050 port on host does not work!


api:
   build: .
   container_name: api
   environment:
    - VIRTUAL_HOST=service.myserver.com
    - VIRTUAL_PROTO=http   # should be http even if you use https to the proxy, because node.js uses http!
   volumes:
    - "./API:/host"
   links:
    - Mongo:Mongo
   ports:
    - "3050:3000"

希望有一天这会帮助某人从搜索引擎登陆此页面!

【讨论】:

  • 要使http://localhost/users 工作,在api 服务的environment 中添加VIRTUAL_PORT=3050 并从nginx_service 中删除environment 块应该可以工作,你不需要映射你的端口3000 api 服务到主机的 3050。
猜你喜欢
  • 2014-07-25
  • 2023-03-13
  • 1970-01-01
  • 2021-05-04
  • 2020-08-11
  • 2017-03-21
  • 2018-03-20
  • 2021-08-25
  • 2021-09-30
相关资源
最近更新 更多