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

/etc/nginx/conf.d/default.conf我有一個NGINX 容器在連接埠 80 上充當反向代理。

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

自動圖像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

自動圖像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/;
}

相關內容