Minio是我们项目中经常用到的文件存储系统,今天项目升级,原本用cos的,现在改为minio,结果报错no path allowed in endpoint。瞬间我们都不知道怎么回事了,测试环境也大了一个minio的系统,用的很正常,怎么生产环境就出问题了呢?今天一起解决一下minio的问题no path allowed in endpoint,希望能解决。

报错信息如下:

minio

java.lang.IllegalArgumentException: no path allowed in endpoint https://*****:30080/minio/,看到这个报错, 于是开始在网上找答案,有说要把解决方法:把url的前缀http://去掉即可, 但实际上, 没什么用, 因为你不写http, 默认会加上, 很明显, 我们用的https, 用http根本行不通。

回到代码中,是175行报错,代码如下

    /**
     * 初始化客户端
     * @param minioUrl
     * @param minioName
     * @param minioPass
     * @return
     */
    private static MinioClient initMinio(String minioUrl, String minioName,String minioPass) {
        if (minioClient == null) {
            try {
                minioClient = MinioClient.builder()
                        .endpoint(minioUrl)
                        .credentials(minioName, minioPass)
                        .build();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return minioClient;
    }

看代码, 是在 .endpoint(minioUrl) 这一行报的错,但是为什么呢?继续找答案。

这篇文章给了我启发:https://cloud.tencent.com/developer/article/1410224,

当我们再minio中配置nginx代理的时候,可能要踏坑。Minio官方文档有配置nginx代理的说明,但是如果应用到业务当中还是会踩一下坑,在实际应用中,我希望通过配置应用名称的方法达到Java 应用可以连接、分享连接可以下载文件、URL可以直接登录的目的,然后加入如下配置:

location /files {
   proxy_buffering off; //重要!
   proxy_set_header Host $http_host;
   proxy_pass http://localhost:9000;
 }
# 或者
location /minio {
   proxy_buffering off; //重要!
   proxy_set_header Host $http_host;
   proxy_pass http://localhost:9000/minio;
 }

但是这两种配置均不能达到我所希望的效果,第一种直接重定向失败、第二种可以实现网页登录,但是无法实现Java程序连接,连接时报错:

io.minio.errors.InvalidEndpointException: no path allowed in endpoint

果然,大家报的错是一样的,猜测Minio的endpoint仅支持到root,也就是/目录下,所以在nginx配置中新加了一个server,也就是Minio官方文档上给出的配置。

server {
 listen 80; #或者443
 server_name file.example.com;
 location / {
   proxy_buffering off;
   proxy_set_header Host $http_host;
   proxy_pass http://localhost:9000;
 }
}


这样配置对强迫症不太友好,但是为了实现业务职能把Minio的代理单独一个server,配置唯一的二级域名来代理。这个解决no path allowed in endpoint的方法,应该是可以的,我们也还在尝试。

另一种方式,这是从代码中看到的。首先报错的原因在哪里呢,打开代码,看到这样一行。

    private void validateUrl(HttpUrl url) {
      if (!url.encodedPath().equals("/")) {
        throw new IllegalArgumentException("no path allowed in endpoint " + url);
      }
    }

这是构建minio的时候,一个校验url的时候,如果url不是以斜杠结尾,会报这个错。