Categories: Linux

Nginx负载平衡

实验环境3Centos

名称 IP 系统 备注
Srv_1 192.168.140.129 Centos 6.8 负载均衡服务器
Srv_2 192.168.140.130 Centos 6.8 后端应用服务器
Srv_3 192.168.140.131 Centos 6.8 后端应用服务器
Srv_4 192.168.140.132 Centos 6.8 后端应用服务器

负载平衡的作用:

N台服务器平均分担负载,就算服务器出现磐机,会自动切换到另外一台正常的服务器上面,从而提高可用性。并且它会根据轮询,ip_hashfair(第三方)url_hash(第三方)策略来避免出现某一台服务器出现闲置和某一台服务器上负载过高的情况。

Nginx常用负载均衡算法:

  • 轮询(默认算法)——每个请求会依次分配给后端不同的应用程序服务器,不理会后端服务器的实际压力
  • 加权轮询——权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况
  • IP HASH——当同IP进行重复访问时会被指定到上次访问到的服务器,可以解决动态网站SESSION共享问题
  • 最少链接:将请求发送给持有最少活动链接的服务器。

实验思路:

Srv_1 (192.168.140.129)服务器做为负载均衡主服务器,由Srv_1根据负载均衡策略分配地址到Srv_1(192.168.140.130)或者Srv_2(192.168.140.131)上面。

实验步骤:

1,先下载安装nginx,或者yum安装,安装好的略过。

先安装依赖包

[root@localhost ~]# yum install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-devel

[root@localhost ]# mkdir nginx ####根目录下新建nginx目录

[root@localhost ]# cd nginx ####进入nginx

[root@localhost nginx]# wget http://nginx.org/download/nginx-1.12.0.tar.gz ####下载nginx

[root@localhost nginx]# cp nginx-1.12.0.tar.gz /nginx ####复制到对应目录

[root@localhost nginx]# tar -zxvf nginx-1.12.0..tar.gz ####解压缩

[root@localhost nginx]# cd nginx-1.12.0

[root@localhost nginx-1.12.0]# ./configure –prefix=/nginx/ ####指定nginx的安装路径

[root@localhost nginx-1.12.0]# make ####编译

一、一般轮询负载均衡

在以下实例片段中,backend 服务器组中所有服务器的优先级全部配置为默认的 weight= l ,这样 它们会按照一般轮询策略依次接收请求任务。该配置是一千最简单的实现 Nginx 服务器负载均衡的配 置。所有访问www.xxx.com 的请求都会在 backend 服务器组中实现负载均衡。实例代码如下 :

在nginx.conf配置文件的http中添加如下配置

upstream backend { #配置后端服务器组

server 192.168.140.130:80;

server 192.168.140.131:80;

server 192.168.140.132:80;

} #默认weight=1

