El proxy inverso Docker NGINX no funciona con un servicio Docker, pero funciona con otro

El proxy inverso Docker NGINX no funciona con un servicio Docker, pero funciona con otro

Estoy intentando ejecutar un servicio Mautic (https://hub.docker.com/r/mautic/mautic) detrás del proxy inverso NGINX en Docker y no puedo entender qué estoy haciendo mal.

Un pequeño preámbulo para presentar mi configuración:

Dado que Mautic escucha en el puerto 80, y ya tengo un contenedor NGINX escuchando en el puerto 80, cambié el puerto 80 a 8081 en los siguientes archivos dentro de la imagen de Mautic: /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf

Tengo un contenedor NGINX que funciona como proxy inverso en el puerto 80. Tengo lo siguiente en mi contenedor 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/;
    }
}

Tengo el puerto 8081 para Mautic expuesto en el archivo docker-compose.yml.

Ahora las partes problemáticas:

  • Si voy a http://localhost:8081, la URL del navegador cambia a http://localhost:8081/s/dashboard y Mautic funciona bien.
  • Sin embargo, si voy a http://localhost/mautic/, la URL del navegador cambia a http://localhost/s/dashboard, lo que me lleva a mi site-clientservicio. De alguna manera la parte /mautic/ de la URL se perdió aquí.
  • Entonces, si voy a http://localhost/mautic/s/dashboard, la URL permanece igual y Mautic se carga con un montón de errores ERR_ABORTED 404 (consulte la imagen de la consola de desarrollador de Chrome a continuación). Los encabezados de solicitud para estos archivos muestran que a la URL de solicitud todavía le falta la parte /mautic/ (aunque la incluí manualmente en la URL del navegador), por lo que tiene sentido que esos archivos no se puedan encontrar porque la URL del encabezado de solicitud Está Mal. Pero ¿por qué está mal?

ingrese la descripción de la imagen aquí

Cómo intenté solucionarlo:

Tuve el mismo problema con mi site-apiservicio, que es un CMS sin cabeza (Directus) basado en Node.js, y lo solucioné configurando su URL pública en http://localhost/api en su configuración. Si voy a http://localhost/api/, este servicio funciona bien. Entonces intenté lo mismo en la configuración de Mautic y configuré su URL pública de http://localhost:8081 a http://localhost/mautic. Ahora, si voy a http://localhost/mautic/, la URL del navegador está configurada correctamente en http://localhost/mautic/s/dashboard, pero sigo obteniendo el mismo resultado como se puede ver en la imagen a continuación.

Este es mi docker-compose.yml con respecto a Mautic y 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 es reverse-proxyel 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 es mauticel 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.confArchivo de imagen 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.confArchivo de imagen 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

Respuesta1

Creo que esto es un problema con mi servicio backend Mautic y no con NGINX. Lo que está sucediendo y algunas soluciones se pueden obtener desde aquí:https://serverfault.com/a/797006

Elegí una solución en la que apunto un subdominio a mi servicio en lugar de ser una subruta de un dominio.

Entonces, en lugar de intentar acceder a él a través de example.com/mautic/:

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

Creo un bloque de servidor separado server_nameconfigurado en mautic.example.comy mi bloque de ubicación dentro de él es:

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

información relacionada