## Nginx集群默认算法: upstream module
upstream模块
upstream web{
server 192.168.10.42;
server 192.168.10.43;
}
server{
listen 80;
server_name localhost;
location/{
proxy_pass http://web;
}
error_page 500 502 503 504/50x.html;
location=/50x.html{
root html;
}
}
nginx的upstream目前支持4种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3、ip_hash
动态请求
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个ul定向到同一个后端服务器,后端服务器为缓存时比较有效。
1、基于轮询分发
upstream web{
server 192.168.10.42;
server 192.168.10.43;
}
server{
listen 80;
server_name localhost;
location /{
proxy_pass http://web;
}
}
2、基于权重进行分发
upstream web{
server 192.168.10.42 weight=1;
server 192.168.10.43 weight=2;
}
server{
listen 80;
server_name localhost;
location/{
proxy_pass http://web;
}
}
3、基于hash结果进行分发
upstream web{
ip_hash;
server 192.168.10.42; #不支持 down 参数
server 192.168.10.43;
}
server{
listen 80;
server_name localhost;
location/{
proxy_pass http://web;
}
}
iphash 算法能够保证来自同样源地址的请求,都分发到同一台主机
基于请求头的分发
1)基于host集群(不同虚拟主机)分发
2)基于开发语言分发
3)基于浏览器的分发
4)基于ip
connection: keep-alived 长连接
1、基于host分发,多集群。两个域名虚拟主机 有各自的集群
http{
upstream web1{
server 192.168.10.42;
}
upstream web2{
server 192.168.10.43;
}
server{
listen 80;
server_name www.web1.com;
location / {
proxy_pass http://web1;
}
}
server{
listen 80;
server_name www.web2.com;
location / {
proxy_pass http://web2;
}
}
}
2、基于开发语言分发
http {
upstream php {
server 192.168.10.42;
}
upstream html {
server 192.168.10.43;
}
server {
listen 80;
server_name www.web1.com;
location ~* .php$ {
proxy_pass http://php;
}
location ~* .html$ {
proxy_pass http://html;
}
}
}
3、基于浏览器分发
upstream elinks { server 192.168.10.42; }
upstream chrome { server 192.168.10.43; }
upstream any { server 192.168.10.42:81; }
server {
listen 80;
server_name www.web1.com;
location / {
proxy_pass http://any;
if ( $http_user_agent ~* Elinks ) {
proxy_pass http://elinks;
}
if ( $http_user_agent ~* chrome ) {
proxy_pass http://chrome;
}
}
}
4、手机和pc端分开
./configure --with-http_geoip_module # 需要重新编译的模块
upstream bj.server {
server 192.168.10.42;
}
upstream sh.server {
server 192.168.10.43;
}
upstream default.server {
server 192.168.10.42:81;
}
geo $geo { # 匹配属于哪个地方 ip 库
default default;
192.168.10.241/32 bj;
192.168.10.41/32 sh;
}
location / {
proxy_pass http://$geo.server$request_uri;
} # 防止uri 丢掉
# http://192.168.10.40/a/b/c/index.php http://192.168.10.42
集群中每个设备的状态设置
1、down 表示单前的server暂时不参与负载
2、weight 默认为1 weight越大,负载的权重就越大。
3、max_fails:允许请求失败的次数默认为1,当超过最大次数时,返回proxynext_upstream模块定义的错误
4、fall_timeout 失败超时时间,在连接Server时,如果在超时时间之内超过max_fails指定的失败次数,会认为在fail_timeout时间内Server不可用。默认为10s。
5、backup:其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
示例
upstream web {
server 192.168.10.42 max_fails=2 fail_timeout=3;
server 192.168.10.43 max_fails=2 fail_timeout=3;
}