美文网首页
Nginx的负载均衡

Nginx的负载均衡

作者: xhz的个人小屋 | 来源:发表于2018-05-26 18:42 被阅读0次

    1.upstream模块

    upstream模块介绍
    Nginx的负载均衡功能依赖于ngx_http_upstream_module,所支持的代理方式有proxy_pass,fastcgi_pass,memcached_pass。
    upstream模块例子:

     upstream web_pools{
       server 172.16.10.52:80 weight=1;
       server 172.16.10.53:80 weight=3;
     }
    

    upstream模块应该放于http{}标签内
    默认算法是wrr轮询
    upstream内部参数说明:

    参数 说明
    server 172.16.10.52:80 server后面接需要代理的主机,可以不接端口号,默认是80
    weight 权重
    backup 当所用的RS失效后会启用它
    max_fails=2 最大失败尝试次数,建议2-3次
    fail_timeout=20 失败超时时间,默认是10s,常规业务一般设置为2-3秒
    down 表示服务不可用,一般配合ip_hash一起使用。
    max_conns=number 最大连接数目。
    slow_start=time 从不可用转换至可用的时间。

    upstream调度算法:

    1,rr轮询
    类似于lvs的rr算法,如果后端服务器宕机(默认只监控80端口,如果后端报包502,404,403,503还是会返回错误给用户。),机器则会自动剔除。
    2,weight权重
    权重和访问轮询成正比,权重越大则转发请求越多。
    配置:
    server 192.168.10.10:80 weight=1;
    3,ip_hash
    每个请求按访问的ip的hash结果进行分配,只要hash值向同就会把相同的ip地址的请求分配到同一个服务端,该调度算法可以解决session共享问题,但是也有可能使请求分配不均匀,
    注意:必须是最前端的服务器,多数情况下不能和weight,bakcup选项一起使用。(session共享问题可以通过设置单独存储session的存储来解决。)
    配置:
    ip_hash;
    4,fair动态算法(三方),
    按照后端服务器的响应时间来分配请求,响应时间短的优先分配,比上面算法更加智能的算法,这是Nginx的第三方算法,使用时必须下载upstream_fair模块。
    配置:
    fair;
    5,url_hash(三方)
    按照访问url的hash结果来分配请求,让每个url定到相同的服务器,后端服务器为缓存服务器时效果显著,在upstream加入hash语句,server不能写入weight等其他参数。
    url_hash。按访问的url hash结果来分配请求,使每个url定向至特定的服务器,可以进一步提高后台缓存服务器的命中效率,nginx本身不支持这种,必须要安装nginx的hash软件包。
    配置:
    hash $request_url;
    hash_method crc32;

    2.ngx_http_proxy_module模块

    参数 说明
    proxy_pass http://blog_server_pool 指定反向代理服务池
    proxy_set_header Host $host 当后端web服务器上有多个虚拟主机时,需要用该header来区分主机名称。
    proxy_set_header X-Real-IP $remote_addr; 如果后端程序需要从用户获取IP,从该报文header获取。
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 获取连接代理端的IP地址,多级代理中会有多个值,一般最前面的值时客户端IP地址
    client_body_buffer_size 用于指定客户端,请求主机缓冲区大小,可以理解为先保存至本地,再传给客户端。
    proxy_connect_timeout 表示和后端服务器连接的超时时间。
    proxy_send_timeout 后端服务器数据回传时间,即在规定时间内,后端必须传完所有数据,否则断开连接
    proxy_buffer_size 设置缓冲区大小,该缓冲区大小等于proxy_buffer设置的大小。
    proxy_buffers 设置缓冲区的数量的大小,nginx从代理的后端服务器获取的响应信息。

    proxy_pass指令,此模块可以将请求发送至另外一台服务器,
    配置:
    location /name/ {
    proxy_pass http://127.0.0.1/remote/;
    }
    proxy_pass参数说明:

    参数 说明
    proxy_pass http://blog_server_pool 指定反向代理服务池
    proxy_set_header Host $host 当后端web服务器上有多个虚拟主机时,需要用该header来区分主机名称。
    proxy_set_header X-Real-IP $remote_addr; 如果后端程序需要从用户获取IP,从该报文header获取。
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for 获取连接代理端的IP地址,多级代理中会有多个值,一般最前面的值时客户端IP地址
    client_body_buffer_size 用于指定客户端,请求主机缓冲区大小,可以理解为先保存至本地,再传给客户端。
    proxy_connect_timeout 表示和后端服务器连接的超时时间。
    proxy_send_timeout 后端服务器数据回传时间,即在规定时间内,后端必须传完所有数据,否则断开连接
    proxy_buffer_size 设置缓冲区大小,该缓冲区大小等于proxy_buffer设置的大小。
    proxy_buffers 设置缓冲区的数量的大小,nginx从代理的后端服务器获取的响应信息。

    X-Real-IP和X-Forwarded-For 区别
    X-Forwarded-For是一个可叠加的过程,后面的代理会把前面代理的IP加入X-Forwarded-For
    X-Real-IP只是个变量会被替换
    $remote_addr代表的是他的前面的代理服务器或者客户端的IP地址。
    多重代理要想全面了解流程,需要打印日志下面的几个参数。
    $remote_addr |$http_x_real_ip |$http_x_forwarded_for
    下面有几个案例写的比较清晰,可以参考理解一下:
    https://blog.csdn.net/broadview2006/article/details/54570943
    配置例子:

    location / {
    proxy_pass http://localhost:8000
    #判断请求出错,会咨询下一个服务器请求
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504
    include proxy.conf;
    }
    
    [root@localhost conf]# cat proxy.conf
    proxy_redirect off;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffer_size 4k;
    proxy_buffers 4 32k;
    proxy_busy_buffers_size 64k;
    proxy_temp_file_write_size 64k;
    

    Nginx实现动静分离

    方案一:

    根据访问的url实现动静分离。

    location /static/ {
    }
    location /dyamic/{
    }
    

    方案二:
    根据扩展名称实现动静分离

    location ~ .*\.(css|jpg|png|js|imag)
    {
       proxy_pass http://static_pools
    }
    根据使用客户端$http_user_agent,跳转不同试用页面页面
    IE浏览器(MSIE),火狐(Firefox)。
    if ($http_user_agent ~* “android”)
    {
       proxy_pass http://android_pools
    }
    if ($http_user_agent ~* “iphone”)
    {
       proxy_pass http://iphone_pools
    }
    

    参考链接:
    http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass

    相关文章

      网友评论

          本文标题:Nginx的负载均衡

          本文链接:https://www.haomeiwen.com/subject/gwnmjftx.html