Обратный прокси-сервер Docker NGINX не работает с одним сервисом Docker, но работает с другим

Обратный прокси-сервер Docker NGINX не работает с одним сервисом Docker, но работает с другим

Я пытаюсь запустить службу Mautic (https://hub.docker.com/r/mautic/mautic) за обратным прокси-сервером NGINX в Docker и не могу понять, что я делаю не так.

Небольшое вступление, чтобы представить мою установку:

Поскольку Mautic прослушивает порт 80, а у меня уже есть контейнер NGINX, прослушивающий порт 80, я изменил порт 80 на 8081 в следующих файлах внутри образа Mautic: /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf

У меня есть контейнер NGINX, работающий как обратный прокси-сервер на порту 80. В моем контейнере NGINX есть следующее /etc/nginx/conf.d/default.conf:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location / {
        proxy_pass http://site-client:4200;
    }

    location /api/ {
        proxy_pass http://site-api:8055/;
    }

    location /mautic/ {
        proxy_pass http://mautic:8081/;
    }
}

У меня порт 8081 для Mautic открыт в файле docker-compose.yml.

Теперь проблемные места:

  • Если я перейду по адресу http://localhost:8081, URL-адрес браузера изменится на http://localhost:8081/s/dashboard и Mautic будет работать нормально.
  • Однако, если я перейду на http://localhost/mautic/, URL браузера изменится на http://localhost/s/dashboard, что приведет меня к моему site-clientсервису. Каким-то образом часть URL /mautic/ здесь потерялась.
  • Итак, если я перейду на http://localhost/mautic/s/dashboard, URL останется прежним, а Mautic загрузится с кучей ошибок ERR_ABORTED 404 (см. изображение консоли разработчика Chrome ниже). Заголовки запросов для этих файлов показывают, что в URL запроса по-прежнему отсутствует часть /mautic/ (хотя я вручную включил ее в URL браузера), поэтому вполне логично, что эти файлы не могут быть найдены, поскольку URL заголовка запроса неверен. Но почему он неверен?

введите описание изображения здесь

Как я пытался это исправить:

У меня была та же проблема с моим site-apiсервисом, который представляет собой headless CMS на основе Node.js (Directus), и я исправил ее, установив его публичный URL на http://localhost/api в его конфигурации. Если я перехожу на http://localhost/api/, этот сервис работает нормально. Поэтому я попробовал то же самое в конфигурации Mautic и установил его публичный URL с http://localhost:8081 на http://localhost/mautic. Теперь, если я перехожу на http://localhost/mautic/, URL браузера устанавливается правильно на http://localhost/mautic/s/dashboard, но я все равно получаю тот же результат, что и на изображении ниже.

Вот мой docker-compose.yml относительно Mautic и NGINX:

reverse-proxy:
    container_name: nginx
    build: ./tools/nginx
    depends_on:
        - site-api
        - site-client
        - mautic
    networks:
        - site-api-network
    ports:
        - 80:80
    restart: always
mautic:
    image: mautic/mautic:v4
    build: ./tools/mautic
    container_name: mautic
    links:
        - mauticdb:mysql
    depends_on:
        - mauticdb
    ports:
        - 8081:8081
    volumes:
         - mautic_data:/var/www/html
    environment:
        - MAUTIC_DB_HOST=mauticdb
        - MYSQL_PORT_3306_TCP=3306
        - MAUTIC_DB_USER=root
        - MAUTIC_DB_PASSWORD=${MAUTIC_DB_PASSWORD}
        - MAUTIC_DB_NAME=${MAUTIC_DB_NAME}
        - MAUTIC_RUN_CRON_JOBS=true
        - MAUTIC_INSTALL_FORCE=true
        - MAUTIC_ADMIN_EMAIL=${MAUTIC_ADMIN_EMAIL}
        - MAUTIC_ADMIN_PASSWORD=${MAUTIC_ADMIN_PASSWORD}
        - MAUTIC_ADMIN_USERNAME=${MAUTIC_ADMIN_USERNAME}
        - MAUTIC_ADMIN_FIRSTNAME=${MAUTIC_ADMIN_FIRSTNAME}
        - MAUTIC_ADMIN_LASTNAME=${MAUTIC_ADMIN_LASTNAME}
        - MAUTIC_TRUSTED_PROXIES=["0.0.0.0/0"]
    networks:
        - site-api-network

networks:
    site-api-network:
        driver: bridge

volumes:
    mautic_db_data:
        driver: local
    mautic_data:
        driver: local

Это reverse-proxyDockerfile:

FROM nginx:alpine

RUN rm /etc/nginx/conf.d/*

COPY ./default.conf /etc/nginx/conf.d/

EXPOSE 80

CMD [ "nginx", "-g", "daemon off;" ]

Это mauticDockerfile:

FROM mautic/mautic:v4

RUN rm /etc/apache2/ports.conf
RUN rm /etc/apache2/sites-available/000-default.conf

COPY ./ports.conf /etc/apache2/
COPY ./000-default.conf /etc/apache2/sites-available

EXPOSE 8081

ports.confФайл изображения Mautic

Listen 8081

<IfModule ssl_module>
    Listen 443
</IfModule>

<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

000-default.confФайл изображения Mautic

<VirtualHost *:8081>
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

решение1

Я считаю, что это проблема с моим бэкэнд-сервисом Mautic, а не NGINX. Что происходит и некоторые решения можно почерпнуть здесь:https://serverfault.com/a/797006

Я выбрал решение, при котором я указываю поддомен на свою службу, а не подпуть домена.

Поэтому вместо того, чтобы пытаться получить к нему доступ через example.com/mautic/:

location /mautic/ {
    proxy_pass http://mautic:8081/;
}

Я создаю отдельный блок сервера с server_nameпараметром set to mautic.example.comи моим блоком местоположения внутри него:

location / {
    proxy_pass http://mautic:8081/;
}

Связанный контент