当网站的流量比较大的时,可以通过增加服务器的方式分流用户的请求,可以开几台服务器同时工作,根据用户的距离等算法,对用户的请求分发开来。
nginx 是个很不错的负载均衡程序,而且配置很简单,负载功能用到 nginx的upstream 模块:
#weight【权重】越大被请求的概率越大;max_fails周期失败次数;fail_timeout请求周期,这里的意思是10s内请求失败次数为2以上自动判断这个节点不可用,
#默认是10s内1次,那么在10s内不再请求该节点,自动到分发到其他能用的节点上
upstream stream_group{ ip_hash; #这个分配方式,有6种,在下面说明 server 服务器IP1 weight=1 max_fails=2 fail_timeout=10; server 服务器IP2 weight=2 max_fails=2 fail_timeout=10; server 服务器IP3:端口号 down; #down代表这台服务器暂停服务,不要分发进来 server 服务器IP4:端口号 weight=2; #仅指定权重,其他默认 server 服务器IP5:端口号; #都用默认 server 服务器IP6:端口号 backup; #backup这是备胎的意思,只有其他服务器都挂了或者忙不过来了,这台才会开始任务,这家伙平时没啥事,最后关键时刻还得靠它呢 } server{ #这里其他配置省略不写 location / { proxy_pass http://stream_group; #这里需要加上upstream的名称 proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #异常容灾,返回下面的状态码时自动切换好的服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 non_idempotent; } }
核心代理部分,就是把请求转发到上面配置的upstream xxx
server{ #下面就是转发 location / { proxy_pass http://xxx; #这里需要加上upstream的xxx名称 } }
包括所有php的转发
location /{ proxy_pass http://myServer; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #异常容灾,返回下面的状态码时自动切换好的服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 non_idempotent; } location ~* .*.php$ { proxy_pass http://myServer; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #异常容灾,返回下面的状态码时自动切换好的服务器 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_403 http_404 non_idempotent; }
upstream目前常用的6种分配方式:
1.轮询模式:默认的模式
按请求时间一个一个来请求,有序地进行,如果有down的或者其他的自动跳过到下一个。
upstream myServer { server localhost:805 ; server localhost:806 weight=1 max_fails=2 fail_timeout=10; server localhost:804 weight=2 max_fails=2 fail_timeout=10; }
2.ip_hash【ip_hash】:根据IP分区分配
只要用户的IP不变,那么用户访问的就是同一台固定的服务器,在用session的网站比较合适,这有利于保证session有效,用内存数据库的另当别论。
upstream myServer { ip_hash; server localhost:805 ; server localhost:806 weight=1 max_fails=2 fail_timeout=10; server localhost:804 weight=2 max_fails=2 fail_timeout=10; }
3.weight【weight=权重】:权重模式,越大请求分配的概率越大
这种模式一般用在服务器性能不同的服务器群,性能高的当然权重就相对高,反之则少分发。
upstream myServer { server localhost:805 weight=2 ; server localhost:806 weight=1 max_fails=2 fail_timeout=10; server localhost:804 weight=2 max_fails=2 fail_timeout=10; }
4.最少连接数,自动判断哪个最少连接,则自动连接到对应的服务器
upstream myServer { least_conn; server localhost:805 ; server localhost:806 weight=1 max_fails=2 fail_timeout=10; server localhost:804 weight=2 max_fails=2 fail_timeout=10; }
5.fair(第三方,要额外安装编译):根据响应时间分配
由服务器响应的时间决定优先级,响应时间越短的服务器就优先级越大,响应时间越短则被分配到的请求量越大。
upstream myServer { server localhost:805 ; server localhost:806 weight=1 max_fails=2 fail_timeout=10; server localhost:804 weight=2 max_fails=2 fail_timeout=10; fair; }
6.url_hash【hash $request_uri】(第三方,要额外安装编译):由访问url的hash结果分配,暂且理解成重定向吧
比如有些文件需要下载,放在了一个专属的服务器,请求相同url的请求都分发到该服务器去。一般用在资源服务器、需要缓存文件的服务器,比如文件下载。
upstream myServer{ hash $request_uri; server localhost:805; server localhost:806; server localhost:804; } server { location /{ proxy_pass http://myServer; } }
操作案例:
[root@instance-6ocolrk6 vhost]# cat alipay168.cn.conf
upstream test1 { server 127.0.0.1:8083 weight=2 ;#hellow server 127.0.0.1:8082 weight=3 ;#dir 2 server 127.0.0.1:80 weight=2 ;#目前没有配置,会默认返回nginx默认页面 } server { listen 80; server_name www.alipay168.cn; index index.php index.html; root /web/nginx/alipay168; location /{ proxy_pass http://test1; } location ~\.php$ { fastcgi_pass 127.0.0.1:9000;#php-fpm的默认端口是9000 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
刷新测试页面,查看负载分配效果: