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-client
serviç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?
Como tentei consertar:
Tive o mesmo problema com meu site-api
serviç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-proxy
o 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 é mautic
o 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.conf
Arquivo 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.conf
Arquivo 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_name
set to mautic.example.com
e meu bloco de localização dentro dele é:
location / {
proxy_pass http://mautic:8081/;
}