我无法登录 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 生成的证书。
这是一个工作配置。 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;
}
}
}
问题与您用于 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
。
这就是这个答案所做的,但它修改了你的nginx配置,这是没有必要的。
由于控制台和服务器并置在同一个容器中,如果未显式设置
MINIO_SERVER_URL
,控制台将自动选择容器的非环回地址来访问存储。
您还可以从容器的启动日志中看到该地址,例如 以下行(控制台将使用第一个地址来联系 服务器):
API: http://192.168.106.5:9000 http://127.0.0.1:9000
另请注意,
仅由控制台使用,设置它或 不会影响我们访问存储服务。MINIO_SERVER_URL
不建议这样做,除非您确实想确保连接安全 在控制台和服务器之间。
因为,我不知道是否有任何 CLI 选项或环境变量让
minio
信任额外的证书,我们需要通过将您的证书文件添加到映像的受信任证书存储来扩展映像。
将
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
如果不重建镜像,直接绑定挂载 本地系统到容器的
/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多个 目录。
替代(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}
注:
镜像基于RedHat的minio/minio
, 不包括包管理器。所以,我们无法安装ubi9:micro
包裹。这就是为什么我们需要从以下位置复制 CA 证书文件: 主机系统。ca-certificates