Docker NGINX Reverse Proxy funktioniert nicht mit einem Docker-Dienst, aber mit einem anderen

Docker NGINX Reverse Proxy funktioniert nicht mit einem Docker-Dienst, aber mit einem anderen

Ich versuche, einen Dienst Mautic auszuführen (https://hub.docker.com/r/mautic/mautic) hinter dem NGINX-Reverse-Proxy in Docker und kann nicht herausfinden, was ich falsch mache.

Eine kleine Einleitung zur Vorstellung meines Setups:

Da Mautic auf Port 80 lauscht und ich bereits einen NGINX-Container habe, der auf Port 80 lauscht, habe ich in den folgenden Dateien im Mautic-Image Port 80 in 8081 geändert: /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf

Ich habe einen NGINX-Container, der als Reverse-Proxy an Port 80 arbeitet. In meinem NGINX-Container befindet sich Folgendes /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/;
    }
}

Ich habe Port 8081 für Mautic in der Datei docker-compose.yml freigegeben.

Nun zu den problematischen Teilen:

  • Wenn ich zu http://localhost:8081 gehe, ändert sich die URL des Browsers zu http://localhost:8081/s/dashboard und Mautic funktioniert einwandfrei.
  • Wenn ich jedoch zu http://localhost/mautic/ gehe, ändert sich die URL des Browsers zu http://localhost/s/dashboard, wodurch ich zu meinem site-clientDienst gelange. Irgendwie ist hier der /mautic/-Teil der URL verloren gegangen.
  • Wenn ich also zu http://localhost/mautic/s/dashboard gehe, bleibt die URL gleich und Mautic wird mit einer Reihe von ERR_ABORTED 404-Fehlern geladen (siehe das Bild der Chrome-Entwicklerkonsole unten). Die Anforderungsheader für diese Dateien zeigen, dass in der Anforderungs-URL immer noch der Teil /mautic/ fehlt (obwohl ich ihn manuell in die URL des Browsers eingefügt habe). Es ist also verständlich, dass diese Dateien nicht gefunden werden können, weil die URL des Anforderungsheaders falsch ist. Aber warum ist sie falsch?

Bildbeschreibung hier eingeben

So habe ich versucht, das Problem zu beheben:

Ich hatte dasselbe Problem mit meinem site-apiDienst, einem Headless-CMS (Directus), das auf Node.js basiert, und habe es behoben, indem ich seine öffentliche URL in seiner Konfiguration auf http://localhost/api gesetzt habe. Wenn ich zu http://localhost/api/ gehe, funktioniert dieser Dienst einwandfrei. Also habe ich dasselbe in der Konfiguration von Mautic versucht und seine öffentliche URL von http://localhost:8081 auf http://localhost/mautic gesetzt. Wenn ich jetzt zu http://localhost/mautic/ gehe, wird die URL des Browsers korrekt auf http://localhost/mautic/s/dashboard gesetzt, aber ich erhalte trotzdem dasselbe Ergebnis, wie im Bild unten zu sehen ist.

Dies ist meine docker-compose.yml in Bezug auf Mautic und 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

Dies ist 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;" ]

Dies ist 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

Mautic- ports.confBilddatei

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- 000-default.confBilddatei

<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

Antwort1

Ich glaube, das ist ein Problem mit meinem Backend-Dienst Mautic und nicht mit NGINX. Was passiert und einige Lösungen können hier nachgelesen werden:https://serverfault.com/a/797006

Ich habe mich für eine Lösung entschieden, bei der ich eine Subdomäne auf meinen Dienst verweise, anstatt dass es sich um einen Unterpfad einer Domäne handelt.

Anstatt also zu versuchen, darauf über Folgendes zuzugreifen example.com/mautic/:

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

Ich erstelle einen separaten Serverblock mit „ server_nameEingestellt auf“ mautic.example.comund mein Standortblock darin ist:

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

verwandte Informationen