解决Nginx代理MinIO出现Access Denied及404

问题描述:

使用Nginx代理MinIO文件访问的9000端口报Access Denied

<Error>
	<Code>AccessDenied</Code>
	<Message>Access Denied.</Message>
	<BucketName>1_1694055704455.png</BucketName>
	<Resource>/1_1694055704455.png</Resource>
	<RequestId>17828BD2DD045C1D</RequestId>
	<HostId>dd9025bab4ad464b0491148b658df7ac2e3e8</HostId>
</Error>
解决办法(Nginx侧):
location /桶命名/{
			proxy_set_header X-Forwarded-Proto $scheme;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Host $http_host;
			proxy_connect_timeout 300;
			#Default is HTTP/1, keepalive is only enabled in HTTP/1.1
			proxy_http_version 1.1;
			proxy_set_header Connection "";
			chunked_transfer_encoding off;
			#MinIO访问地址
			proxy_pass http://111.16.111.111:9000;
    	}

前置条件:

如果你是刚安装完MinIO,需要把桶的权限打开,存储桶设置公有读、私有写的功能,这个场景应用非常广泛,比如静态文件的分发访问。minio是一个兼容S3协议的存储,S3上似乎没有这个公有读、私有写的概念。S3上叫policy(管理访问策略)

如果需要将minio某个存储桶设置为公有读、私有写,只需要将policy策略设置为download即可。

HTTPS访问,Nginx配置:
server {
    listen 443 ssl http2;
    #改成你自己的SSL证书路径
    ssl_certificate /path/domain.com.crt;
    ssl_certificate_key /path/domain.com.key;
    ssl_session_timeout 1d;
    #ssl_session_cache builtin:1000 shared:SSL:10m;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
    ssl_prefer_server_ciphers on;

    ssl_stapling on;
    ssl_stapling_verify on;
    add_header Strict-Transport-Security max-age=15768000;
    proxy_buffering off;

    #domain.com改成你自己的域名
    server_name domain.com;
    #网站日志的路径,注意nginx用户需要可写,如果不需要可以注释掉
    access_log /data/wwwlogs/domain.com.log combined;

    charset utf-8,gbk;

    location / {
        #开启自定义错误页面
        proxy_intercept_errors on;
        proxy_connect_timeout 300;
        # Default is HTTP/1, keepalive is only enabled in HTTP/1.1
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        #bucket改成你自己的存储桶名称,注意:末尾需要带有一个/
        proxy_pass http://127.0.0.1:9000/bucket/;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #客户端缓存时间,这里设置为7天,根据自己的需要设置即可
        expires 7d;
        add_header XCDN-Cache "$upstream_cache_status";
        #可以在存储桶事先上传一个html文件或者图片,用作404页面,然后改成存储桶下面的绝对路径,以/开头,如果不需要,可以将其注释
        error_page 404 /404.png;
    }
}
server
{
    # 301重定向
    listen 80;
    server_name domain.com;
    rewrite ^(.*) https://domain.com$1 redirect;
}

好运!加油!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