在nginx.conf配置文件server中修改如下配置,此配置有三台服务器提供服务。

  server {

listen 80;

server_name www.xxx.com; #你的域名名字

location / {

root html;

index index.html index.htm;

proxy_pass http://backend;

#设置主机头和客户端真实地址,以便服务器获取客户端真实IP

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

建议把192.168.140.130 192.168.140.131 192.168.140.132这三台服务器的nginx的配置index.html改成不一样的,这样你在访问Srv_1 (192.168.140.129)的时候刷新就可以看到有没有成功。

需要注意以下几点
1.缺省配置就是轮询策略;
2.nginx负载均衡支持http和https协议,只需要修改 proxy_pass后协议即可;
3.nginx支持FastCGI, uwsgi, SCGI,memcached的负载均衡,只需将 proxy_pass改为fastcgi_pass, uwsgi_pass, scgi_pass,memcached_pass即可。
4.此策略适合服务器配置相当,无状态且短平快的服务使用。

二、加权轮询负载均衡

与 “一般轮询” 相比 ,在该实例片段中,backend服务器组中的服务器被赋予了不同的优先级 别,weight 变量的值就是轮询策略中的 “权值”。其中,192.168.140.130:80 的级别最高,优先接收和处理客户端请求 ;192.168.140.132:80 的级别最低,是接收和处理客户端请求最少的服务器 ,192.168.140.131:80 将介于以上两者之间。所有访问www.xxx.com的请求都会在 backend 服务器组中实现加权负载均衡。 实例代码如下 :

upstream backend {

server 192.168.140.130:80 weight=5;

server 192.168.140.131:80 weight=2;

server 192.168.140.132:80;

}

server {

listen 80;

server_name www.xxx.com;

location / {

root html;

index index.html index.htm;

proxy_pass http://backend;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

三、对特定资源实现负载均衡

在该实例片段中 ,我们设置了两组被代理的服务器组 ,名为 “videobackend ” 的一组用于对请求 video 资源的客户端请求进行负载均衡,另一组用于对请求video资源的客户端请求进行负载均衡。通过 对 location 块 uri 的不同配置,我们就很轻易地实现了对特定资源的负载均衡。所有对”http://xxx.com/video/*” 的请求都会在 videobackend 服务器组中获得均衡效果 ,所有对”http://xxx.com/video/*” 的请求都会在 filebackend的服务器组中获得均衡效果。在该实例中展示的是实现一般负载均衡的配置 ,对于加权负载均衡的配置可以参考 “配置实例二”。

在 location /file/ {······} 块中 ,我们将客户端的真 实信息分别填充到了请求头中的 “Host” 、 “X-Real-IP” 和 “X-Forwarded-For” 头域,这样后端服务器组收到的请求中就保留了客户端的真实信 息,而不是 Nginx 服务器的信息。实例代码如下

upstream videobackend {

server 192.168.140.130:80;

server 192.168.140.131:80;

}

upstream filebackend {

server 192.168.140.132:80;

}

server {

listen 80;

server_name www.xxx.com;

#charset koi8-r;

#access_log logs/host.access.log main;

location /video/ {

root html;

index index.html index.htm;

proxy_pass http://videobackend;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

location /file/ {

root html;

index index.html index.htm;

proxy_pass http://filebackend;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

#error_page 404 /404.html;

# redirect server error pages to the static page /50x.html

#

error_page 500 502 503 504 /50x.html;

location = /50x.html {

root html;

}

四、对不同域名实现负载均衡

在该实例片段中,我们设置了两个虚拟服务器和两组后端被代理的服务器组,分别用来接收不同的域名请求和对这些请求进行负载均衡处理。如果客户端请求域名为 “home.xxx.com” ,则由服务器server1接收并转向 homebackend 服务器组进行负载均衡处理;如果客户端请求域名为 “bbs.xxx. com” ,则由服务器server2接收并转向bbsbackend服务器组进行负载均衡处理。这样就实现了对不 同域名的负载均衡。

需要注意两组后端服务器组中有一台服务器 server 192.168.140.130:80 是公用的。在该服务器上需要部署两个域名下的所有资源才能保证客户端请求不会出现问题。实例代码如下

upstream bbsbackend

{

server 192.168.140.130:80;

server 192.168.140.131:80;

}

upstream homebackend

{

server 192.168.140.132:80;

server 192.168.140.130:80;

}

server #server1的配置

{

listen 80;

server_name home.xxx.com;

location / {

root html;

index index.html index.htm;

proxy_pass http://homebackend;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

}

server #server2的配置

{

listen 81;

server_name bbs.xxx.com;

location / {

root html;

index index.html index.htm;

proxy_pass http://bbsbackend;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

五、带有URL重写的负载均衡

upstream backend { #配置后端服务器组

server 192.168.140.130:80;

server 192.168.140.131:80;

server 192.168.140.132:80;

} #默认weight=1

  server {

listen 80;

server_name www.xxx.com; #你的域名名字

location /file/ {

rewrite ^(/file/.*)/media/(.*)\.*$ $1/mp3/$2.mp3 last;

}

root html;

index index.html index.htm;

proxy_pass http://backend;

#设置主机头和客户端真实地址,以便服务器获取客户端真实IP

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header Host $host;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

}

该实例片段与”配置实例一” 相比,增加了对URL包含 “/file/”的URL重写功能。例如客户端的请求URL为”http://www.xxx.com/file/download/media/1.mp3″时,该虚拟服务器首先使用 location file/{…..}块将该 URL 进行重写为http://www.xxx.com/file/download/mp3/1.mp3 ,然后新的 URL 再由 location file/{…..}块转发到后端的backend 服务器组中实现负载均衡。这样就轻而易举地实现了带有 URL 重写功能的负载均衡。在该配置方案中 ,一定要掌握清楚 rewrite 指令中 last 标记和 break 标记的区别,才能达到预计的效果。

以上 5 个配置实例展示了 Nginx 服务器实现不同情况下负载均衡配置的基本方法。由于Nginx 服 务器的功能在结构上是增量式的,因此,我们可以在这些配置的基础上继续添加更多功能,比如 Web 缓存等功能, Gzip 压缩技术 、身份认证 、权限管理等。 同时在使用 upsteam 指令配置服务器组时,可以充分发挥各个指令的功能,配置出满足需求 、高效稳定、功能丰富的Nginx服务器。

Kai

Share
Published by
Kai
Tags: Nginx