浅谈Nginx负载均衡问题

143 阅读2分钟

前言

通常我们的业务中会遇到的信息数量都是巨大的,这个时候就要考虑到负载均衡的问题。负载均衡是将负载分摊到不同的服务单元,既保证了服务的可用性,又保证了响应足够快,给用户很好的体验。能实现负载均衡的既有硬件又有软件,从经济的角度考虑,软件 Nginx 自然是一个不错的选择。

负载均衡策略

Nginx 为我们默认提供了几种负载均衡的策略:

  • 轮询:将客户端发起的请求,按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
  • 权重:会将客户端的请求,根据服务器的权重值不同,分配不同的数量,便于人为控制,适用于后端服务器性能不均衡的情况。
  • ip_hash:基于发起请求的客户端的ip地址不同,他始终会将请求发送到指定的服务器上。它能很好解决同一用户访问同一个应用,session不共享的问题,实现session共享。

轮询

想实现 Nginx 轮询负载均衡机制只需要在配置文件中添加以下内容:

upstream 名字 {
  server ip:port;
  server ip:port;
  ...
}

server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

例如:

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

    upstream win {
	server 192.168.200.56:8080;
	server 192.168.200.56:8081;
    }

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            proxy_pass http://win/;
        }
    }
}

权重

想实现 Nginx 权重负载均衡机制只需要在配置文件中添加以下内容:

upstream 名字 {
  server ip:port weight=权重比例;
  server ip:port weight=权重比例;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

例如:

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

    upstream win {
	server 192.168.200.56:8080 weight=3;
	server 192.168.200.56:8081 weight=7;
    }

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            proxy_pass http://win/;
        }
    }
}

ip_hash

想实现 Nginx 的 ip_hash 负载均衡机制只需要在配置文件中添加以下内容:

upstream 名字 {
  ip_hash;
  server ip:port;
  server ip:port;
  ...
}
server {
  listen 80;
  server_name localhost;
  
  location / {
    proxy_pass http://upstream的名字/;
  }
}

例如:

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

    upstream win {
        ip_hash;
		server 192.168.200.56:8080;
		server 192.168.200.56:8081;
    }

    server {
        listen       80;
        server_name  localhost;
        
        location / {
            proxy_pass http://win/;
        }
    }
}