首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java进阶——带你入门分布式中的Nginx

如何实现服务器之间的协同功能呢?

通过Nginx提供的反向代理和负载均衡功能,可以合理的完成业务的分配,提高网站的处理能力;同时利用缓存功能,还可以将不需要实时更新的动态页面输出结果,转化为静态网页形成缓存,从而提高网站的响应速度。

代理和反向代理

代理(正向代理,目标服务器不知道谁在访问)

位于客户端和目标服务器之间,起到一个中转的作用。其实就是客户端想访问目标服务器,但是因为某些原因不能够直接访问,则把请求和目标服务器发给代理服务器,代理服务器再去请求目标服务器,把返回的响应结果返回给客户端。

反向代理(用户实际并不知道最终服务器,只是访问一个反向代理服务器而已)

客户端会把反向代理服务器当成目标服务器,向反向代理服务器发送请求后,反向代理服务器再请求内部的后端服务器,把得到的响应结果返回给客户端。

特性:

安全性。反向代理具有安全性。能隐藏真实的内部服务器。

功能性。正向代理主要用途是为防火墙内的局域网用户提供访问外网的途径。反向代理主要用途是将防火墙内的服务器提供给外边的用户访问,同时也可以为多个后端服务器提供负载均衡功能、缓存功能等。

反向代理服务配置

在 Nginx 配置文件中的 location 块中,这是 ` 指令。

负载均衡

负载均衡(load balance):就是将负载分摊到多个操作单元上执行,从而提高服务的可用性和响应速度。

一个没有负载均衡的 web 架构如下图:

用户直接连接服务器,这个时候如果这台服务器挂了,那么就整个网站挂了。

有负载均衡的 web 架构

用户不直接访问后端服务器,而是访问负载均衡服务器,由负载均衡服务器再次转发到后端服务器。如果这个时候有一台后端服务器挂掉了,那么负载均衡服务器会剔除掉它,将后续请求都转发到好的那台,这样就不影响网站的正常运行。这个时候我们也需要考虑负载均衡服务器会不会挂掉,那就引入第二个负载均衡服务器来缓解一下。

负载均衡的配置

通过配置负载均衡服务器的 Nginx 中的 指令可以实现。

不同负载均衡配置的特点如下图所示:

一般轮询配置

加权轮询配置

这里面的权值总和为一个循环,这里以 4 次为一个循环,那么就是每四次请求中,三次会被分派到 129 这个服务器,一次分配到 128,但是具体三次并不会顺序执行,而是按照算法分散执行。

我们也可以设置每台 web 服务器在负载均衡调度中的状态。

ip_hash 配置

使用 ip_hash 的时候,不能使用 weight 和 backup。

第三方模块(fair)

备份已安装的 Nginx

由于使用第三方模块,需要重新编译 Nginx,所以需要关闭已经开启的 Nginx 进程,对已经安装好的 Nginx 进行备份,便于恢复。

重新编译安装 Nginx

先从 github 获取 fair 模块,下载到 zip 到 root 目录下,解压。

如果没有 命令,则需要用 安装。

配置 fair 的负载均衡

打开新安装的Nginx配置文件,在 块下实现fair的负载均衡。

缓存配置

对于一些含有大量内容的网站来说,随着访问量的增多,对于经常被访问的内容,如果每一次都从服务器中获取,则给服务器很大的压力。所以我们可以利用反向代理服务器对访问频率较多的内容进行缓存,有利于节省后端服务器的资源。

原理

web 缓存服务器位于内容源 web 服务器和客户端之间,当客户端访问一个 url 时,缓存服务器请求内容源服务器,并将响应结果缓存到内存或硬盘,当下一次请求同一个 url 时,缓存服务器直接将已缓存的内容输出给客户端,这样就减少了再次向内容源服务器请求的次数。

永久缓存配置(proxy_store)

Nginx 提供了 指令用于缓存内容服务器响应到本地,若不手动删除,则一直存在。

临时缓存(proxy_cache)

Nginx 服务器提供了 指令设置临时缓存。采用 md5 算法将请求链接进行 hash 后,根据具体配置生成缓存文件目录,保存响应数据。

在缓存服务器上配置 中的块。

配置 块:

缓存清理配置

因为 Nginx 不支持清理制定 url 的缓存,需要借助第三方模块来实现。例如 ngx_cache_purge

备份已安装的 Nginx

在添加 ngx_cache_purge 模块之前,关闭 Nginx 服务,备份已有的 Nginx 服务。

重新编译安装 Nginx

在 github 获取 ngx_cache_purge zip 包,并解压安装。

配置缓存清理功能

使用 指令实现缓存清理。

注意:

指定的缓存区名称和 proxy_cache_purge 指令中出现的缓存区名称一致。

key 值设置规则要一致。

清理缓存的 location 的编写位置在所有 location 之前,防止其他正则 location 提前匹配。

如果有什么错误的地方,希望大家能指出,一起学习进步。

动动小手点点关注吧!

Java架构师学习公众号!

一个专注分享架构干货的微信公众号

觉得本文有用就把文章分享给更多的人看到吧!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190415A01VMW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券