反向代理NGINX前端以重定向Dockerized Apache

时间:2019-08-07 09:13:53

标签: apache docker nginx docker-compose

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

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容器中的网页是使用xxx.xxx.xxx.xxx:80而不是app3_apache:80 <h1>Bad Request (400)</h1>在NGINX容器中提供的。

我可以从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

1 个答案:

答案 0 :(得分:0)

您应该创建一个docker网络来链接容器。 您可以在此处查看文档:{​​{3}}

创建网络后,您将不得不更改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可以避免这种配置开销。