这是一篇由Minio 软件开发人员 Nitish Tiwari 撰写的客座博客文章,Minio是一种专门用于云应用和应用程序开发和交付的DevOps方法的分布式对象存储服务器。 Nitish 的兴趣包括基于软件的基础设施,尤其是存储和分布式系统。
在这篇文章中,Nitish 解释了如何使用 NGINX 和 NGINX Plus 作为 Minio 服务器的反向代理和负载均衡器。 该帖子同样适用于 NGINX 和 NGINX Plus;为简洁起见,仅指 NGINX Plus。
几乎所有应用都需要存储,但不同的应用程序以特定的方式需要和使用存储。 以文档存储为例:当文档存储规模较小时,它可能不需要满足频繁的读取请求,但随着时间的推移需要进行扩展。 另一个应用(例如图像库)需要快速满足请求并随着时间扩展。
这些细微差别使得存储设置变得困难。 然而,一切并非一片黯淡——随着对象存储成为存储非结构化数据的默认方式, HTTP已成为默认的通信模式,标准化了应用与存储的通信方式。
但问题仍然存在: 如何构建一个适合您的应用需求但仍然灵活的对象存储设置?
由于对象存储涉及 HTTP 服务器和客户端,因此在前端拥有一个像 NGINX Plus 这样的多功能 Web 服务器来处理 HTTP 流量是有意义的。 可以使用轻量级对象存储服务器(例如 Minio)在后端提供可扩展的存储。 这种系统的灵活性是创建企业级服务的关键。
使用 NGINX Plus,管理员不仅可以对传入流量进行负载平衡,还可以缓存、限制、终止 SSL/TLS,甚至根据各种参数过滤流量。 另一方面,Minio 提供了与Amazon S3兼容的轻量级对象存储服务器。
MinIO 专为AI 存储而构建,最适合存储非结构化数据,例如照片、视频、日志文件、备份以及 VM 和容器映像。 Minio 服务器足够轻,可以与应用堆栈捆绑在一起,类似于 Node.js、Redis 和 MySQL。 Minio 还支持分布式模式,让您可以将多个驱动器(甚至在不同的机器上)集中到单个对象存储服务器中。
在本文中,我们将探讨 NGINX Plus 在各种用例中的一些功能,并学习如何将它们与 Minio 结合起来,建立生产级、高度可扩展、高可用性和稳定的对象存储系统。
NGINX Plus 作为反向代理服务器而闻名。 但是为什么 Minio 需要反向代理呢? 让我们看一些用例:
mc
)镜像
命令。NGINX Plus 通过将请求传递到后端服务器来反向代理客户端流量,该服务器正在监听proxy_pass
指令指定的 URL。 在以下配置片段中,独立的 Minio 实例在localhost
上运行,因此可通过http://localhost:9000访问。 通过端口 80 发送至www.example.com顶级目录 ( / ) 的所有请求都会传递给 Minio。 NGINX Plus 明确将Host
标头设置为原始请求中的值。
服务器 { listen 80;
server_name www.example.com;
location / {
proxy_set_header Host $http_host;
proxy_pass http://localhost:9000;
}
}
如果您有多个 Minio 服务器,请通过将它们列在上游
配置块中并在proxy_pass
指令中引用上游组来实现它们之间的流量负载平衡:
上游 minio_servers { 服务器minio-server-1 :9000; 服务器minio-server-2 :9000; }服务器 { 监听 80; 服务器名称 www.example.com; 位置 / { proxy_set_header 主机 $http_host; proxy_pass http:// minio_servers ; } }
有关将 NGINX 或 NGINX Plus 设置为 Minio 代理的更多详细信息,请参阅Minio 文档。
由于 HTTPS 现已成为大量网络流量的默认协议,因此对于 Minio 来说,部署 HTTPS 服务器(而不是简单的 HTTP 服务器)是有意义的。 将 NGINX Plus 设置为 HTTPS 服务器相当容易。 您需要一个 SSL/TLS 证书才能开始使用; Let's Encrypt提供免费的 SSL/TLS 证书并与 NGINX Plus 集成。
下一步是编辑 NGINX Plus 配置文件。 这里需要在服务器
块中为listen
指令指定ssl
参数,然后指定包含服务器证书和私钥的文件:
服务器 { 监听 80; 服务器名称 www.example.com; 返回 301 https://www.example.com$request_uri; } 服务器 {监听 443 ssl ; 服务器名称 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; 位置 / { proxy_set_header 主机 $http_host; proxy_pass http://localhost:9000; } }
有关 SSL/TLS 终止的更多信息,请参阅NGINX Plus 管理指南。
对象存储服务器并不以其速度而闻名,但这并不意味着对客户端的响应缓慢。 当您在 NGINX Plus 服务器上启用缓存时,它会保存经常访问的数据,并且可以立即将这些数据返回给客户端,而无需将请求转发到后端服务器。
它的工作原理如下。 NGINX Plus 网络缓存位于客户端和 Minio 之间,保存每个请求的内容文件的副本。 当客户端请求存储在缓存中的内容时,NGINX Plus 会直接返回该内容,而无需联系 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 ; 服务器 { # ... 位置 / { proxy_cache my_cache ; proxy_set_header 主机 $http_host; proxy_pass http://localhost:9000; } }
有时您需要出于业务或安全原因限制请求。 使用 NGINX Plus,您可以限制可用带宽、请求数或连接数。
要限制带宽,请使用limit_rate
指令。 此示例将下载速度限制为每秒 200 KB:
服务器 { #... 位置 /图像/ { 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 ; 服务器 { # ... 位置 /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 ; 服务器 { # ... 位置 /images/ { limit_conn my_conn_limit 5 ; # ... } }
有关更多详细信息,请参阅NGINX Plus 管理指南。
在这篇文章中,我们演示了如何使用 NGINX Plus 的几个功能进行负载均衡,特别是在 Minio 对象存储服务器前面进行负载均衡。 NGINX Plus 和 Minio 的组合允许您设置一个根据您的应用需求量身定制的灵活对象存储服务器。
有关使用 NGINX Plus 进行负载均衡的更多信息,请参阅以下博客文章和其他资源:
要亲自尝试 NGINX Plus,请立即开始30 天免费试用,或联系我们讨论您的用例。
“这篇博文可能引用了不再可用和/或不再支持的产品。 有关 F5 NGINX 产品和解决方案的最新信息,请探索我们的NGINX 产品系列。 NGINX 现在是 F5 的一部分。 所有之前的 NGINX.com 链接都将重定向至 F5.com 上的类似 NGINX 内容。”