nginx - 将 nginx 反向代理设置为从另一个 docker 容器提供服务

标签 nginx docker reverse-proxy docker-compose

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

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

 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 反向代理帮助或纠正我吗?

最佳答案

在进行了一些搜索之后,我能够整理出一个有效的 docker-compose.yml有一个工作的 nginx 反向代理(image: jwilder/nginx-proxy in docker hub)到我在一个单独容器中的基于 node.js 的 Web 应用程序。

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

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

下面是工作中的 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"

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

关于nginx - 将 nginx 反向代理设置为从另一个 docker 容器提供服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38033695/

相关文章:

bash - 如何从容器内运行的脚本访问 docker 容器的元数据?

python - 首选 Azure 服务以可扩展的方式使用端点运行 python 脚本

docker - 在 swarm 集群中的特定节点上运行 docker 容器

reverse-proxy - 解释反向代理

http - 何时从 http 请求规范中使用 absoluteUri?

ruby-on-rails - 如何限制 ruby​​ 对 Passenger/NGINX 的 CPU 使用?

ruby-on-rails - Heroku - bundler : failed to load command: unicorn

rest - Nginx 代理在空闲时挂了一会儿

node.js - Nginx gunzip POST 请求到后端

node.js - 让 NODE JS 在特定端口上运行