首页 > 解决方案 > 反向代理 NGINX 前端以重定向 Dockerized Apache

问题描述

我来自这个。我是网络服务器的新手。我正在设置一个服务器(example.de),为多个 dockerized 应用程序提供服务。其中一个(app3)在 Apache 服务器后面运行(容器内的端口 80 映射到 8484)。我想使用 NGINX docker 容器将 url example.de/app3 重定向到 example.de:8484。其他两个应用程序也将被重定向到 example.de/app?。当我请求 url example.de:8484 它工作正常。但是,当我使用 example.de/app3 时,只会出现“It works”网页。

docker-compose 文件类似于:

version: '3'
services:
    app3:
        build:
            context: app3
        container_name: app3

    app3_apache:
        build:
            context: app3/apache
        container_name: app3_apache
        ports:
            - "8484:80"
        volumes:
            - vol_app3:/vol/app3
        depends_on:
            - app3
        links:
            - app3

    nginx-proxy:
      container_name: nginx
      build:
        context: nginx/
      ports:
        - "80:80"
      depends_on:
        - app3_apache
      links:
        - app3_apache
      volumes:
        - vol_nginx:/etc/nginx/conf.d

volumes:
    vol_app3:
        driver_opts:
            type: none
            device: /vol/app3
            o: bind
    vol_nginx:
        driver_opts:
            type: none
            device: /vol/nginx
            o: bind

NGINX default.conf 文件如下所示:

server {
    listen 80;
    listen [::]:80;
    server_name example.de;

    location /app3 {
      proxy_pass http://app3_apache:80;
    }
}

附加信息:它创建并运行容器。APACHE 容器中的网页在 NGINX 容器中使用 xxx.xxx.xxx.xxx:80 而不是 app3_apache:80 提供<h1>Bad Request (400)</h1>

我可以从 NGINX 容器访问 app3_apache 容器:

traceroute app3_apache
traceroute to app3_apache (xxx.xxx.xxx.xxx), 30 hops max, 60 byte packets
 1  app3_apache.server_default (xxx.xxx.xxx.xxx)  0.351 ms  0.054 ms  0.035 ms

标签: apachedockernginxdocker-compose

解决方案


您应该创建一个 docker 网络来链接容器。您可以在此处查看文档:https ://docs.docker.com/network/bridge/

创建网络后,您必须更改 nginx proxy_pass 的配置以指出 Web 服务器应用程序的内部 IP。

例如,我设置此网络配置以连接 3 个具有固定 IP 地址的容器。

version: '2'
services:
    zabbix-server4:
    container_name: zabbix-server4
    image: zabbix/zabbix-server-mysql:alpine-4.0.5
    networks:
        zbx_net:
        aliases:
            - zabbix-server4
        ipv4_address: 172.16.238.5

    zabbix-web4:
    container_name: zabbix-web4
    image: zabbix/zabbix-web-nginx-mysql:alpine-4.0.5
    ports: 
        - 127.0.0.1:11011:80
    links:
        - zabbix-server4
    environment:
        - ZBX_SERVER_HOST=172.16.238.5
    networks:
        zbx_net:
        aliases:
            - zabbix-web4
        ipv4_address: 172.16.238.10

    zabbix-agent4:
    container_name: zabbix-agent4
    image: zabbix/zabbix-agent:alpine-4.0.5
    links:
        - zabbix-server4
    environment:
        - ZBX_SERVER_HOST=172.16.238.5
    networks:
        zbx_net:
        aliases:
            - zabbix-agent4
        ipv4_address: 172.16.238.15


networks:
zbx_net:
    driver: bridge
    driver_opts:
    com.docker.network.enable_ipv6: "false"
    ipam:
    driver: default
    config:
    - subnet: 172.16.238.0/24
        gateway: 172.16.238.1

在您的情况下,您可以设置一个新网络并将新网络的 IP 分配给 nginx 和 web 容器,然后在 nginx proxy_pass 配置中,您应该放置 web 服务器的 IP。例如:

version: '3'
services:
    app3:
        build:
            context: app3
        container_name: app3

    app3_apache:
        build:
            context: app3/apache
        container_name: app3_apache
        ports:
            - "8484:80"
        volumes:
            - vol_app3:/vol/app3
        depends_on:
            - app3
        links:
            - app3
    networks:
        my_net:
        aliases:
            - zabbix-agent4
        ipv4_address: 172.16.11.10

    nginx-proxy:
    container_name: nginx
    build:
        context: nginx/
    ports:
        - "80:80"
    depends_on:
        - app3_apache
    links:
        - app3_apache
    volumes:
        - vol_nginx:/etc/nginx/conf.d
    networks:
        my_net:
        aliases:
            - zabbix-agent4
        ipv4_address: 172.16.11.20

volumes:
    vol_app3:
        driver_opts:
            type: none
            device: /vol/app3
            o: bind
    vol_nginx:
        driver_opts:
            type: none
            device: /vol/nginx
            o: bind

networks:
my_net:
    driver: bridge
    driver_opts:
    com.docker.network.enable_ipv6: "false"
    ipam:
    driver: default
    config:
    - subnet: 172.16.11.0/24
        gateway: 172.16.11.1

并且代理通行证应该设置为

location /app3 {
  proxy_pass http://172.16.11.10:80;
}

为了防止出现这个问题,我在主机上运行 nginx,而不是在容器中,然后我使用相同的方法在容器中拆分流量。在主机中安装 nginx 可以避免这种配置开销。


推荐阅读