S3 网关
JuiceFS S3 网关是 JuiceFS 支持的多种访问方式之一,它可以将 JuiceFS 文件系统以 S3 协议对外提供服务,使得应用可以通过 S3 SDK 访问 JuiceFS 上存储的文件。
架构与原理
JuiceFS 会将文件分块存储到底层的对象存储中,暴露给用户的往往是 POSIX 接口,而如果你需要同时用 S3 兼容接口访问 JuiceFS 中的文件,就可以用到 S3 网关。其架构图如下:

常见的使用场景有:
- 为 JuiceFS 文件系统暴露 S3 接口,应用可以通过 S3 SDK 访问 JuiceFS 上存储的文件
- 使用 s3cmd、AWS CLI、MinIO 客户端来方便地访问和操作 JuiceFS 上存储的文件
- 在跨集群复制数据的场景下,作为集群的统一数据出口,避免跨区访问元数据以提升数据传输性能,详见「使用 S3 网关进行跨区域数据同步」
快速开始
gateway 命令和 mount 命令类似,会读取 JuiceFS 客户端在本地的配置文件(默认 ~/.juicefs/$VOL_NAME.conf),如果配置文件尚未获取,那么需要先使用 auth 命令对文件系统进行认证,并获取配置文件。
juicefs auth $VOL_NAME --token=xxx --access-key=xxx --secret-key=xxx
JuiceFS S3 网关基于开源的 MinIO 代码实现,因此部署时需要指定 MinIO 相关认证信息:
export MINIO_ACCESS_KEY="admin"
export MINIO_SECRET_KEY="password"
如果未能正确设置,将会遭遇类似 MINIO_ROOT_USER should be specified as an environment variable with at least 3 characters 的报错,注意排查。
认证信息填写完毕,运行 gateway 命令启动网关:
juicefs gateway myjfs 127.0.0.1:9000
启动成功会看到类似下面的输出:
2023/03/21 20:15:49.945403 juicefs[97188] <INFO>: connected to 47.103.20.252:9308 [client.go:874]
2023/03/21 20:15:49.965411 juicefs[97188] <INFO>: Cache: /Users/herald/.juicefs/cache/jfs8 capacity: 102400 MB [disk_cache.go:747]
Endpoint: http://127.0.0.1:9000
Browser Access:
http://127.0.0.1:9000
Object API (Amazon S3 compatible):
Go: https://docs.min.io/docs/golang-client-quickstart-guide
Java: https://docs.min.io/docs/java-client-quickstart-guide
Python: https://docs.min.io/docs/python-client-quickstart-guide
JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
.NET: https://docs.min.io/docs/dotnet-client-quickstart-guide
S3 网关启用时,在当前主机上可以使用 http://localhost:9000 这个地址访问到 S3 网关的管理界面。

