1
0
mirror of https://github.com/thib8956/nginx-proxy synced 2025-07-01 06:15:45 +00:00

Merge pull request #2434 from nginx-proxy/multiport-support

feat: multiport support
This commit is contained in:
Nicolas Duchon
2024-05-09 12:29:00 +02:00
committed by GitHub
28 changed files with 566 additions and 111 deletions

View File

@ -1,10 +0,0 @@
import pytest
def test_unknown_virtual_host(docker_compose, nginxproxy):
r = nginxproxy.get("http://nginx-proxy/")
assert r.status_code == 503
def test_forwards_to_whoami(docker_compose, nginxproxy):
r = nginxproxy.get("http://web.nginx-proxy.example/port")
assert r.status_code == 200
assert r.text == "answer from port 81\n"

View File

@ -1,15 +0,0 @@
version: "2"
services:
nginx-proxy:
image: nginxproxy/nginx-proxy:test
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
web:
image: web
expose:
- "81"
environment:
WEB_PORTS: 81
VIRTUAL_HOST: web.nginx-proxy.example

View File

@ -0,0 +1,39 @@
import pytest
def test_virtual_host_is_dropped_when_using_multiports(docker_compose, nginxproxy):
r = nginxproxy.get("http://notskipped.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 81\n" in r.text
r = nginxproxy.get("http://skipped.nginx-proxy.tld/")
assert r.status_code == 503
def test_answer_is_served_from_port_80_by_default(docker_compose, nginxproxy):
r = nginxproxy.get("http://port80.a.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 80\n" in r.text
r = nginxproxy.get("http://port80.b.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 80\n" in r.text
r = nginxproxy.get("http://port80.c.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 80\n" in r.text
def test_answer_is_served_from_chosen_ports(docker_compose, nginxproxy):
r = nginxproxy.get("http://port8080.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 8080\n" in r.text
r = nginxproxy.get("http://port9000.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 9000\n" in r.text
def test_answer_is_served_from_chosen_ports_and_dest(docker_compose, nginxproxy):
r = nginxproxy.get("http://virtualpaths.nginx-proxy.tld/rootdest/port")
assert r.status_code == 200
assert "answer from port 10001\n" in r.text
r = nginxproxy.get("http://virtualpaths.nginx-proxy.tld/customdest")
assert r.status_code == 200
assert "answer from port 10002\n" in r.text

View File

@ -0,0 +1,77 @@
version: "2"
services:
skipvirtualhost:
image: web
expose:
- "81"
environment:
WEB_PORTS: "81"
VIRTUAL_HOST: skipped.nginx-proxy.tld
VIRTUAL_HOST_MULTIPORTS: |-
{
"notskipped.nginx-proxy.tld": {}
}
defaultport:
image: web
expose:
- "80"
- "8080"
environment:
WEB_PORTS: "80 8080"
VIRTUAL_HOST_MULTIPORTS: |-
{
"port80.a.nginx-proxy.tld": {},
"port80.b.nginx-proxy.tld": {},
"port80.c.nginx-proxy.tld": {
"/": {}
}
}
multiports:
image: web
expose:
- "8080"
- "9000"
environment:
WEB_PORTS: "8080 9000"
VIRTUAL_HOST_MULTIPORTS: |-
{
"port8080.nginx-proxy.tld": {
"/": {
"port": 8080
}
},
"port9000.nginx-proxy.tld": {
"/": {
"port": 9000
}
}
}
virtualpath:
image: web
expose:
- "10001"
- "10002"
environment:
WEB_PORTS: "10001 10002"
VIRTUAL_HOST_MULTIPORTS: |-
{
"virtualpaths.nginx-proxy.tld": {
"/rootdest": {
"port": 10001,
"dest": "/"
},
"/customdest": {
"port": 10002,
"dest": "/port"
}
}
}
sut:
image: nginxproxy/nginx-proxy:test
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro

View File

@ -0,0 +1,39 @@
import pytest
def test_virtual_host_is_dropped_when_using_multiports(docker_compose, nginxproxy):
r = nginxproxy.get("http://notskipped.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 81\n" in r.text
r = nginxproxy.get("http://skipped.nginx-proxy.tld/")
assert r.status_code == 503
def test_answer_is_served_from_port_80_by_default(docker_compose, nginxproxy):
r = nginxproxy.get("http://port80.a.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 80\n" in r.text
r = nginxproxy.get("http://port80.b.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 80\n" in r.text
r = nginxproxy.get("http://port80.c.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 80\n" in r.text
def test_answer_is_served_from_chosen_ports(docker_compose, nginxproxy):
r = nginxproxy.get("http://port8080.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 8080\n" in r.text
r = nginxproxy.get("http://port9000.nginx-proxy.tld/port")
assert r.status_code == 200
assert "answer from port 9000\n" in r.text
def test_answer_is_served_from_chosen_ports_and_dest(docker_compose, nginxproxy):
r = nginxproxy.get("http://virtualpaths.nginx-proxy.tld/rootdest/port")
assert r.status_code == 200
assert "answer from port 10001\n" in r.text
r = nginxproxy.get("http://virtualpaths.nginx-proxy.tld/customdest")
assert r.status_code == 200
assert "answer from port 10002\n" in r.text

View File

@ -0,0 +1,61 @@
version: "2"
services:
skipvirtualhost:
image: web
expose:
- "81"
environment:
WEB_PORTS: "81"
VIRTUAL_HOST: skipped.nginx-proxy.tld
VIRTUAL_HOST_MULTIPORTS: |-
notskipped.nginx-proxy.tld:
defaultport:
image: web
expose:
- "80"
- "8080"
environment:
WEB_PORTS: "80 8080"
VIRTUAL_HOST_MULTIPORTS: |-
port80.a.nginx-proxy.tld:
port80.b.nginx-proxy.tld:
port80.c.nginx-proxy.tld:
"/":
multiports:
image: web
expose:
- "8080"
- "9000"
environment:
WEB_PORTS: "8080 9000"
VIRTUAL_HOST_MULTIPORTS: |-
port8080.nginx-proxy.tld:
"/":
port: 8080
port9000.nginx-proxy.tld:
"/":
port: 9000
virtualpath:
image: web
expose:
- "10001"
- "10002"
environment:
WEB_PORTS: "10001 10002"
VIRTUAL_HOST_MULTIPORTS: |-
virtualpaths.nginx-proxy.tld:
"/rootdest":
port: 10001
dest: "/"
"/customdest":
port: 10002
dest: "/port"
sut:
image: nginxproxy/nginx-proxy:test
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro

View File

@ -0,0 +1,18 @@
import pytest
import re
def test_virtual_hosts_with_syntax_error_should_not_be_reachable(docker_compose, nginxproxy):
r = nginxproxy.get("http://test1.nginx-proxy.tld")
assert r.status_code == 503
r = nginxproxy.get("http://test2.nginx-proxy.tld")
assert r.status_code == 503
def test_config_should_have_multiports_warning_comments(docker_compose, nginxproxy):
conf = nginxproxy.get_conf().decode('ASCII')
matches = re.findall(r"the VIRTUAL_HOST_MULTIPORTS environment variable used for this container is not a valid YAML string", conf)
assert len(matches) == 3
assert "# invalidsyntax" in conf
assert "# hostnamerepeat" in conf
assert "# pathrepeat" in conf

View File

@ -0,0 +1,44 @@
version: "2"
services:
invalidsyntax:
image: web
container_name: invalidsyntax
expose:
- "80"
environment:
WEB_PORTS: "80"
VIRTUAL_HOST_MULTIPORTS: |-
test1.nginx-proxy.tld
test2.nginx-proxy.tld:
hostnamerepeat:
image: web
container_name: hostnamerepeat
expose:
- "80"
environment:
WEB_PORTS: "80"
VIRTUAL_HOST_MULTIPORTS: |-
test1.nginx-proxy.tld:
test1.nginx-proxy.tld:
pathrepeat:
image: web
container_name: pathrepeat
expose:
- "8080"
- "9000"
environment:
WEB_PORTS: "8080 9000"
VIRTUAL_HOST_MULTIPORTS: |-
test1.nginx-proxy.tld:
"/":
port: 8080
"/":
port: 9000
sut:
image: nginxproxy/nginx-proxy:test
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro

View File

@ -0,0 +1,14 @@
import backoff
import pytest
def test_multiports_and_legacy_configs_should_be_merged(docker_compose, nginxproxy):
@backoff.on_predicate(backoff.constant, lambda r: r == False, interval=.5, max_tries=20, jitter=None)
def answer_contains(answer, url):
return answer in nginxproxy.get(url).text
assert answer_contains("80", "http://merged.nginx-proxy.tld/port")
assert answer_contains("81", "http://merged.nginx-proxy.tld/port")
assert answer_contains("9090", "http://merged.nginx-proxy.tld/foo/port")
assert answer_contains("9191", "http://merged.nginx-proxy.tld/foo/port")

View File

@ -0,0 +1,41 @@
version: "2"
services:
merged-singleport:
image: web
expose:
- "80"
environment:
WEB_PORTS: "80"
VIRTUAL_HOST: merged.nginx-proxy.tld
merged-singleport-virtual-path:
image: web
expose:
- "9090"
environment:
WEB_PORTS: "9090"
VIRTUAL_HOST: merged.nginx-proxy.tld
VIRTUAL_PORT: "9090"
VIRTUAL_PATH: "/foo"
VIRTUAL_DEST: "/"
merged-multiports:
image: web
expose:
- "81"
- "9191"
environment:
WEB_PORTS: "81 9191"
VIRTUAL_HOST_MULTIPORTS: |-
merged.nginx-proxy.tld:
"/":
port: 81
"/foo":
port: 9191
dest: "/"
sut:
image: nginxproxy/nginx-proxy:test
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro