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

ポート 80 でリバース プロキシとして動作する NGINX コンテナがあります。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 が間違っているためにこれらのファイルが見つからないのは当然です。しかし、なぜ間違っているのでしょうか?

ここに画像の説明を入力してください

どのように修正しようとしたか:

私のサービス(Node.js ベースのヘッドレス CMS (Directus))でも同じ問題が発生しましたsite-apiが、設定でパブリック 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

これは、NGINX ではなく、バックエンド サービス Mautic の問題であると考えています。何が起こっているのか、また、いくつかの解決策は、ここから得ることができます。https://serverfault.com/a/797006

私は、ドメインのサブパスではなく、サブドメインをサービスにポイントするソリューションを選択しました。

したがって、次のようにアクセスするのではなくexample.com/mautic/

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

server_name私はset toで別の server ブロックを作成しmautic.example.com、その中に location ブロックを作成します。

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

関連情報