企业级云存储:NGINX Plus 和 MinIO
对象存储设计
几乎所有应用程序都需要存储,但不同的应用程序对存储的需求和使用方式有所不同。例如,文档存储:当数据量较小时,可能不需要频繁的读取请求,但随着时间的推移,需要进行扩展。另一个应用程序,如图片库,需要快速响应请求并随着时间的推移进行扩展。
这些细微差别使得存储设置变得很困难。但是,并非一切都是灰暗的——随着对象存储成为存储非结构化数据的默认方式,HTTP 已经成为默认的通信模式,标准化了应用程序与存储之间的通信方式。
然而,问题仍然存在:如何构建一个针对应用程序需求定制,但仍然灵活的对象存储设置?
由于对象存储涉及 HTTP 服务器和客户端,因此在前面使用像 NGINX Plus 这样的多功能 Web 服务器来处理 HTTP 流量是有意义的。可以使用像 Minio 这样的轻量级对象存储服务器来提供后端的可扩展存储。这种系统的灵活性是创建企业级服务的关键。

使用 NGINX Plus,管理员不仅可以负载均衡传入流量,还可以缓存、限流、终止 SSL/TLS,甚至根据各种参数过滤流量。另一方面,Minio 提供了一个轻量级的对象存储服务器,与 Amazon S3 兼容。
Minio 最适合存储非结构化数据,例如照片、视频、日志文件、备份以及 VM 和容器镜像。Minio 服务器足够轻量级,可以与应用程序堆栈捆绑在一起,类似于 Node.js、Redis 和 MySQL。Minio 还支持 分布式模式,允许您将多个驱动器(即使是在不同的机器上)合并到单个对象存储服务器中。
在这篇文章中,我们将探讨 NGINX Plus 在各种用例中的某些功能,并学习如何将它们与 Minio 结合起来,建立一个生产级的、高度可扩展的、高可用性和稳定的对象存储系统。
NGINX Plus 作为反向代理和负载均衡器
NGINX Plus 以反向代理服务器而闻名。但是为什么需要为 Minio 使用反向代理呢?让我们来看看一些用例。
- 在多个 Minio 服务器之前使用 NGINX Plus 反向代理,您可以随时将 Minio 服务器实例移动到不同的机器/位置,而无需更新客户端或应用程序。
- NGINX Plus 可以负载均衡传入流量,并将其均匀地分布到 分布式 Minio 服务器 实例上。
- NGINX Plus 代理可以是使用 Minio 客户端 (
mc
) 的mirror
命令的高可用性对象存储设置的一部分。
NGINX Plus 通过将请求传递到后端服务器来反向代理客户端流量,后端服务器侦听 proxy_pass
指令指定的 URL。在以下配置片段中,一个独立的 Minio 实例运行在 localhost
上,因此它在 http://localhost:9000 上可用。所有在端口 80 上到达 www.example.com 的顶级目录 (/) 的请求都将被传递到 Minio。NGINX Plus 明确地将 Host
标头设置为其在原始请求中的值。
server {
listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}
如果您有多个 Minio 服务器,可以通过将它们列在一个 upstream
配置块中,并在 proxy_pass
指令中引用上游组来负载均衡它们之间的流量。
upstream minio_servers {
server minio-server-1:9000;
server minio-server-2:9000;
}
server {
listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://minio_servers;
}
}
有关将 NGINX 或 NGINX Plus 设置为 Minio 代理的更多详细信息,请参阅 Minio 文档。
SSL/TLS 终止
随着 HTTPS 成为大多数 Web 流量的默认协议,为 Minio 部署一个 HTTPS 服务器,而不是仅仅一个 HTTP 服务器,是有意义的。将 NGINX Plus 设置为 HTTPS 服务器相当容易。您需要一个 SSL/TLS 证书才能开始,Let’s Encrypt 提供免费的 SSL/TLS 证书,并与 NGINX Plus 集成。
下一步是编辑 NGINX Plus 配置文件。在这里,您需要在 server
块中的 listen
指令中指定 ssl
参数,然后指定包含 服务器证书和私钥 的文件。
server {
listen 80;
server_name www.example.com;
return 301 https://www.example.com$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}
有关 SSL/TLS 终止的更多信息,请参阅 NGINX Plus 管理指南。
缓存
对象存储服务器并不以其速度而闻名,但这并不一定意味着对客户端的响应速度慢。当您在 NGINX Plus 服务器上启用缓存时,它会保存经常访问的数据,这些数据可以立即返回给客户端,而无需将请求转发到后端服务器。
它是这样工作的。NGINX Plus Web 缓存位于客户端和 Minio 之间,保存每个请求的内容文件的副本。当客户端请求存储在缓存中的内容时,NGINX 会直接将其返回,而无需联系 Minio。这既可以提高对客户端的响应时间,又可以减少 Minio 服务器的负载。
您可以使用 proxy_cache_path
和 proxy_cache
指令为 Minio 设置 NGINX Plus 缓存。proxy_cache_path
指令设置缓存的位置和配置,proxy_cache
指令激活缓存。有关详细信息,请参阅 NGINX 和 NGINX Plus 缓存指南。
proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m
use_temp_path=off;
server {
...
location / {
proxy_cache my_cache;
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}
限流
有时您需要出于业务或安全原因限制请求。使用 NGINX Plus,您可以限制可用带宽、请求数量或连接数量。
要限制带宽,请使用 limit_rate
指令。此示例将下载速度限制为每秒 200 KB。
server {
...
location /images/ {
limit_rate 200k;
...
}
}
对于请求限流,请使用 limit_req
和 limit_req_zone
指令,例如,此示例将每个唯一 IP 地址的请求限制为每秒 10 个,同时允许 20 个请求的突发。
limit_req_zone $binary_remote_addr zone=my_req_limit:10m rate=10r/s;
server {
...
location /images/ {
limit_req zone=my_req_limit burst=20;
...
}
}
要限制连接数量,请使用 limit_conn
和 limit_conn_zone
指令。此示例将每个唯一 IP 地址的并发连接限制为 5 个。
limit_conn_zone $binary_remote_addr zone=my_conn_limit:10m;
server {
...
location /images/ {
limit_conn my_conn_limit 5;
...
}
}
有关更多详细信息,请参阅 NGINX Plus 管理指南。
总结
在这篇文章中,我们演示了 NGINX Plus 的几个功能在负载均衡方面的应用——特别是针对在 Minio 对象存储服务器之前进行负载均衡。NGINX Plus 和 Minio 的组合允许您建立一个灵活的对象存储服务器,该服务器针对您的应用程序需求量身定制。
这篇文章最初发布在 Nginx 博客 上。
我们在 Slack 上聊天,在这里与我们见面:slack.minio.io
顺便说一下,请帮助我们了解您的用例以及我们如何更好地帮助您!填写 我们的 Minio 部署最佳表单(不到一分钟),并有机会在 Minio 网站上展示,并向 Minio 社区展示您的 Minio 私有云设计。