nginx负载均衡方法简说

nginx做负载均衡服务器的时候,有多种策略,原生的策略有三种,轮询、权重和IP哈希,还有三种之外的组合策略,如url哈希等。

若后台各服务器资源配置均衡,则使用默认轮询的方式简单有效;如果后台服务器资源有差异,则权重方式可以比较均衡的分配请求;如果用户的请求与session相关,则IP 哈希可以省去一些后台处理session的事情。

nginx分配方式说明

轮询

轮询是nginx的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端应用服务器,如果某个后端应用服务器down掉后,nginx服务器会将该台应用服务器从服务列表中剔除掉。

        upstream tomcats{
            server 192.168.0.109:8080;
            server 192.168.0.110:8080;
            server 192.168.0.111:8080;
        }

这里后台设置三台服务,配置中用了三台服务器,请求到达nginx后,nginx会将服务依次的分发到109、110和111三台后台服务,如果其中哪台服务down机了,则在剩余的两台机子中间轮询。

在后台服务器资源均衡的情况下,轮询是一种比较简单且可以做到均衡的分配方式。

权重

权重方式是在轮询基础上改进的,即可以设置请求轮询到后台各应用服务器的几率。权重weight值和访问几率成正比,主要应用于后端服务器资源配置有差异的情况下。

        upstream tomcats{
            server 192.168.0.109:8080 weight=5;
            server 192.168.0.110:8080;
            server 192.168.0.111:8080;
        }

上面的配置,109服务器增加权重weight值为5,110和111服务器未设置权重值。如果有7个请求,会有5个给到109服务器,1个给到110服务器,1个给到111服务器。

权重是轮询的改进版,在不设置权重的时候,默认的各服务器权重相同,默认可以认为是1。在设置权重的时候,对于不设置权重的服务器,默认值为1。

IP哈希

轮询和权重都在均衡落到后台服务器上面的请求的数量,无法保证同一个客户的请求总落到同一台服务器上面。如果用户的请求涉及到用户会话,但是后台服务未做会话共享的时候,IP哈希可以解决该场景问题。IP哈希的策略,即按照请求的请求IP做哈希算法,结果会到后台服务器。由于同一个用户的多次请求都会使用同一个IP,每次请求时根据IP哈希算法,请求都会落到同一台服务器上面,但是有风险,如果服务中某台服务器down机的话,存储在该台服务器上面的用户会话信息都会丢失。

        upstream tomcats{
            ip_hash;
            server 192.168.0.109:8080;
            server 192.168.0.110:8080;
            server 192.168.0.111:8080;
        }

IP哈希配置在轮询的基础上,增加一行ip_hash配置即可。

工程测试

我们的测试在一台Linux虚拟机上面完成

nginx端口号2021,两个Java应用端口分别为8080和8081做后台应用集群

修改Linux配置文件

http {
    include       mime.types;
    default_type  application/octet-stream;

    upstream tomcats {
        server localhost:8080;
        server localhost:8081;
    }

    sendfile        on;
 
    keepalive_timeout  65;

    server {
        listen       2021;
        server_name  localhost;
    
        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass http://tomcats;
        }

较ngnix默认配置文件,我们的修改点有两处:1,在http块中增加upstream分流配置块;2,在server块的location块中增加proxy_pass配置。

    upstream tomcats {
        server localhost:8080;
        server localhost:8081;
    }

upstream 块配置nginx的请求分发策略,这里默认使用轮询方式,两台服务的端口号分别为8080和8081

location块中,增加了一行 proxy_pass http://tomcats; 用于设置代理服务器信息,这里设置tomcats与upstream块的名称tomcats对照,即服务请求会自动落到upstream 的服务器列表中。要特别注意,upstream 后面的块名称和proxy_pass后面的请求名称要对照,否则配置无法生效。

后台Java工程很简单,只有一个访问方法hello,返回提供服务的后台服务器端口号信息

@RestController
public class Controller {

	@Value("${server.port}")
	private String port;
	
	@RequestMapping("/hello")
	public String hello() {
		return "I am " + port + " server.";
	}
}

Linux配置修改完成后,通过java -jar nginx-demo1-0.0.1-SNAPSHOT.jar 和 java -jar nginx-demo2-0.0.1-SNAPSHOT.jar 分别启动8080和8081两台Java后台服务。

启动 nginx 服务。

启动完成后,在浏览器中,通过nginx的服务端口,加后台服务请求url来访问服务 http://localhost:2021/hello 

可以看到,会轮换的得到8080和8081服务器返回的响应结果。

至此,简单的demo示例完成。

猜你喜欢

转载自blog.csdn.net/magi1201/article/details/113063751