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:
@ -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"
|
@ -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
|
39
test/test_multiports/test_multiports-base-json.py
Normal file
39
test/test_multiports/test_multiports-base-json.py
Normal 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
|
77
test/test_multiports/test_multiports-base-json.yml
Normal file
77
test/test_multiports/test_multiports-base-json.yml
Normal 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
|
39
test/test_multiports/test_multiports-base-yaml.py
Normal file
39
test/test_multiports/test_multiports-base-yaml.py
Normal 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
|
61
test/test_multiports/test_multiports-base-yaml.yml
Normal file
61
test/test_multiports/test_multiports-base-yaml.yml
Normal 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
|
18
test/test_multiports/test_multiports-invalid-syntax.py
Normal file
18
test/test_multiports/test_multiports-invalid-syntax.py
Normal 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
|
44
test/test_multiports/test_multiports-invalid-syntax.yml
Normal file
44
test/test_multiports/test_multiports-invalid-syntax.yml
Normal 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
|
14
test/test_multiports/test_multiports-merge.py
Normal file
14
test/test_multiports/test_multiports-merge.py
Normal 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")
|
41
test/test_multiports/test_multiports-merge.yml
Normal file
41
test/test_multiports/test_multiports-merge.yml
Normal 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
|
Reference in New Issue
Block a user