Diese Tutorial existiert, weil es immer wieder Rückfragen zu diesem Thema gegeben hat.
Siehe:
Grob: Ein Reverse-Proxy dient als zentraler Kontaktpunkt für Anfragen von außen und leitet diese anhand verschiedener Kriterien an andere Dienste weiter.
Dynexite hat verschiedene Container, die spezialisierte Aufgaben erfüllen. Wir nutzen einen Reverse-Proxy:
Wichtig: Der Reverse Proxy ist vollkommen optional, wenn es nicht wichtig ist, dass Dynexite auf derselben Domäne läuft. Alternative Möglichkeiten sind die Nutzung über mehrere Hostnamen oder über öffentliche High-Ports.
Allerdings fehlt für den Orbit zurzeit noch die Möglichkeit ein SSL-Zertifikat einzubinden!
i.A. nicht zu empfehlen, da so noch keine TLS Terminierung möglich ist.
Es müssten entweder Highports verwendet werden, oder es müssten verschiedene IPs verwendet werden.
Siehe:
Sehr gut für alle Probleme außer der Namensauflösung. Dafür verwenden wir einen HAProxy.
Wenn nur dieser Container genutz wird, werden die Adressen von Dynexite typischerweise so aussehen:
Wir nutzen zurzeit einen haproxy um die Anfragen auf die Dienste zu verteilen.
Anstatt dessen können Sie jeden anderen Reverse Proxy nehmen. Die Konfiguration muss dann entsprechend angepasst werden.Über so eine Konstruktion können wir die Namen auch auf einer URL anlegen:
Container
reverse-proxy:
image: haproxy:2.0-alpine
environment:
PORT: '80'
stdin_open: true
volumes:
- /path-to-haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
tty: true
links:
- orbit-teacher:orbit-teacher
- orbit-teacher-backend:orbit-teacher-backend
labels:
rap.client_max_body_size: '1073741824'
rap.host: dynexite.rwth-aachen.de
rap.le_host: dynexite.rwth-aachen.de
Diese Konfiguration ist von sich aus noch nicht öffentlich erreichbar - wir nutzen den
rancher-active-proxyin Kombination mitrancher, welcher die HTTPS-Entschlüsselung und die Namensauflösung übernimmt. Daher können dierap-Flags gelöscht werden, wenn Rancher nicht benutzt wird.Für Testzwecke können Sie einen öffentlichen Port anbinden.
Für den oben genanntenactive-proxykönnen SieVIRTUAL_HOST: 'dynexite.rwth-aachen.de'inenvironmenthinzufügen
Konfiguration haproxy.cfg
global
maxconn 4096
ssl-server-verify none
daemon
maxpipes 1024
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA
ssl-default-bind-options no-sslv3 no-tlsv10 no-tls-tickets
ssl-default-server-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:AES128-GCM-SHA256:AES128-SHA256:AES128-SHA:AES256-GCM-SHA384:AES256-SHA256:AES256-SHA
defaults
mode http
balance roundrobin
option redispatch
option forwardfor
timeout connect 5s
timeout queue 5s
timeout client 36000s
timeout server 36000s
maxconn 4096
option forwardfor
option http-server-close
option redispatch
retries 3
listen default
bind *:42
frontend http-in
bind *:"${PORT}"
mode http
acl orbit_teacher_backend_path path_beg -i /api/
use_backend orbit_teacher_backend if orbit_teacher_backend_path
default_backend orbit_teacher
backend orbit_teacher_backend
acl forwarded_proto hdr_cnt(X-Forwarded-Proto) eq 0
acl forwarded_port hdr_cnt(X-Forwarded-Port) eq 0
http-request replace-uri ^/api/(.*)$ /\1
http-request add-header X-Forwarded-Port %[dst_port] if forwarded_port
http-request add-header X-Forwarded-Proto https if { ssl_fc } forwarded_proto
mode http
server s1 orbit-teacher-backend:8000
backend orbit_teacher
acl forwarded_proto hdr_cnt(X-Forwarded-Proto) eq 0
acl forwarded_port hdr_cnt(X-Forwarded-Port) eq 0
http-request add-header X-Forwarded-Port %[dst_port] if forwarded_port
http-request add-header X-Forwarded-Proto https if { ssl_fc } forwarded_proto
timeout check 2000
mode http
server s1 orbit-teacher:80 check port 80 inter 2000 rise 2 fall 3
Wir optimieren hier die Verbindung auf WebSocket und leiten alle Anfragen an
/api/an das Backend weiter. So können wir verhindern, dass wir 2 Domänen brauchen. Diese Konfiguration spiegelt sich dann in den Optionen des Containers wieder.