当网站的流量比较大的时,可以通过增加服务器的方式分流用户的请求,可以开几台服务器同时工作,根据用户的距离等算法,对用户的请求分发开来。
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;
}
}刷新测试页面,查看负载分配效果:
