nginx 负载均衡

     nginx 的负载均衡功能依赖于 ngx_http_upstream_module模块,所支持的代理方式有 proxy_pass(一般用于反向代理),fastcgi_pass(一般用于和动态程序交互),memcached_pass,proxy_next_upstream,fastcgi_next_pass,memcached_next_pass

upstream模块调度算法

第一类为静态调度算法:负载均衡器根据自身设定的规则进行分配,不需要考虑后端节点服务器的情况,例如:rr、wrr、ip_hash等都属于静态调度算法。

第二类为动态调度算法:负载均衡器会根据后端节点的当前状态来决定是否分发请求,例如:连接数少的优先获得请求,响应时间短的优先获得请求。例如:least_conn、fair等都属于动态调度算法。

算法

轮询(rr)(默认调度算法,静态调度算法)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器故障,故障系统自动清除,使用户访问不受影响。

权重轮询(wrr)(静态调度算法)

weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况。

upstream  server_wrr {  
	    server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=10s backup; 
	    server   127.0.0.1:8082 weight=2 max_fails=2 fail_timeout=10s;
	    server   127.0.0.1:8083 weight=3 max_fails=2 fail_timeout=10s; 
	} 

ip_hash(静态调度算法)

每个请求按访问IP的hash结果分配,这样来自同一个IP的固定访问一个后端服务器,主要解决动态网站session共享的问题。(注:不能有weight和backup)。

upstream  server_ip_hash {  
		ip_hash;  
		server   127.0.0.1:8081; 
		server   127.0.0.1:8082 max_fails=2 fail_timeout=10s;
		server   127.0.0.1:8083; 
	} 

fair(动态调度算法)

这个算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,相应时间短的优先分配,默认不支持,如果想使用需要安装upstream_fail模块。(由于长时间没有维护,该模块不支持高级nginx版本)

least_conn(动态调度算法)

最少链接数,那个机器连接数少就分发。

可以参考篇(https://www.cnblogs.com/minirice/p/10129726.html 和 https://blog.csdn.net/xqhys/article/details/81788358)

upstream  server_least_conn {  
		least_conn;  
		server   127.0.0.1:8081 weight=1 max_fails=2 fail_timeout=10s backup; 
	    	server   127.0.0.1:8082 weight=2 max_fails=1 fail_timeout=10s;
	    	server   127.0.0.1:8083 weight=3 max_fails=2 fail_timeout=10s; 
	} 

url_hash

按照访问的URL的hash结果来分配请求,是每个URL定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率,nginx本身不支持,如果想使用需要安装nginx的hash软件包。(注:如果使用url_hash,那么在节点宕机或者新加节点的时候,会产生缓存丢失无效的情况。)

upstream server_url_hash {
	server   127.0.0.1:8081; 
	server   127.0.0.1:8082;
	server   127.0.0.1:8083; 
        hash $request_uri;
	hash_method crc32;
}

当只是用hash $request_uri;可以通过url hash 算法,如果 添加hash_method crc32; 就需要添加 hash 包。

一致性hash

一致性hash算法一般用于代理后端业务缓存服务(squid,memcache)的场景,通过将用户请求的URI或者指定字符串进行计算,然后调度到后端的服务器上。此后任何用户查找同一个URI或者指定字符串都会被调度到这一台服务器上,因此后端的每个节点缓存的内容都是不同的。一致性hash算法可以解决后端某个或几个节点宕机后,缓存的数据动荡最小。注:Nginx本身不支持一致性HASH算法,需要插件,但Nginx分支tengine支持。

upstream server_equal_url_hash {
	consistent_hash $request_uri;
	server 127.0.0.1:9001 id=1001 weight=3;
	server 127.0.0.1:9002 id=1002 weight=10;
	server 127.0.0.1:9003 id=1003 weight=20;
}

upstream模块功能说明

upstream 关键字必须有

server 可以接域名和IP,如果不指定端口,默认是80

参数说明:

weight:代表服务器的权重,默认值是1。权重数字越大表示接受的请求比例越大。

max_fails=1:Nginx尝试连接后端主机失败的次数,这个数值是配置proxy_next_upstream、fastcgi_next_upstream和memcached_next_upstream三个参数来使用的,当Nginx接受后端服务器返回这三个参数定义的状态码时,会将这个请求转发给正常工作的后端服务器,例如404、502、503。max_fails的默认值是1;企业场景:建议2-3次。

backup:热备配置(RS)节点的高可用,当期面激活的RS都失败后会自动启用热备RS。这标志着这个服务器作为备份服务器,若主服务器全部宕机了,就会向他转发请求;注意:当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

fail_timeout=10s:果max_fails是5,他就检测5次。如果5次都是502,那么他就会根据fail_timeout的值,等待10s再去检查,还是只检查一次,如果持续502,在不重新加载nginx配置的情况下,每隔10s都只检测一次。常规业务:2-3秒比较合理。

down:这标识着服务器永远不可用,这个参数可配合ip_hash使用。

 

proxy模块

proxy_set_header:设置http请求header项传给后端服务器节点,例如:可实现让代理后端的服务器节点获取访问客户端用户的真实IP地址。

client_body_buffer_size:用于指定客户端请求主体缓冲区大小(http请求报文)。

proxy_connect_timeout:表示反向代理与后端节点服务器连接的超时时间,即发起握手等候响应的超时时间。

proxy_send_timeout:表示代理后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则,Nginx将断开这个连接。

proxy_buffer_size:设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小。

proxy_buffers:设置缓冲区的数量和大小。nginx从代理的后端服务器获取的响应信息,会放置到缓冲区。

proxy_busy_buffers_size:用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐为proxy_buffers*2。

proxy_temp_file_write_size:指定proxy缓存临时文件的大小

常规配置

location / {
            access_log logs/access.log main;
            proxy_pass http://www_server_pools;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_redirect default;
            proxy_buffer_size 512k;
            proxy_buffers 6 512k;
            proxy_busy_buffers_size 512k;
            proxy_temp_file_write_size 512k;
            client_max_body_size 100m;
        }

 

你可能感兴趣的:(nginx,nginx,负载均衡)