如果你希望通过局域网或互联网上的其他主机访问 S3 网关,则需要调整监听地址,例如:
juicefs gateway myjfs 0.0.0.0:9000
这样一来 ,S3 网关将会默认接受所有网络请求。不同的位置的 S3 客户端可以使用不同的地址访问 S3 网关,例如:
- S3 网关所在主机中的第三方客户端可以使用
http://127.0.0.1:9000或http://localhost:9000进行访问; - 与 S3 网关所在主机处于同一局域网的第三方客户端可以使用
http://192.168.1.8:9000访问(假设启用 S3 网关的主机内网 IP 地址为 192.168.1.8); - 通过互联网访问 S3 网关可以使用
http://110.220.110.220:9000访问(假设启用 S3 网关的主机公网 IP 地址为 110.220.110.220)。
访问 S3 网关
各类支持 S3 API 的客户端、桌面程序、Web 程序等都可以访问 JuiceFS S3 网关。使用时请注意 S3 网关监听的地址和端口。
以下示例均为使用第三方客户端访问本地主机上运行的 S3 网关。在具体场景下,请根据实际情况调整访问 S3 网关的地址。
使用 AWS CLI
从 https://aws.amazon.com/cli 下载并安装 AWS CLI,然后进行配置:
$ aws configure
AWS Access Key ID [None]: admin
AWS Secret Access Key [None]: 12345678
Default region name [None]:
Default output format [None]:
程序会通过交互式的方式引导你完成新配置的添加,其中 Access Key ID 与 MINIO_ROOT_USER 相同,Secret Access Key 与 MINIO_ROOT_PASSWORD 相同,区域名称和输出格式请留空。
之后,即可使用 aws s3 命令访问 JuiceFS 存储,例如:
# List buckets
$ aws --endpoint-url http://localhost:9000 s3 ls
# List objects in bucket
$ aws --endpoint-url http://localhost:9000 s3 ls s3://<bucket>
使用 MinIO 客户端
为避免兼容性问题,我们推荐采用的 mc 的版本为 RELEASE.2021-04-22T17-40-00Z,你可以在这个地址找到历史版本和不同架构的 mc,比如这是 amd64 架构 RELEASE.2021-04-22T17-40-00Z 版本的 mc 的下载地址
下载安装完成 mc 后添加一个新的 alias:
mc alias set juicefs http://localhost:9000 admin 12345678
然后,你可以通过 mc 客户端自由的在本地磁盘与 JuiceFS 存储以及其他云存储之间进行文件和文件夹的复制、移动、增删等管理操作。
$ mc ls juicefs/jfs
[2021-10-20 11:59:00 CST] 130KiB avatar-2191932_1920.png
[2021-10-20 11:59:00 CST] 4.9KiB box-1297327.svg
[2021-10-20 11:59:00 CST] 21KiB cloud-4273197.svg
[2021-10-20 11:59:05 CST] 17KiB hero.svg
[2021-10-20 11:59:06 CST] 1.7MiB hugo-rocha-qFpnvZ_j9HU-unsplash.jpg
[2021-10-20 11:59:06 CST] 16KiB man-1352025.svg
[2021-10-20 11:59:06 CST] 1.3MiB man-1459246.ai
[2021-10-20 11:59:08 CST] 19KiB sign-up-accent-left.07ab168.svg
[2021-10-20 11:59:10 CST] 11MiB work-4997565.svg
常用功能
多桶支持
默认情况下,juicefs gateway 只允许一个 bucket,bucket 名字为文件系统名字,如果需要多个桶,可以在启动时添加 --multi-buckets开启多桶支持,该参数将会把 JuiceFS 文件系统顶级目录下的每个子目录都导出为一个 bucket。创建 bucket 的行为在文件系统上的反映是顶级目录下创建了一个同名的子目录。
juicefs gateway myjfs localhost:9000 --multi-buckets
保留 etag
默认 S3 网关不会保存和返回对象的 etag 信息,可以通过--keep-etag 开启:
juicefs gateway myjfs localhost:9000 --keep-etag
然后通过网关上传到 JuiceFS 的文件你就可以用 s3API 的 head-object 来获取 etag 了:
aws s3api --endpoint=http://localhost:9000 head-object --bucket myjfs --key test123/test.etag
{
"AcceptRanges": "bytes",
"LastModified": "Wed, 23 Apr 2025 00:17:16 GMT",
"ContentLength": 7,
"ETag": "\"d2fde576f44a6601b73201234b491904\"",
"ContentType": "application/octet-stream",
"Metadata": {}
}
这个 etag 是通过 MD5 算法生成的,并且通过 setXattr 设置了 key 为 s3-tag 的扩展属性到文件中,如果你使用 --enable-xattr 挂载 JuiceFS 的话也可以用 getfattr 来获取这个 etag:
getfattr -n s3-etag test.etag
# file: test.etag
s3-etag="d2fde576f44a6601b73201234b491904"
开启对象标签
默认不支持对象标签,可以通过--object-tag 开启
启用虚拟主机风格请求
默认情况下,S3 网关支持格式为 http://mydomain.com/bucket/object 的路径类型请求。MINIO_DOMAIN 环境变量被用来启用虚拟主机类型请求。如果请求的 Host 头信息匹配 (.+).mydomain.com,则匹配的模式 $1 被用作 bucket,并且路径被用作 object.
示例:
export MINIO_DOMAIN=mydomain.com
调整 IAM 刷新时间
默认 IAM 缓存的刷新时间为 5 分钟,可以通过 --refresh-iam-interval 调整,该参数的值是一个带单位的时间字符串,例如 "300ms", "-1.5h" 或者 "2h45m",有效的时间单位是 "ns"、"us" (或 "µs")、"ms"、"s"、"m"、"h"。
例如设置 1 分钟刷新:
juicefs gateway xxxx xxxx --refresh-iam-interval 1m
多 Gateway 实例
JuiceFS 的分布式特性使得可以在多个节点上同时启动多个 S3 网关实例,这样可以提高 S3 网关的可用性和性能。在这种情况下,每个 S3 网关实例都会独立地处理请求,但是它们都会访问同一个 JuiceFS 文件系统。在这种情况下,需要注意以下几点:
- 需要保证所有实例在启动时使用相同的用户,其 UID 和 GID 相同;
- 节点之间 IAM 刷新时间可以不同,但是需要保证 IAM 刷新时间不要太短,以免对 JuiceFS 造成过大的压力;
- 每个实例的监听的地址和端口可以自由设置,如果在同一台机器上启动多个实例,需要确保端口不冲突。
启用 virtual-hosted-style
S3 网关基于开源的 MinIO 代码,因此同样支持 MINIO_DOMAIN 环境变量,可以用他来开启 virtual-hosted-style 支持:
export MINIO_DOMAIN=mydomain.com
juicefs gateway myjfs 111.2.3.4:9000
如果你使用下方的 Helm chart 部署,也可以在 values 中指定 envs 来设置相同的环境变量。
以守护进程的形式运行
如有需要,可以用 systemd 将 Gateway 以守护进程的形式在后台运行。
cat > /lib/systemd/system/juicefs-gateway.service<<EOF
[Unit]
Description=JuiceFS S3 Gateway
Requires=network.target
After=multi-user.target
StartLimitIntervalSec=0
[Service]
Type=simple
User=root
Environment="MINIO_ROOT_USER=admin"
Environment="MINIO_ROOT_PASSWORD=12345678"
ExecStart=/usr/local/bin/juicefs gateway myjfs 0.0.0.0:9000
Restart=on-failure
RestartSec=60
[Install]
WantedBy=multi-user.target
EOF
设置进程开机自启动:
systemctl daemon-reload
systemctl enable juicefs-gateway --now
systemctl status juicefs-gateway
查看日志:
journalctl -xefu juicefs-gateway.service
在 Kubernetes 上部署 S3 网关
安装需要 Helm 3.1.0 及以上版本,请参照 Helm 文档进行安装。
helm repo add juicefs https://juicedata.github.io/charts/
helm repo update
Helm chart 同时支持 JuiceFS 社区版和企业版,通过填写 values 中不同的字段来区分具体使用的版本,默认的 values 使用了社区版 JuiceFS 客户端镜像,因此如需使用企业版为例,请在一份单独的 values 文件中单独覆盖以下字段:
# values 默认使用社区版 mount 镜像,需要覆盖为商业版
image:
repository: juicedata/mount
tag: "ee-5.0.21-f900c6e"
secret:
name: "myjfs"
# 如果填写了 token 字段,则作为企业版对待,社区版专属的配置会被忽略
token: "xxx"
accessKey: "xxx"
secretKey: "xxx"
别忘了把上方的 values-mycluster.yaml 纳入 Git 项目(或者其他的源码管理方式)管理起来,这样一来,就算 values 的配置不断变化,也能对其进行追溯和回滚。
填写完毕保存,就可以使用下方命令部署了:
# 不论是初次安装,还是后续调整配置重新上线,都可以使用下方命令
helm upgrade --install -f values-mycluster.yaml s3-gateway juicefs/juicefs-s3-gateway
部署完毕以后,按照输出文本的提示,获取 Kubernetes Service 的地址,并测试是否可以正常访问。
S3 网关和符号链接
对象存储中并没有符号链接这一概念——然而 JuiceFS 却支持符号链接。因此如果你的 JuiceFS 文件系统中包含符号链接,那么将其部署成 S3 网关时,需要注意下方要点。
-
所有的符号链接,不论相对还是绝对路径,都应指向 JuiceFS 文件系统内的文件(而不是目录)。如果符号链接指向宿主机本地文件系统的文件,或者指向了目录,那么在 S3 网关中将无法解析。
-
相对路径符号链接可以正常使用,不会在 S3 Gateway 下遇到额外问题。
-
如果需要在 S3 网关中访问 JuiceFS 文件系统内的绝对路径,那么需要在启动网关的时候修改
--mountpoint参数,将其指定为挂载点。假设挂载点为
/jfs,在 JuiceFS 文件系统里创建了如下符号链接:$ ls -alh /jfs
file.txt -> /jfs/dir/file.txt那么需要用如下命令启动网关,确保符号链接可以正常解析:
juicefs gateway myjfs 127.0.0.1:8888 --mountpoint=/jfs