как настроить трафик в качестве обратного прокси для одного домена и нескольких путей - PullRequest
0 голосов
/ 29 августа 2018

Я настраиваю Traefik для работы в качестве обратного прокси-сервера в моей среде разработки. В настоящее время у меня есть приложения, работающие на разных портах и ​​разных путях.

Моя среда:

Traefik работает на хосте (192.168.0.10). Прослушивание через порты 80, 443 и 8080 (панель мониторинга traefik).

Мои приложения работают на другом хосте (192.168.0.11).

Веб-приложение: 192.168.0.11:8200/web1 Серверная часть: 192.168.0.11:8210/api1 Другое веб-приложение: 192.168.0.11:8300/web2 Другой Backend: 192.168.0.11:8310/api2

Я хочу перенаправить все эти приложения через один и тот же поддомен (dev.domain.com) с помощью Traefik + LetsEncrypt (acme).

Например:

Когда я захожу на dev.domain.com/web1, я хочу перенаправить весь доступ на 192.168.0.11:8200/web1

Когда я получаю доступ к dev.domain.com/api1, я хочу перенаправить весь доступ к 192.168.0.11:8210/api1

.

И так далее.

Ниже приведены настройки, которые я использую, версия Traefik и т. Д.

traefil.toml

debug = true
logLevel = "DEBUG"
InsecureSkipVerify = false
defaultEntryPoints = ["https", "http"]

[api]
  entryPoint = "traefik"
  dashboard = true
  address = ":8080"

[entryPoints]
  [entryPoints.http]
  address = ":80"
    [entryPoints.http.redirect]
    entryPoint = "https"
  [entryPoints.https]
  address = ":443"
    [entryPoints.https.tls]

[file]
  directory = "/etc/traefik/rules.d"
  watch = true

[acme]
email = "my-email@domain.com"
storage="/etc/traefik/acme/acme.json"
entryPoint = "https"
acmeLogging=true 
onDemand = true
[acme.dnsChallenge]
  provider = "godaddy"
  delayBeforeCheck = 0
[[acme.domains]]
   main = "domain.com"
[[acme.domains]]
   main = "*.domain.com"

[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "domain.com"
watch = true
exposedbydefault = false

каталог rules.d имеет несколько файлов .toml.

web1.toml

loglevel = "ERROR"

[backends]
  [backends.web-backend]
    [backends.web-backend.servers.backend_web-backend1]
      url = "http://192.168.0.11:8200/web1"

[frontends]
  [frontends.web-frontend]
    backend = "web-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.web-frontend.routes.frontend_web-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/web1"

web2.toml

loglevel = "ERROR"

[backends]
  [backends.web-backend]
    [backends.web-backend.servers.backend_web-backend1]
      url = "http://192.168.0.11:8300/web2"

[frontends]
  [frontends.web-frontend]
    backend = "web-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.web-frontend.routes.frontend_web-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/web2"

api1.toml

loglevel = "ERROR"

[backends]
  [backends.api-backend]
    [backends.api-backend.servers.backend_api-backend1]
      url = "http://192.168.0.11:8210"

[frontends]
  [frontends.api-frontend]
    backend = "api-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.api-frontend.routes.frontend_api-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/api1"

api2.toml

loglevel = "ERROR"

[backends]
  [backends.api-backend]
    [backends.api-backend.servers.backend_api-backend1]
      url = "http://192.168.0.11:8310"

[frontends]
  [frontends.api-frontend]
    backend = "api-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.api-frontend.routes.frontend_api-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/api2"

каталог acme в порядке! сертификат создан без ошибок!

докер-compose.yml

version: "2.1"

services:
  traefik:
    hostname: traefik
    image: traefik:latest
    container_name: traefik
    restart: always
    domainname: ${DOMAINNAME}
    networks:
      - default
      - traefik_proxy
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    environment:
      - GODADDY_API_KEY=${GODADDY_API_KEY}
      - GODADDY_API_SECRET=${GODADDY_API_SECRET}
    labels:
      - "traefik.enable=true"
      - "traefik.backend=traefik"
      - "traefik.frontend.rule=Host:traefik.${DOMAINNAME}"  
      - "traefik.port=8080"
      - "traefik.docker.network=traefik_proxy"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /opt/traefik:/etc/traefik
      - /opt/traefik/shared:/shared

  helloworld:
    image: matheuscarino/simple-nodejs-app:latest
    container_name: helloworld
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - FOO=BAR
    networks:
      - traefik_proxy
    labels:
      - "traefik.enable=true"
      - "traefik.backend=helloworld"
      - "traefik.frontend.rule=Host:helloworld.${DOMAINNAME}"  
      - "traefik.port=3000"

networks:
  traefik_proxy:
    external:
      name: traefik_proxy
  default:
    driver: bridge

Traefik отлично работает, когда мне нужно перенаправить запросы к приложениям, работающим на самом хосте через Docker (через Labels). Мое приложение helloworld.domain.com работает!

Traefik отлично работает, когда я перенаправляю только одно приложение. С того момента, как я настраиваю второе приложение в том же поддомене, traefik теряется в перенаправлениях через PATH.

Я искал в Интернете варианты использования, подобные моему, но я не нашел людей, использующих Traefik для перенаправления приложения за пределы Docker Engine, Kubernetes и т. Д.

1 Ответ

0 голосов
/ 05 сентября 2018

Вам необходимо добавить этот параметр во внешние интерфейсы «AddPrefix: / myprefix» и удалить путь в URL-адресах бэкэндов следующим образом: (url = "http://192.168.0.11:8200/myprefix") to (url =" http://192.168.0.11:8200)

Вам просто нужно переместить этот «путь» к параметру «AddPrefix» в конфигурациях внешнего интерфейса, если у вас есть PATH в вашем URL.

Все остальные конфигурации в порядке !!

web1.toml

loglevel = "ERROR"

[backends]
  [backends.web-backend]
    [backends.web-backend.servers.backend_web-backend1]
      url = "http://192.168.0.11:8200"

[frontends]
  [frontends.web-frontend]
    backend = "web-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.web-frontend.routes.frontend_web-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/web1;AddPrefix:/web1"

web2.toml

loglevel = "ERROR"

[backends]
  [backends.web-backend]
    [backends.web-backend.servers.backend_web-backend1]
      url = "http://192.168.0.11:8300"

[frontends]
  [frontends.web-frontend]
    backend = "web-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.web-frontend.routes.frontend_web-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/web2;AddPrefix:/web2"

api1.toml

loglevel = "ERROR"

[backends]
  [backends.api-backend]
    [backends.api-backend.servers.backend_api-backend1]
      url = "http://192.168.0.11:8210"

[frontends]
  [frontends.api-frontend]
    backend = "api-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.api-frontend.routes.frontend_api-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/api1;AddPrefix:/api1"

api2.toml

loglevel = "ERROR"

[backends]
  [backends.api-backend]
    [backends.api-backend.servers.backend_api-backend1]
      url = "http://192.168.0.11:8310"

[frontends]
  [frontends.api-frontend]
    backend = "api-backend"
    X-Custom-Response-Header = true
    SSLRedirect = true
  [frontends.api-frontend.routes.frontend_api-frontend1]
    rule = "Host:dev.domain.com;PathPrefixStrip:/api2;AddPrefix:/api2"
...