关于nginx

## 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;
}
原文地址:https://www.cnblogs.com/smlile-you-me/p/15166405.html