Strange Mautic behavior behind NGINX reverse proxy in Docker

Your software
My Mautic version is: latest Mautic Docker image mautic/mautic:v4
My PHP version is: -
My Database type and version is: MariaDB v.10.10.2 (mariadb:latest docker image)

Your problem
My problem is:

I can’t get Mautic behind NGINX reverse proxy in Docker to work.

I think my problem is with Mautic because I have another docker service that I proxy to in an identical NGINX config and that service works perfectly.

A little preamble to introduce my setup:

Since Mautic listens on port 80, and I already have NGINX container listening on port 80, so I have changed port 80 to 8081 in the following files inside Mautic image:
/etc/apache2/ports.conf
/etc/apache2/sites-available/000-default.conf

I have an NGINX container working as a reverse proxy at port 80.
I have the following in my NGINX container’s /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/;
    }
}

I have port 8081 for Mautic exposed in docker-compose.yml file.

Now the problematic parts:

  • If I go to http://localhost:8081, the browser’s URL changes to http://localhost:8081/s/dashboard and Mautic works fine.
  • However, if I go to http://localhost/mautic/, the browser’s URL changes to http://localhost/s/dashboard, which takes me to my site-client service. Somehow the /mautic/ part of the URL got lost here.
  • So, if I go to http://localhost/mautic/s/dashboard, URL stays the same and Mautic loads with a bunch of ERR_ABORTED 404 errors (see the image of Chrome developer console below). Request headers for these files show that the request URL is still missing the /mautic/ part in them (even though I included it manually in the browser’s URL), so it makes sense that those files can’t be found because the request header URL is wrong. But why is it wrong?

How I tried to fix it:

I had the same problem with my site-api service, which is Directus and I fixed it by setting its public URL to http://localhost/api. If I go to http://localhost/api/, this app works fine.
So I tried the same in Mautic’s configuration and set its public URL from http://localhost:8081 to http://localhost/mautic. Now, if I go to http://localhost/mautic/, the browser’s URL is set correctly to http://localhost/mautic/s/dashboard, but I still get the same result as can be seen in the image below.
I also tried setting the environmnet variable MAUTIC_URL=http://localhost/mautic in docker-compose.yml, but still the same effect.

1

This is my docker-compose.yml with regards to Mautic and 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

This is reverse-proxy Dockerfile:

FROM nginx:alpine

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

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

EXPOSE 80

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

This is mautic 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

Mautic image ports.conf file

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

Mautic image 000-default.conf file

<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 Like