借助NGINX Plus和Minio实现企业级云存储

NGINX | 2017年1月19日

本文是一篇客座博文,作者Nitish Tiwari是Minio的软件开发人员。Minio是一款专为云应用以及采用DevOps方法进行应用开发和交付而设计的分布式对象存储服务器。Nitish关注基于软件的基础设施,尤其是存储和分布式系统。

本文中,Nitish介绍了如何将NGINX和NGINX Plus用作Minio服务器的反向代理和负载均衡器。本文同样适用于NGINX和NGINX Plus;为简洁起见,文中仅使用NGINX Plus这一名称。

对象存储设计

几乎所有应用都需要存储,但不同应用对存储的需求和使用方式各不相同。例如,文档存储在规模较小时可能不需要处理频繁的读取请求,但随着时间推移,需要具备扩展能力。图像库等其他应用则既要快速响应请求,也要能够随时间推移进行扩展。

这些细微差异增加了存储配置的难度。不过,情况并非毫无转机。随着对象存储成为非结构化数据的默认存储方式,HTTP已成为默认通信方式,使应用程序与存储之间的通信实现了标准化。

但问题依然存在:如何构建既能满足应用需求,又具备灵活性的对象存储配置?

由于对象存储涉及HTTP服务器和客户端,因此适合在前端部署NGINX Plus这类功能全面的Web服务器来处理HTTP流量。后端可以使用Minio这类轻量级对象存储服务器来提供可扩展的存储。此类系统的灵活性是构建企业级服务的关键。

NGINX Plus可有效地为基于云的Minio对象存储服务器分布式实例提供负载均衡
NGINX Plus终止SSL/TLS客户端连接,并对Minio云存储服务器进行负载均衡

借助NGINX Plus,管理员不仅可以对传入流量进行负载均衡,还可以缓存流量、限制流量速率、终止SSL/TLS连接,甚至可以根据各种参数过滤流量。另一方面,Minio提供了与Amazon S3兼容的轻量级对象存储服务器。

MinIO专为AI存储而构建,适合存储照片、视频、日志文件、备份以及虚拟机和容器镜像等非结构化数据。Minio服务器非常轻量,可像Node.js、Redis和MySQL一样与应用程序栈捆绑部署。Minio还支持分布式模式,可将多个驱动器(即使位于不同计算机上)汇集到一台对象存储服务器中。

本文将探讨NGINX Plus在各种用例中的部分功能,并介绍如何将这些功能与Minio结合使用,以搭建一个生产级、可高度扩展、高可用且稳定的对象存储系统。

NGINX Plus 作为反向代理和负载均衡器

NGINX Plus是一款广为人知的反向代理服务器。但为什么Minio需要反向代理?下面来看一些使用场景:

  • 在一台或多台Minio服务器前部署NGINX Plus反向代理后,可以根据需要将Minio服务器实例迁移到其他计算机或位置,而无需更新客户端或应用。
  • NGINX Plus可以对传入流量进行负载均衡,并将其均匀分配到分布式Minio服务器实例。
  • NGINX Plus代理可以作为Minio高可用对象存储配置的一部分,并使用Minio Client(mc)的mirror命令。

NGINX Plus通过将请求传递到后端服务器,对客户端流量进行反向代理。该服务器侦听由proxy_pass指令指定的URL。在以下配置片段中,一个独立的Minio实例运行在localhost上,因此可通过http://localhost:9000访问。所有发送到www.example.com的顶级目录(/)且使用端口80的请求都会传递到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 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;

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 Plus进行负载均衡,请参阅以下博客文章和其他资源:

如需亲自体验NGINX Plus,立即开始30天免费试用,或联系我们,讨论您的用例。


分享

相关博客文章

NGINX Plus R26 正式发布
NGINX | 2022/02/15

NGINX Plus R26 正式发布

NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
NGINX | 2022/02/10

使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击

gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
NGINX | 2021/09/13

Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划

了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。

NGINX Plus R19 正式发布
NGINX | 2019/09/03

NGINX Plus R19 正式发布

NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。

NGINX现已正式加入F5
NGINX | 2019/05/09

NGINX现已正式加入F5

NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

使用NGINX和NGINX Plus实现高性能缓存
NGINX | 2016/08/24

使用NGINX和NGINX Plus实现高性能缓存

我将介绍NGINX在内容缓存和性能方面的工作原理,并分享一些控制NGINX内容缓存方式的技巧。