O proxy reverso Docker NGINX não funciona com um serviço docker, mas funciona com outro

O proxy reverso Docker NGINX não funciona com um serviço docker, mas funciona com outro

Estou tentando executar um serviço Mautic (https://hub.docker.com/r/mautic/mautic) por trás do proxy reverso NGINX no Docker e não consigo descobrir o que estou fazendo de errado.

Um pequeno preâmbulo para apresentar minha configuração:

Como o Mautic escuta na porta 80, e eu já tenho o contêiner NGINX escutando na porta 80, alterei a porta 80 para 8081 nos seguintes arquivos dentro da imagem do Mautic: /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf

Eu tenho um contêiner NGINX funcionando como proxy reverso na porta 80. Tenho o seguinte em meu contêiner 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/;
    }
}

Tenho a porta 8081 para Mautic exposta no arquivo docker-compose.yml.

Agora as partes problemáticas:

  • Se eu for para http://localhost:8081, a URL do navegador muda para http://localhost:8081/s/dashboard e o Mautic funciona bem.
  • Porém, se eu for para http://localhost/mautic/, a URL do navegador muda para http://localhost/s/dashboard, o que me leva ao meu site-clientserviço. De alguma forma, a parte /mautic/ da URL se perdeu aqui.
  • Então, se eu for para http://localhost/mautic/s/dashboard, o URL permanece o mesmo e o Mautic carrega com vários erros ERR_ABORTED 404 (veja a imagem do console do desenvolvedor do Chrome abaixo). Os cabeçalhos de solicitação para esses arquivos mostram que a URL da solicitação ainda está faltando a parte /mautic/ (mesmo que eu a tenha incluído manualmente na URL do navegador), então faz sentido que esses arquivos não possam ser encontrados porque o URL do cabeçalho da solicitação está errado. Mas por que isso está errado?

insira a descrição da imagem aqui

Como tentei consertar:

Tive o mesmo problema com meu site-apiserviço, que é um CMS headless baseado em Node.js (Directus), e o corrigi definindo seu URL público como http://localhost/api em sua configuração. Se eu for para http://localhost/api/, este serviço funciona bem. Então tentei o mesmo na configuração do Mautic e configurei sua URL pública de http://localhost:8081 para http://localhost/mautic. Agora, se eu for para http://localhost/mautic/, a URL do navegador será configurada corretamente para http://localhost/mautic/s/dashboard, mas ainda obtenho o mesmo resultado que pode ser visto na imagem abaixo.

Este é o meu docker-compose.yml em relação ao Mautic e 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

Este é reverse-proxyo Dockerfile:

FROM nginx:alpine

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

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

EXPOSE 80

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

Este é mautico Dockerfile:

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.confArquivo de imagem 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.confArquivo de imagem 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

Responder1

Acredito que este seja um problema com meu serviço de back-end Mautic e não com o NGINX. O que está acontecendo e algumas soluções podem ser obtidas aqui:https://serverfault.com/a/797006

Optei por uma solução em que aponto um subdomínio para o meu serviço, em vez de ser um subcaminho de um domínio.

Então, em vez de tentar acessá-lo via example.com/mautic/:

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

Eu crio um bloco de servidor separado com server_nameset to mautic.example.come meu bloco de localização dentro dele é:

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

informação relacionada