我有一个带有nginx代理容器的VPS,我用phpmyadmin服务创建了一些wordpress网站。如果我想用这个定义创建另一个网站;"相同端口";问题好的,我可以将端口更改为2998,它工作正常,但我需要在我的VPS中添加一个新的开放端口。我不想为每个站点添加或更改端口。
现在:
- 示例-a.com:2999->phpmyadmin登录页面示例
- examlpe-b.com:2998->示例-b phpymadmin登录页
有没有办法通过域名将我引导到合适的容器?
- 示例-a.com:2999->示例-phpmyadmin登录页面
- examlpe-b.com:2999->示例-bphpymadmin登录页面
我的nginx代理定义
networks:
nginx-proxy:
external: false
name: nginx-reverse-proxy
default:
name: nginx-reverse-proxy-default
version: '2'
services:
nginx-proxy:
build:
context: .nginx-proxy
dockerfile: Dockerfile
container_name: nginx-proxy
ports:
- 80:80
- 443:443
restart: always
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- .nginx-proxy/certs:/etc/nginx/certs:ro
- .nginx-proxy/vhost.d:/etc/nginx/vhost.d
- .nginx-proxy/dhparam:/etc/nginx/dhparam
- /usr/share/nginx/html
networks:
- nginx-proxy
nginx-proxy-acme:
image: nginxproxy/acme-companion
container_name: nginx-proxy-acme
restart: always
volumes_from:
- nginx-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- .nginx-proxy/certs:/etc/nginx/certs:rw
- .nginx-proxy-acme/acme:/etc/acme.sh
这是我的wordpress网站定义
version: "3.9"
volumes:
database_volume: {}
x-logging:
&default-logging
driver: json-file
options:
max-size: '1m'
max-file: '3'
services:
web:
build:
context: ./.docker
dockerfile: Dockerfile_web
container_name: test_web
ports:
- '3000:80'
volumes:
- ./wp:/var/www
depends_on:
- database
- php
restart: always
logging: *default-logging
database:
image: mariadb:latest
container_name: test_database
environment:
MYSQL_USER: wp
MYSQL_PASSWORD: wp
MYSQL_DATABASE: wp
MYSQL_ROOT_PASSWORD: wp
volumes:
- ./database_volume:/var/lib/mysql
expose:
- 3306
restart: always
logging: *default-logging
php:
build:
context: ./.docker
dockerfile: Dockerfile_php
container_name: test_php
working_dir: /var/www/
volumes:
- ./wordpress:/var/www
restart: always
logging: *default-logging
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: test_phpmyadmin
links:
- database:db
ports:
- '2999:80'
restart: always
logging: *default-logging
你想要什么是不可能的,但你可能实际上并不想要。一旦你仔细考虑了你想要配置的内容,以及如果用户转到任一URL:会发生什么,就会变得很清楚
- 您已将
example-a.com
配置为指向您的IP - 您已将
example-b.com
配置为指向您的IP - 您已将
nginx-proxy
容器配置为侦听端口80
和443
- 您想将WordPress容器配置为同时侦听端口
2999
- 您,或者更确切地说是
acme-companion
,已经将nginx
容器配置为转发请求主机example-a.com
转到容器的HTTP请求,例如端口为2999
的A,以及请求example-b.com
转到端口为2999
的容器B的请求
现在,您可以立即看到,有两件事试图在端口为2999
的同一网络接口上侦听-这不起作用,也不能,因为在解析请求以找出它想要的主机之前,谁来处理接收传入请求?容器A不能接受请求,如果是给B的,就把请求交给A——A不知道B。
因此,如果你考虑一个用户向example-a.com:2999
发送请求,实际发生的是一个请求转到<yourip>:2999
,就像如果一个用户转到example-b.com:2999
,它最终会转到<yourip>:2999
一样。
如何解决这个问题?通过让第三个容器C接受用户请求,查看请求,并根据他们想要容器a还是B,将请求移交给a或B。
最棒的是:你已经拥有了!容器C实际上是您的nginx
容器,它在端口80
/443
上侦听。因此,如果您的用户在不提供端口的情况下转到example-a.com
,它将转到80
或443
(取决于他们使用的是http
还是https
(。然后,nginx
将分析请求,并将其发送到正确的容器。为此,端口A和端口B监听的端口并不重要,因为在外界看来,它们似乎在监听80
/443
。
因此,真正的答案是,虽然您不能将自定义端口与虚拟主机结合起来,并将同一端口用于多个容器(80
/443
除外(,但实际上您一开始就不需要自定义端口!如果您只使用默认端口配置容器,用户可以同时使用https://example-a.com
和https://example-b.com
,它将"正常工作"™