无法登录nginx代理后面的minio

问题描述 投票:0回答:2

我无法登录 nginx 代理后面的 minio 控制台。两者都是通过 docker compose 作为 docker 容器启动的。我可以通过访问 localhost:9001 在没有代理的情况下登录 minio,但在代理后面则无法登录。尽管我使用与没有代理相同的登录名,但我收到响应 401 无效登录。 Nginx 配置主要取自 minio 文档。谁能看看原因或知道我可以检查什么才能登录吗?

docker compose 的一部分:

  nginx:
    image: nginx:alpine
    restart: unless-stopped
    ports:
      - ${FORWARD_NGINX_HTTP_PORT:-80}:80
      - ${FORWARD_NGINX_HTTPS_PORT:-443}:443
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./nginx/ssl:/etc/nginx/ssl
    networks:
      - default
  minio:
    image: minio/minio
    command: minio server /data/minio --console-address ":9001"
    restart: unless-stopped
    healthcheck:
      test: [ "CMD", "mc", "ready", "local" ]
      interval: 30s
      timeout: 5s
      retries: 3
    expose:
      - 9000
      - 9001
    environment:
      MINIO_ROOT_USER: ${MINIO_ROOT_USER:-minio}
      MINIO_ROOT_PASSWORD: ${MINIO_ROOT_PASSWORD:-password}
      MINIO_SERVER_URL: https://s3.localhost
      MINIO_BROWSER_REDIRECT_URL: https://s3.localhost/minio/ui
    ports:
      - ${FORWARD_MINIO_API_PORT:-9000}:9000
      - ${FORWARD_MINIO_CONSOLE_PORT:-9001}:9001
    volumes:
      - minio-data:/data
    networks:
      - default

部分nginx配置:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name s3.localhost;

    ssl_certificate /etc/nginx/ssl/localhost.crt;
    ssl_certificate_key /etc/nginx/ssl/localhost.key;

    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;

        proxy_pass http://minio:9000;
    }

    location /minio/ui {
        rewrite ^/minio/ui/(.*) /$1 break;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-NginX-Proxy true;

        real_ip_header X-Real-IP;

        proxy_connect_timeout 300;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Origin '';

        chunked_transfer_encoding off;

        proxy_pass http://minio:9001;
    }
}

使用 mkcert 生成的证书。

docker nginx docker-compose minio
2个回答
2
投票

这是一个工作配置。 Minio 控制台位于 https://127.0.0.1/

├── docker-compose.yml
└── nginx
    ├── nginx.conf
    └── ssl
        ├── localhost.crt
        └── localhost.key

🗎

docker-compose.yml

version: '3.7'

services:
  minio:
    image: minio/minio
    command: server --console-address ":9001" /data
    restart: unless-stopped
    hostname: minio
    volumes:
      - data:/data
    healthcheck:
      test: [ "CMD", "mc", "ready", "local" ]
      interval: 30s
      timeout: 5s
      retries: 3
    environment:
      MINIO_ROOT_USER: minio
      MINIO_ROOT_PASSWORD: password

  nginx:
    image: nginx:alpine
    hostname: nginx
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ./nginx/ssl:/etc/nginx/ssl
    ports:
      - "443:443"
    restart: unless-stopped
    depends_on:
      - minio

volumes:
  data:

🗎

nginx/nginx.conf

user  nginx;
worker_processes  auto;

events {
}

http {
    include                 /etc/nginx/mime.types;
    default_type            application/octet-stream;

    sendfile                on;
    keepalive_timeout       65;

    upstream console {
        server minio:9001;
    }

    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name s3.localhost;

        ssl_certificate /etc/nginx/ssl/localhost.crt;
        ssl_certificate_key /etc/nginx/ssl/localhost.key;

        ignore_invalid_headers off;
        client_max_body_size 0;
        proxy_buffering off;
        proxy_request_buffering off;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-NginX-Proxy true;
            real_ip_header X-Real-IP;
            proxy_connect_timeout 300;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            chunked_transfer_encoding off;

            proxy_pass http://console;
        }
    }
}


0
投票

问题原因

问题与您用于 nginx 服务 HTTPS 流量的 SSL 证书(似乎是自签名)有关。

ssl_certificate /etc/nginx/ssl/localhost.crt;
ssl_certificate_key /etc/nginx/ssl/localhost.key;

Minio Console 将连接到 Minio Server 的存储以访问其管理数据(例如登录时的用户数据)。将

MINIO_SERVER_URL
设置为
https://s3.localhost
将使控制台通过 HTTPS 访问服务器(nginx 代理)。由于服务器的证书不被控制台信任,从服务器访问数据会通过TLS验证失败,从而导致控制台显示
401 invalid login

解决方案

方案一:使用内部地址访问Minio服务器

这就是这个答案所做的,但它修改了你的nginx配置,这是没有必要的。

由于控制台和服务器并置在同一个容器中,如果未显式设置

MINIO_SERVER_URL
,控制台将自动选择容器的非环回地址来访问存储。

您还可以从容器的启动日志中看到该地址,例如 以下行(控制台将使用第一个地址来联系 服务器):

API: http://192.168.106.5:9000  http://127.0.0.1:9000

另请注意,

MINIO_SERVER_URL
仅由控制台使用,设置它或 不会影响我们访问存储服务。

解决方案2:让控制台信任您自己的证书

不建议这样做,除非您确实想确保连接安全 在控制台和服务器之间。

因为,我不知道是否有任何 CLI 选项或环境变量让

minio
信任额外的证书,我们需要通过将您的证书文件添加到映像的受信任证书存储来扩展映像。

  1. localhost.crt
    root-ca.crt
    (如果您使用自己的 CA 签署
    localhost.crt
    )添加到托管 docker 的本地系统。

    sudo apt install ca-certificates  # or yum, dnf,... depends on your OS.
    sudo cp localhost.crt /usr/local/share/ca-certificates/
    sudo update-ca-certificates  # for Debian-based OS
    sudo update-ca-trust force-enable && sudo update-ca-trust extract # for RHEL-based OS
    
  2. 如果不重建镜像,直接绑定挂载 本地系统到容器的

    /etc/ssl/certs/ca-certificates.crt
    在您的撰写文件中。

    services:
      minio:
        image: minio/minio
        volumes:
          - minio-data:/data
          - /etc/ssl/certs/ca-certificates.crt:/etc/ssl/certs/ca-certificates.crt
    

    同(3),如果mount单个文件不够,再mount多个 目录。

  3. 替代(2),扩展官方图片:

    # custom.Dockerfile
    FROM minio/minio
    COPY /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
    

    这是从官方图片得知的。如果不够,复制全部

    /etc/ssl/certs/
    /usr/share/ca-certificates
    和 的目录
    /usr/local/share/ca-certificates
    到图像。

    docker build -f custom.Dockerfile -t minio:${TAG:-latest}
    

minio/minio
镜像基于RedHat的
ubi9:micro
, 不包括包管理器。所以,我们无法安装
ca-certificates
包裹。这就是为什么我们需要从以下位置复制 CA 证书文件: 主机系统。

© www.soinside.com 2019 - 2024. All rights reserved.