Nginx 反向代理与负载均衡

博客分类: software 阅读次数: comments

Nginx 反向代理与负载均衡

简介

Nginx (engine x) 是一个高性能的 HTTP反向代理 web服务器 ,同时也提供了 IMAP / POP3 / SMTP 服务。

反向代理

反向代理通常是作为负载均衡来分发流量给后端的应用程序服务器,以此来提高性能。比如前端是一台 Nginx 作为负载均衡的分发器,后端是多台 Apache 搭建的 Web Server,当访问流量很大时,就让 Nginx 分发请求给后端多台服务器,让它们分工响应。 Nginx 实现负载均衡用到的模块是 proxy_pass 代理模块,通过该模块将客户端请求转发到一组 upstream 服务池,所以还需要用到 ngx_http_upstream_module 模块,该模块只能配置于 http 字段中,支持的代理方式有 proxy_pass fastcgi_pass memcached_pass

正向代理与反向代理的区别

Nginx常用负载均衡算法

  1. 轮询(默认算法):每个请求会依次分配给后端不同的应用程序服务器,不理会后端服务器的实际压力
  2. 加权轮询:权重越大的服务器,被分配到的次数就会越多,通常用于后端服务器性能不一致的情况
  3. IP HASH:当同IP进行重复访问时会被指定到上次访问到的服务器,可以解决动态网站 SESSION 共享问题

upstream模块中的常用参数说明

upstream test_upstream {
  server 192.168.1.110 down;  #该节点不可用
  server 192.168.1.120 backup;  #其他节点挂了后该节点自动上线
  server 192.168.1.130 max_failes=1 fail_timeout=10s weight-5;
  server test.test_upstream.cn 8080 weight=3
}

Nginx负载均衡

轮询负载

http {        #upstream模块包含在http模块下
    upstream  myserver{        #定义upstream名字,下面会引用
        server 192.168.1.100;        #指定后端服务器地址
        server 192.168.1.110;        #指定后端服务器地址
        server 192.168.1.120;        #指定后端服务器地址
    }
 
    server {
        listen 80;
        server name www.myserver.com;
        location / {
            proxy_pass http://myserver;        #引用upstream
        }
    }
}

在上面的例子中,当用户访问 www.myserver.com 站点时,Nginx 会负载平衡分配给后端的三个服务器。使用 ab 做压力测试可以看到在加了负载均衡后 Time per request(每个请求平均消耗时间)降低、Request per second(每秒请求数)提升。如果没有配置 upstream 模块而只使用 proxy_pass 模块,可以实现反向代理的作用。

加权负载均衡

http {      
    upstream  myserver{        
        server 192.168.1.100 weight=3;        #指定后端服务器地址,权重为3
        server 192.168.1.110;      
    }
 
    server {
        listen 80;
        server name www.myserver.com;
        location / {
            proxy_pass http://myserver;        
        }
    }
}

在上面配置中,每3个请求都分配给192.168.1.100,然后第4个请求会分配给192.168.1.110,如此循环下去。

IP HASH负载均衡

upstream myserver {
    ip_hash;        #采用IP HASH算法
    server 192.168.1.100;
    server 192.168.1.110;
    server 192.168.1.120;
}

如果需要将客户与后端一台服务器 绑定 起来,可以使用 ip-hash 负载平衡。这样可以确保来自相同客户机的请求总是指向相同的服务器除非该服务器不可用

基于URL的HASH,当客户端多次访问同一个地址时分配到固定的节点

upstream myserver {
    hash $request_uri;    
    server 192.168.1.100;
    server 192.168.1.110;
    server 192.168.1.120;
}

最少连接数轮询

http{ 
    upstream sampleapp { 
        least_conn; 
        server <<dns entry or IP Address(optional with port)>>; 
        server <<another dns entry or IP Address(optional with port)>>; 
    } 
    .... 
    server { 
        listen 80; 
        ... 
        location / { 
            proxy_pass http://sampleapp; 
        }  
    } 
}

原文链接

【Nginx配置】使用upstream和proxy_pass实现反向代理与负载均衡:https://blog.csdn.net/qq_41049126/article/details/96978519