Обратное проксирование различных веб-серверов через / application-context - PullRequest
0 голосов
/ 26 февраля 2020

Моя цель ⚽

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

  • Балансировщик нагрузки / обратный прокси-сервер могут работать либо на узле узла, либо в контейнере, как как только правильная конфигурация сети / порта позволяет шлюзу запрашивать контейнеры
  • Мне нравится использовать Apache 2.4, но я могу переключиться на nginx или haproxy, если все станет проще

В идеале конфигурация шлюза фиксируется на git, и когда новые приложения переносятся на хостинг в среде Docker, конфигурация фиксируется и сервер перезапускается. Перезапуск включает в себя создание нового контейнера Docker для очень единого балансировщика нагрузки.

Глубоко в деталях

Мне нравится достигать каталог, который различает различные приложения по их сети /context-path.

  • У меня нет возможности (не хочу) назначать несколько имен DNS и различать guish виртуальных хостов по SNI
  • У меня нет для веб-сервера доступно несколько IP-адресов
  • Я не хочу использовать разные порты, потому что URL выглядят блестящими

Примеры:

Хосты Tomcat работают в своих собственных контейнерах, и все они размещают одно веб-приложение по правильному / context-path. Каждое веб-приложение знает свой контекстный путь во время выполнения, и я хочу установить ограничение, чтобы у каждого приложения был уникальный контекстный путь на всех Docker хостах.

Это потому, что перезапись контекста генерирует зла особенно с Ajax звонками

То, что я пробовал ?

Конечно, вы не публикуете в Stackoverflow, не выполнив исследования.

Ниже приведен фрагмент большего размера docker-compose.yml

  # Tomcat 8.5 Application Server
  edcom3-tomcat:
    depends_on:
      - edcom3-postgres
    build: ../../../edcom3-tomcat/build/docker
    image: initech/edcom3-tomcat
    expose:
      - "8009/tcp"
      - "8080/tcp"
    ports:
      - "${EDCOM3_AJP_PORT}:8009"
    volumes:
      - "edcom3-file-repository:/mnt/fileRepository"
      - "edcom3-logs:/mnt/logs"
      - "edcom3-tomcat-logs:/usr/local/tomcat/logs"
    restart: always
    networks:
      # Talks to Postgres
      # Answers to Apache
      - edcom3-be
      # For the moment let's keep docker-apache connected
      - docker-apache
    links:
      - edcom3-postgres

networks:
  # Backend (host-to-host) network
  edcom3-be:
    driver: bridge
    internal: true
  # Front end (where exposed services are available)
  docker-apache:
    external: true

Тогда мой хост-компьютер запускает контейнер Apache 2.4

docker run -d \
--mount type=bind,source=/home/docker/ssl,target=/etc/ssl/private,readonly \
-p80:80 \
-p443:443 \
-e "APACHE_SSL_CERTS=..." \
-e "APACHE_SSL_PRIVATE=..." \
-e "APACHE_SSL_CA_BUNDLE=...\
-e "APACHE_SERVER_NAME=dockerhost.example.local\
--network=docker-apache \
--name docker01-apache \
docker01-apache

А затем reverse-proxy.conf

<Proxy "balancer://edcom3">
    BalancerMember "ajp://192.168.72.3:8009/edcom3" loadfactor=1
    ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/edcom3" "balancer://edcom3"

Почему Разве это не работает?

Я обнаружил, что когда я указываю своему браузеру https://dockerhost.example.local ... «Это работает» (как и ожидалось по умолчанию Apache document root).

Но когда я указываю на https://dockerhost.example.local/edcom3, вызов правильно перенаправляется обратно на ajp://tomcat-container, но в его root контексте.

Это означает, что вызовы https://dockerhost.example.local/edcom3 равны вызову http://tomcat-container/ а не http://tomcat-container/edcom3, что я и хочу.

Я бы назвал https://dockerhost.example.local/edcom3/edcom3, что не то, что я хотел ant, потому что приложение считает, что оно под /edcom3, а не под /edcom3/edcom3.

Что не так в моей конфигурации?

...