基于 Docker 的反向代理和 NginX 用于多个域

ela*_*pog 5 nginx routing reverse-proxy docker docker-compose

我正在尝试创建一个基于 docker 的多容器设置,其中包含多个域的反向代理以提供服务,其中网站、数据库和基于 nginx 的反向代理在容器中运行,但我不知道我在做什么丢失(我是 nginx 新手)。

\n\n

细节:

\n\n
    \n
  • 基于 NginX 的 docker 容器用于反向代理
  • \n
  • 我拥有 2 个域\n\n
      \n
    • 例如:my_example_domain_1.com,my_example_domain_2.net
    • \n
  • \n
  • 我想在每个域名后面放置一个容器来服务这两个域\n\n
      \n
    • 我想运行两个独立的网站:例如:两个 WordPress 网站
    • \n
  • \n
  • 我需要两个域和相应容器之间的 NginX 路由
  • \n
\n\n

我的例子: (basedir multi-container:)

\n\n

nginx_revproxy/default.conf:

\n\n
server {\n    listen       80;\n    server_name  localhost;\n\n    location / {\n        root   /usr/share/nginx/html;\n        index  index.html index.htm;\n    }\n\n    error_page   500 502 503 504  /50x.html;\n    location = /50x.html {\n        root   /usr/share/nginx/html;\n    }\n}\n\nserver {\n    listen       80;\n    server_name  my_example_domain_1.com;\n    location / {\n        proxy_pass http://wp1:80;\n    }\n}\n\nserver {\n    listen   80;\n    server_name  my_example_domain_2.net;\n    location / {\n        proxy_pass http://wp2:80;\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

./nginx_revproxy/Dockerfile:

\n\n
FROM nginx:stable-alpine\nCOPY default.conf /etc/nginx/conf.d\nEXPOSE 80/tcp\nEXPOSE 443/tcp\nCMD ["/bin/sh", "-c", "exec nginx -g \'daemon off;\';"]\nWORKDIR /usr/share/nginx/html\n
Run Code Online (Sandbox Code Playgroud)\n\n

./docker-compose.yml

\n\n
version: \'3.7\'\n\nservices:\n\n   revproxy:\n     container_name: revproxy\n     build: nginx_revproxy\n     restart: always\n     networks:\n       - mynet\n\n   db1:\n     container_name: db1\n     image: mysql:5.7\n     volumes:\n       - "${PWD}/data_mysql1:/var/lib/mysql"\n       - "/tmp/db_site1:/tmp"\n     restart: always\n     environment:\n       MYSQL_ROOT_PASSWORD: somewordpress\n       MYSQL_DATABASE: wordpress\n       MYSQL_USER: wordpress\n       MYSQL_PASSWORD: wordpress\n     networks:\n       - mynet\n\n   db2:\n     container_name: db2\n     image: mysql:5.7\n     volumes:\n       - "${PWD}/data_mysql2:/var/lib/mysql"\n       - "/tmp/db_site2:/tmp"\n     restart: always\n     environment:\n       MYSQL_ROOT_PASSWORD: somewordpress\n       MYSQL_DATABASE: wordpress\n       MYSQL_USER: wordpress\n       MYSQL_PASSWORD: wordpress\n     networks:\n       - mynet\n\n   wp1:\n     container_name: wp1\n     depends_on:\n       - db1\n       - revproxy\n     image: wordpress:latest\n     ports:\n       - "8081:80"\n     restart: always\n     environment:\n       WORDPRESS_DB_HOST: db1:3306\n       WORDPRESS_DB_USER: wordpress\n       WORDPRESS_DB_PASSWORD: wordpress\n       WORDPRESS_DB_NAME: wordpress\n     volumes:\n       - "${PWD}/data_wordpress1:/var/www/html"\n       - "/tmp/wp_site1:/tmp"\n     networks:\n       - mynet\n\n   wp2:\n     container_name: wp2\n     depends_on:\n       - db2\n       - revproxy\n     image: wordpress:latest\n     ports:\n       - "8082:80"\n     restart: always\n     environment:\n       WORDPRESS_DB_HOST: db2:3306\n       WORDPRESS_DB_USER: wordpress\n       WORDPRESS_DB_PASSWORD: wordpress\n       WORDPRESS_DB_NAME: wordpress\n     volumes:\n       - "${PWD}/data_wordpress2:/var/www/html"\n       - "/tmp/wp_site2:/tmp"\n     networks:\n       - mynet\n\nvolumes:\n    data_mysql1:\n    data_mysql2:\n    data_wordpress1:\n    data_wordpress2:\n\nnetworks:\n    mynet:\n
Run Code Online (Sandbox Code Playgroud)\n\n

旁注:

\n\n
    \n
  • revproxy测试:如果我从文件中取出docker-compose.yml并在桌面计算机上执行docker-compose up -d,我可以在容器端口上访问两个网站(没有 revproxy)localhost:8081:,localhost:8082
  • \n
  • PROD:当我docker-compose up -d在服务器上执行时,无法访问网站
  • \n
  • PROD:所有容器似乎都运行没有错误
  • \n
\n\n
$ docker ps -a\nCONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                  NAMES\n974fa178b964        wordpress:latest             "docker-entrypoint.s\xe2\x80\xa6"   45 seconds ago      Up 41 seconds       0.0.0.0:8081->80/tcp   wp1\nbdace64331b7        wordpress:latest             "docker-entrypoint.s\xe2\x80\xa6"   45 seconds ago      Up 41 seconds       0.0.0.0:8082->80/tcp   wp2\n9877a41d4bfa        multi-container-2_revproxy   "/bin/sh -c \'exec ng\xe2\x80\xa6"   47 seconds ago      Up 41 seconds       80/tcp, 443/tcp        revproxy\ne88e226499f2        mysql:5.7                    "docker-entrypoint.s\xe2\x80\xa6"   47 seconds ago      Up 44 seconds       3306/tcp, 33060/tcp    db2\n9feaec1b2314        mysql:5.7                    "docker-entrypoint.s\xe2\x80\xa6"   47 seconds ago      Up 44 seconds       3306/tcp, 33060/tcp    db1\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 产品:
  • \n
\n\n
$ docker logs -f revproxy\n2020/04/09 08:34:21 [emerg] 1#1: host not found in upstream "wp1" in /etc/nginx/conf.d/default.conf:20\nnginx: [emerg] host not found in upstream "wp1" in /etc/nginx/conf.d/default.conf:20\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • PROD:所有容器似乎共享相同的网络接口
  • \n
\n\n
$ docker inspect multi-container_mynet\ndocker inspect multi-container_mynet\n[\n    {\n        "Name": "multi-container_mynet",\n        "Id": "24e1dd604427db695709056290b9c86021674916d57133b24e33fe765cd26165",\n        "Created": "2020-04-09T10:44:59.568919008+02:00",\n        "Scope": "local",\n        "Driver": "bridge",\n        "EnableIPv6": false,\n        "IPAM": {\n            "Driver": "default",\n            "Options": null,\n            "Config": [\n                {\n                    "Subnet": "172.31.0.0/16",\n                    "Gateway": "172.31.0.1"\n                }\n            ]\n        },\n        "Internal": false,\n        "Attachable": true,\n        "Ingress": false,\n        "ConfigFrom": {\n            "Network": ""\n        },\n        "ConfigOnly": false,\n        "Containers": {\n            "18d60a010dafca22dd03c2f60cf1b2a607f7ac19ea00e88cd6baff6ada392545": {\n                "Name": "revproxy",\n                "EndpointID": "14974557d1876df15e35ffacb333a4d15883b7645cd90fe819cc2763118c7151",\n                "MacAddress": "02:42:ac:1f:00:02",\n                "IPv4Address": "172.31.0.2/16",\n                "IPv6Address": ""\n            },\n            "4b591fcb01c464d9ce932ab8e67e9409c2e19e725ab75faa5bcfd2c322ced1b8": {\n                "Name": "db1",\n                "EndpointID": "a3631f7943701b333b203e48d816853ef7da4739cfbd265edc6126aad9fbc832",\n                "MacAddress": "02:42:ac:1f:00:04",\n                "IPv4Address": "172.31.0.4/16",\n                "IPv6Address": ""\n            },\n            "885434c047c3eb2f5794a307a51dc5057384744a5483857474e41c697d2c954d": {\n                "Name": "db2",\n                "EndpointID": "d1840498f59f96840f44e1b91be0a69ff00cd78e06fea736e8f22f01e7fb8a94",\n                "MacAddress": "02:42:ac:1f:00:03",\n                "IPv4Address": "172.31.0.3/16",\n                "IPv6Address": ""\n            },\n            "9d90045cfe089418cb1886af89f79780f0d52f08bb876241c3d90d5fa5ab0dfd": {\n                "Name": "wp1",\n                "EndpointID": "2052ae635d5317e6928bb961d183c280add219b09ac042fc56a6f26c3410531e",\n                "MacAddress": "02:42:ac:1f:00:06",\n                "IPv4Address": "172.31.0.6/16",\n                "IPv6Address": ""\n            },\n            "b9caf876f7f4f8bbf2d77c422f0179e647bcfd22b0129de0a83c90360df54612": {\n                "Name": "wp2",\n                "EndpointID": "479bbd8d29cff9644c008316c91cdecac75f3f8ef107ad59f0d2e4683cd4b81c",\n                "MacAddress": "02:42:ac:1f:00:05",\n                "IPv4Address": "172.31.0.5/16",\n                "IPv6Address": ""\n            }\n        },\n        "Options": {},\n        "Labels": {\n            "com.docker.compose.network": "mynet",\n            "com.docker.compose.project": "multi-container",\n            "com.docker.compose.version": "1.23.1"\n        }\n    }\n]\n
Run Code Online (Sandbox Code Playgroud)\n\n

有人有什么主意吗?

\n

ela*_*pog 10

与此同时,我自己想出了办法。
这是一个有效的配置(如果有人对未来感兴趣):

nginx_revproxy/default.conf:

upstream domain1 {
  server wp1:80;
}

upstream domain2 {
  server wp2:80;
}


server {
    listen       80;
    server_name  domain1.com;
    location / {
        proxy_pass http://domain1/;
        proxy_set_header Host            $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}

server {
    listen       80;
    server_name  domain2.com;
    location / {
        proxy_pass http://domain2/;
        proxy_set_header Host            $host;
        proxy_set_header X-Forwarded-For $remote_addr;
    }
}
Run Code Online (Sandbox Code Playgroud)

nginx_revproxy/Dockerfile:

FROM nginx:stable-alpine
COPY default.conf /etc/nginx/conf.d
EXPOSE 80/tcp
EXPOSE 443/tcp
CMD ["/bin/sh", "-c", "exec nginx -g 'daemon off;';"]
WORKDIR /usr/share/nginx/html
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml:

version: '3.7'

services:

   revproxy:
     container_name: revproxy
     build: nginx_revproxy
     depends_on:
       - wp1
       - wp2
     restart: always
     ports:
       - 80:80
     networks:
       - mynet

   db1:
     container_name: db1
     image: mysql:5.7
     volumes:
       - "${PWD}/data_mysql1:/var/lib/mysql"
       - "/tmp/db_site1:/tmp"
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     networks:
       - mynet

   db2:
     container_name: db2
     image: mysql:5.7
     volumes:
       - "${PWD}/data_mysql2:/var/lib/mysql"
       - "/tmp/db_site2:/tmp"
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress
     networks:
       - mynet

   wp1:
     container_name: wp1
     depends_on:
       - db1
     image: wordpress:latest
     ports:
       - "8081:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db1:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - "${PWD}/data_wordpress1:/var/www/html"
       - "/tmp/wp_site1:/tmp"
     networks:
       - mynet

   wp2:
     container_name: wp2
     depends_on:
       - db2
     image: wordpress:latest
     ports:
       - "8082:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db2:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
       WORDPRESS_DB_NAME: wordpress
     volumes:
       - "${PWD}/data_wordpress2:/var/www/html"
       - "/tmp/wp_site2:/tmp"
     networks:
       - mynet

volumes:
    data_mysql1:
    data_mysql2:
    data_wordpress1:
    data_wordpress2:

networks:
    mynet:

Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!