当前位置: 首页 > 架构相关 > nginx负载均衡配置

nginx负载均衡配置

有朋友问我负载均衡应该如何理解,只是听说高大上,但是自己不知道如何上手。所以我在这里写下这篇文章,这里实现下简单的负载均衡配置。知道了这个过程,也就理解了它的运行方式。不至于到真的用到时着急,不知如何下手。

首先,准备两台服务器

一台服务器设置为无状态的应用程序服务器,另一台负载均衡服务器。

应用服务器根据配置端口的不同来模拟多台应用服务器。负载均衡服务器专门负责负载均衡。

应用服务器ip:172.31.153.188

负责均衡服务器ip:172.31.153.115

用户pc可以访问负载均衡服务器,负载均衡服务器将访问均衡到应用服务器,大概原理图如下:


根据这个图可以知道同一个用户可能访问的是不同的服务器,所以用户的session就不能存在服务器上了,最好是存到redis等数据库中。当然,也有存到服务器上的解决方案,但是非常不推荐。那就是用ip_hash的方式进行负载均衡,缺点就是某台服务器宕掉后这台服务器上的用户照样无法访问。而负载均衡要做到,任何一台服务器宕机,负载均衡服务器都可以避开这台服务器。技术方面,任何方法都是有的,但是不推荐的却要偏偏这样做,就有些无理取闹了。

接下来,应用服务器中配置nginx的配置文件

在应用服务器nginx配置文件中配置不同端口的server,根据端口的不同来模拟三台服务器。在三台服务器根目录下建立三个index文件,分别输出不同的内容,用来区分访问。

server 1:

listen          8087;
server_name     172.31.153.188;

server 2:

listen          8088;
server_name     172.31.153.188;

server 3:

listen          8089;
server_name     172.31.153.188;

访问这三台模拟的服务器:

可以看到不同服务器出现不同内容。

最后在负载均衡服务器中的nginx配置文件中配置负载均衡

在负载均衡服务器nginx配置文件中http内配置负载均衡:

upstream backend {#策略有weight/fair/ip_hash,默认是轮询
    server 172.31.153.188:8087 weight=1;
    server 172.31.153.188:8088 weight=2;
    server 172.31.153.188:8089 weight=3;
}
server {
    listen          80;
    server_name     proxytest.com;
    location / {
        #设置主机头和客户端真实地址
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #禁用缓存
        proxy_buffering on;
        #反向代理地址
        proxy_pass http://backend;
    }
}
include /etc/nginx/conf.d/*.conf;


这样就已经可以了,在自己的hosts中绑定负载均衡服务器ip 到proxytest.com,然后在浏览器中访问。

可以看到多次刷新会以轮询的方式出现不同结果。

  


负载均衡服务器也能判断哪台服务器不能访问。例如你将应用服务器中listen的8087去掉,而其他负载均衡配置均不变。访问时负载均衡器会自动忽略8087端口服务器。



最后从网上找了一些内容,解释下upstream的几种方式,也可以自行百度:

     Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:

1、轮询         

        轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。

 upstream backend {
            server 192.168.1.101:8888;
            server 192.168.1.102:8888;
            server 192.168.1.103:8888;
        }

2、weight        

        轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。

 upstream backend {
            server 192.168.1.101 weight=1;
            server 192.168.1.102 weight=2;
            server 192.168.1.103 weight=3;
        }

3、ip_hash        

        每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。

upstream backend {
        ip_hash;
        server 192.168.1.101:7777;
        server 192.168.1.102:8888;
        server 192.168.1.103:9999;
}

4、fair        

        fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。

upstream backend {
            server 192.168.1.101;
            server 192.168.1.102;
            server 192.168.1.103;
            fair;
        }

5、url_hash

        与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

upstream backend {
      server 192.168.1.101;
       server 192.168.1.102;
      server 192.168.1.103;
      hash $request_uri;
       hash_method crc32;
}

 其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。

 关于,如何在负载均衡中使用upstream请参看下面的说明。



从上面实例不难看出upstream中server指令语法如下:

server address [parameters]

server:必选。

address:也必选,可以是主机名、域名、ip或unix socket,也可以指定端口号。

parameters:是可选参数,可以是如下参数:

down:表示当前server已停用

backup:表示当前server是备用服务器,只有其它非backup后端服务器都挂掉了或者很忙才会分配到请求。

weight:表示当前server负载权重,权重越大被请求几率越大。默认是1.


max_failsfail_timeout一般会关联使用,如果某台server在fail_timeout时间内出现了max_fails次连接失败,那么Nginx会认为其已经挂掉了,从而在fail_timeout时间内不再去请求它,fail_timeout默认是10s,max_fails默认是1,即默认情况是只要发生错误就认为服务器挂掉了,如果将max_fails设置为0,则表示取消这项检查。

举例说明如下:

upstream backend {
       server    backend1.example.com  weight=5;
       server    127.0.0.1:8080  max_fails=3 fail_timeout=30s;
       server    unix:/tmp/backend3;           
}


转载时请以 超链接的形式 注明:转自Ferman

                  

About me