具有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服务器实例中。
通过Minio Client(
mc)mirror命令,NGINX Plus代理可以成为Minio高可用性对象存储设置的一部分。
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现已成为用于许多网络流量的默认协议,为Minio部署HTTPS服务器而不是简单的HTTP服务器变得有意义。将NGINX Plus设置为HTTPS服务器相当容易。您需要SSL / TLS证书才能上手,Let's Encrypt提供免费的SSL / TLS证书并与NGINX Plus集成。
下一步是编辑NGINX Plus配置文件。在这里,您需要在块中ssl为listen伪指令指定参数server,然后指定包含服务器证书和私钥的文件:
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私有云设计。