Nginx多台服务器实现负载均衡
Nginx负载均衡服务器: IP:19216804(Nginx-Server)
Web服务器列表:
Web1: 19216805(Nginx-Node1/Nginx-Web1)
Web2:19216807(Nginx-Node2/Nginx-Web2)
实现目的:用户访问Nginx-Server时,通过Nginx负载均衡到Web1和Web2服务器。
配置注释如下:
创建文件夹准备存放配置文件
启动负载均衡服务器19216804(Nginx-Server)
创建文件夹用于存放web页面
编辑内容如下:
启动19216805(Nginx-Node1/Nginx-Web1)
创建文件夹用于存放web页面
编辑内容如下:
启动19216807(Nginx-Node2/Nginx-Web2)
这一小节中,我们将实战 Nginx 的四层和七层负载均衡功能。条件有限,使用一台公网主机,在上面搭建好 Nginx 服务。公网 IP 为 18076152113。
首先会进行简单的四层负载均衡实验,不会涉及多种负载均衡算法,只使用默认的 Round-Robin算法。在后续的七层负载均衡实验中,会重点测试不同的负载均衡策略,完成相关实验。
首先在 nginxconf 中添加如下 stream 指令块配置:
上述配置用端口3000和3001模拟两个上游服务器,然后在 upstream 指令块中指定这两个上游服务器的地址,同时给第一个设置权重为2。由于默认采用的是加权的 Round-Robin 算法,默认服务器的权重为1。设置为2,表明3次请求中,2次会转发到3000端口,一次会转发到3001端口,下面的测试也验证了这一点。
和四层的配置其实差不多,在七层中除了测试最基本的,我们还将测试前面提到的几种负载均衡策略,进一步熟悉 Nginx 中的负载均衡配置。
在 nginxconf 中添加如下的 http 指令块:
上述配置中,我们用8000,8001和8002三个端口模拟了3个上游服务器,默认使用轮询负载均衡算法,而且三个的权重均为1。进行如下的 http 请求操作,可以看到 Nginx 转发 http 请求会均匀地分配到3个服务器上。
我们打开 ip_hash 指令的注释,这个时候默认是使用客户端的 ip 地址作为 hash 的 key,然后重启 Nginx 服务并进行如下的命令行操作:
接下来,注释 ip_hash 指令,我们打开 hash user_$arg_username 这行配置的注释, hash 指令可以让我们根据我们设置的 key 进行 hash,然后根据 hash 值选择上游的服务器。具体测试参看下面的 Linux 命令:
这里我们可以看到,在请求中带上 username 参数,Nginx 中配置的 hash 算法会根据请求中带的 username 参数作为 key 去进行 hash,然后在根据 hash 结果映射上游服务器。username 相同时,选择的上游服务器肯定是一样的,只有在 username 的值发生变化时,返回的响应才可能有变化。
今天我们完成了几个测试实验,主要是针对 Nginx 的四层和七层的负载均衡功能进行了测试。这个功能在微服务部署中会有较多的应用。因为高流量企业为保证服务的高可用性,往往会水平扩展多个相同功能的服务,部署在多台主机上,这个时候负载均衡技术就能派上用场了,而 Nginx 提供了完善的负载均衡功能以及多种负载均衡算法,能满足大部分企业的需求,如果还不够,可以通过编写内部开发模块并集成到 Nginx,实现相应的需求。所以说 Nginx 是非常值得学习和深入研究的。
设置虚拟服务器
listen:
nginx
配置文件至少包含一个
server
命令
,用来定义虚拟服务器。当请求到来时,
nginx
会首先选择一个虚拟服务器来处理该请求。
虚拟服务器定义在
http
上下文中的
server
中:
http
{
server
{
#
server
configuration
}
}
注意:
http
中可以定义多个
server
server
配置块使用
listen
命令监听本机
ip
和端口号(包括
unix
domain
socket
and
path),支持
ipv4、ipv6,ipv6地址需要用方括号括起来:
server
{
listen
127001:8080;
#
ipv4地址,8080端口
#
listen
[2001:3ca1:10f:1a:121b:0:0:10]:80;
#
ipv6地址,80端口
#
listen
[::]:80;
#
听本机的所有ipv4与ipv6地址,80端口
#
the
rest
of
server
configuration
}
上述配置,如果不写端口号,默认使用80端口,如果不写
ip
,则监听本机所有
ip。
本文介绍NGINX缓存机制,配置和参数说明。
如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。因为静态文件(比如css,js, )中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。毕竟,IO密集型服务的处理是nginx的强项。
Nginx的缓存加速功能是由proxy_cache(用于反向代理和静态缓存)和fastcgi_cache(PHP动态缓存)两个功能模块完成。
Nginx缓存特点:
先上个例子:
因为我是在一台服务器上做试验,所以用了两个端口 80 和 90 进行模拟两台服务器之间的交互。
接下来讲一下配置项:
这里我设置了 、 css 、 js 静态资源进行缓存。
当用户输入 http://wangxiaokaivip 域名时,解析得到 ip:port 的访问地址。 port 默认为80。所以页面请求会被当前server截取到,进行请求处理。
当解析到上述文件名结尾的静态资源,会到缓存区获取静态资源。
如果获取到对应资源,则直接返回数据。
如果获取不到,则将请求转发给 proxy_pass 指向的地址进行处理。
这里直接处理 90 端口接受到的请求,到服务器本地目录 /mnt/blog 下抓取资源进行响应。
细心的读者应该发现,我在第二段例子里,留了个彩蛋 add_header wall "hey!guys!give me a star" 。
add_header 是用于在报头设置自定义的信息。
所以,如果缓存有效的话,那么静态资源返回的报头,一定会带上这个信息。
(1)Nginx系列教程(3)nginx缓存服务器上的静态文件
https://yqaliyuncom/articles/752967
(2)proxy_cache
nginx 反向代理之 proxy_cache https://wwwcnblogscom/yyxianren/p/10832172html
(3)Nginx使用upstream负载均衡和proxy_cache缓存实现反向代理
https://blog51ctocom/13770206/2163952
将 NGINX 配置为 HTTP 和其他协议的反向代理,支持修改请求标头和微调的响应缓冲。
本文介绍代理服务器的基本配置。您将学习如何通过不同的协议将请求从 NGINX 传递到代理服务器,修改发送到代理服务器的客户端请求标头,以及配置来自代理服务器的响应的缓冲。
代理通常用于在多个服务器之间分配负载,无缝显示来自不同网站的内容,或通过 HTTP 以外的协议将处理请求传递给应用程序服务器。
当 NGINX 代理请求时,它会将请求发送到指定的代理服务器,获取响应,然后将请求发送回客户端。可以使用指定的协议将请求代理到 HTTP 服务器(另一个 NGINX 服务器或任何其他服务器)或非 HTTP 服务器(可以运行使用特定框架开发的应用程序,例如 PHP 或 Python)。支持的协议包括FastCGI、uwsgi、SCGI和memcached。
要将请求传递给 HTTP 代理服务器,需要在location中指定proxy_pass指令。例如:
此示例配置导致将在此位置处理的所有请求传递到指定地址的代理服务器。此地址可以指定为域名或者 IP 地址。该地址还可能包括一个端口:
注意,在上面的第一个例子中,代理的服务器的地址后面是一个URI, /link/ 。如果 URI 与地址一起指定,它将替换请求 URI 中与 location 参数匹配的部分。例如,这里带有 /some/path/pagehtml URI的请求将被代理到 http://wwwexamplecom/link/pagehtml 如果指定的地址没有问题 URI,或者无法确定要替换的 URI 部分,则传递完整的请求 URI(可能已修改)。
要将请求传递给非 HTTP 代理服务器, _pass 应使用适当的指令:
请注意,在这些情况下,指定地址的规则可能不同。您可能还需要将其他参数传递给服务器(有关详细信息,请参阅参考文档)。
proxy_pass指令也可以指向一组命名的服务器。在这种情况下,请求根据指定的方法在组中的服务器之间分发。
默认情况下,NGINX 重新定义代理请求中的两个 header 字段,“Host”和“Connection”,并消除值为空字符串的 header 字段。“Host”设置为 $proxy_host 变量,“Connection”设置为 close 。
要更改这些设置以及修改其他标头字段,请使用proxy_set_header指令。该指令可以在某个位置或更高位置指定。它也可以在特定的服务器上下文或http块中指定。例如:
在此配置中,“主机”字段设置为$host变量。
要防止标头字段被传递到代理服务器,请将其设置为空字符串,如下所示:
默认情况下,NGINX 缓冲来自代理服务器的响应。响应存储在内部缓冲区中,并且在收到整个响应之前不会发送到客户端。缓冲有助于优化慢速客户端的性能,如果响应从 NGINX 同步传递到客户端,这可能会浪费代理服务器的时间。但是,当启用缓冲时,NGINX 允许代理服务器快速处理响应,而 NGINX 存储响应的时间与客户端下载它们所需的时间一样长。
负责启用和禁用缓冲的指令是proxy_buffering。默认情况下,它设置为 on 并启用缓冲器。
该proxy_buffers指令控制规模和分配的请求缓冲区的数目。来自代理服务器的响应的第一部分存储在单独的缓冲区中,其大小由proxy_buffer_size指令设置。这部分通常包含一个相对较小的响应头,并且可以做得比其余响应的缓冲区小。
在以下示例中,缓冲区的默认数量增加了,并且响应的第一部分的缓冲区大小小于默认值。
如果禁用缓冲,则在从代理服务器接收响应的同时将响应同步发送到客户端。对于需要尽快开始接收响应的快速交互客户端,此行为可能是可取的。
要在特定位置禁用缓冲,请将proxy_buffering指令放在带有参数的位置 off ,如下所示:
在这种情况下,NGINX 仅使用proxy_buffer_size配置的缓冲区来存储响应的当前部分。
反向代理的一个常见用途是提供负载平衡。阅读免费的选择软件负载均衡器的五个理由电子书,了解如何通过快速部署来提高功能、性能和专注于您的应用程序。
如果您的代理服务器有多个网络接口,有时您可能需要选择特定的源 IP 地址连接到代理服务器或上游。如果 NGINX 后面的代理服务器配置为接受来自特定 IP 网络或 IP 地址范围的连接,这可能很有用。
指定proxy_bind指令和必要网络接口的 IP 地址:
IP 地址也可以用变量指定。例如, $server_addr 变量传递接受请求的网络接口的 IP 地址:
简单来说,把百度首页代理到/test路径,同时把java代理到/testapi,配置如下:
参考链接:https://docsnginxcom/nginx/admin-guide/web-server/reverse-proxy/
欢迎大家提出不一样的观点,我们一起讨论,
我是辣个男人,一个运维人。
0条评论