不同的域具有不同的phpmyadmin服务和"same port"问题(nginx反向代理,docker)



我有一个带有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容器配置为侦听端口80443
  • 您想将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,它将转到80443(取决于他们使用的是http还是https(。然后,nginx将分析请求,并将其发送到正确的容器。为此,端口A和端口B监听的端口并不重要,因为在外界看来,它们似乎在监听80/443

因此,真正的答案是,虽然您不能将自定义端口与虚拟主机结合起来,并将同一端口用于多个容器(80/443除外(,但实际上您一开始就不需要自定义端口!如果您只使用默认端口配置容器,用户可以同时使用https://example-a.comhttps://example-b.com,它将"正常工作"™

最新更新