首页 > 解决方案 > NGINX contsainer 作为不同 docker-compose 实例之间的反向代理

问题描述

我在 nginx 和 docker 上相当菜鸟

我有两个 wordpress 和一个 nginx(单独的)docker-compose.yml。我想让 nginx conainer 作为我的两个 wordpress 的反向代理。例如我想去http://localhost/wordpressbloghttp://localhost/wordpressphotography

我真的很愿意接受推荐

其中一个作曲是

version: '3'
services:
  wp:
    image: wordpress:latest
    hostname: wordpressblog
    ports:
      - 81:80
    volumes:
      - /opt/wordpress/config/php.conf.ini:/usr/local/etc/php/conf.d/conf.ini
      - /opt/wordpress/wp-app:/var/www/html
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_NAME: "wordpress"
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: "password"
    depends_on:
      - db
    links:
      - db

这是我的 nginx 配置

upstream wordpressblog {
    server wordpressblog:81;
}
upstream wordpressphotography {
    server wordpressphotography:82;
}


server {
  listen 80;

  location /wordpressblog/ {
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_pass http://wordpressblog/;
  }
  location /wordpressphotography/ {
      proxy_http_version 1.1;
      proxy_set_header Connection "";
      proxy_pass http://wordpressphotography/;
  }

}

标签: dockernginxreverse-proxy

解决方案


尝试使用 Traefik,而不是使用NGinX,它是一个支持 Docker 的反向代理。

您可以在 Juan Treminio 的“Traefik on Docker for Web Developers - With bonus Let's Encrypt SSL!”中看到一个示例以便自动注册您的容器并通过预定义的 URL 访问它们。

胡安描述了如何解决“港口舞”:

如果端口 80 映射到 web-server-A,您必须选择另一个端口来绑定 web-server-B 和 web-server-C。
这很快就会变老,因为您必须记住http://localhost转到 A,http://localhost:81转到 B,http://localhost:82转到 C。

他指出:

在虚拟机上,这个问题不会真正发生,因为您可以为您的服务器分配一个静态 IP 地址,并将其绑定到您系统的主机文件 ( /etc/hosts)。
容器本质上是短暂的,通常不会在您的主机网络上创建,而是在专用网络上创建,它们在特殊范围内具有自己的随机 IP 地址。但是,您必须/etc/hosts为每个启动的 VM 进行编辑,并且该列表会随着您处理的项目数量而增长。

Træfik 解决了这两个问题,首先是不需要在 URL 中使用端口,其次是根本不需要您进行编辑/etc/hosts

Traefik 检测新容器的方式是通过 docker-deicated 网络:

 docker network create --driver bridge traefik_webgateway

一个新容器将自己注册到上述 Traefik docker 网络:

docker run -d --name some-mailhog \
    --network traefik_webgateway \
    --label traefik.docker.network=traefik_webgateway \
    --label traefik.frontend.rule=Host:mailhog.localhost \
    --label traefik.port=8025 \
    mailhog/mailhog

URL 变为简单的http://mailhog.localhost

您可以类似地注册您的两个 Wordpress 组件。

优点:无需维护静态NGiNX 配置文件:任意数量的组件都可以注册其 URL。


Traefik 之前的旧方式是使用 NGiNXjwilder/nginx-proxy

它是Docker 的自动 Nginx 反向代理

Docker 提供了一个远程 API 来检查容器并访问它们的 IP、端口和其他配置元数据。此外,它还提供了一个实时事件 API,可用于容器启动和停止时的通知。这些 API 可用于自动生成反向代理配置。

docker-gen是一个小型实用程序,它使用这些 API 并将容器元数据公开给模板。呈现模板并且可以运行可选的通知命令来重新启动服务。

使用 docker-gen,我们可以自动生成 Nginx 配置文件,并在它们更改时重新加载 nginx。


推荐阅读