Docker NGINX 反向代理不适用于一个 Docker 服务,但适用于另一个 Docker 服务

Docker NGINX 反向代理不适用于一个 Docker 服务,但适用于另一个 Docker 服务

我正在尝试运行服务 Mautic (https://hub.docker.com/r/mautic/mautic) 在 Docker 中的 NGINX 反向代理后面,无法弄清楚我做错了什么。

先简单介绍一下我的设置:

由于 Mautic 监听端口 80,并且我已经有 NGINX 容器监听端口 80,因此我在 Mautic 映像中的以下文件中将端口 80 更改为 8081: /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf

我有一个 NGINX 容器在端口 80 上作为反向代理工作。我的 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/;
    }
}

我在 docker-compose.yml 文件中公开了 Mautic 的端口 8081。

现在有问题的部分:

  • 如果我访问 http://localhost:8081,浏览器的 URL 会更改为 http://localhost:8081/s/dashboard,并且 Mautic 可以正常工作。
  • 但是,如果我访问 http://localhost/mautic/,浏览器的 URL 会更改为 http://localhost/s/dashboard,这会将我带到我的site-client服务。不知何故,URL 的 /mautic/ 部分在这里丢失了。
  • 因此,如果我转到 http://localhost/mautic/s/dashboard,URL 保持不变,Mautic 会加载一堆 ERR_ABORTED 404 错误(参见下面的 Chrome 开发者控制台图片)。这些文件的请求标头显示请求 URL 中仍然缺少 /mautic/ 部分(即使我手动将其包含在浏览器的 URL 中),因此由于请求标头 URL 错误而无法找到这些文件是有道理的。但为什么错了呢?

在此处输入图片描述

我尝试修复它的方法:

我的site-api服务也遇到了同样的问题,它是基于 Node.js 的无头 CMS(Directus),我通过在其配置中将其公共 URL 设置为 http://localhost/api 来修复它。如果我转到 http://localhost/api/,此服务可以正常工作。因此,我在 Mautic 的配置中尝试了相同的操作,并将其公共 URL 从 http://localhost:8081 设置为 http://localhost/mautic。现在,如果我转到 http://localhost/mautic/,浏览器的 URL 会正确设置为 http://localhost/mautic/s/dashboard,但我仍然得到相同的结果,如下图所示。

这是我与 Mautic 和 NGINX 相关的 docker-compose.yml:

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

这是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;" ]

这是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.conf文件

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.conf文件

<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

我相信这是我的后端服务 Mautic 的问题,而不是 NGINX。可以从这里了解发生了什么以及一些解决方案:https://serverfault.com/a/797006

我采用了一个解决方案,将子域指向我的服务,而不是将其作为域的子路径。

因此,不要尝试通过以下方式访问它example.com/mautic/

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

我创建了一个单独的服务器块,并将其server_name设置为mautic.example.com,其中的位置块为:

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

相关内容