用nginx做反向代理和负载均衡非常简单,支持两个用法  1) proxy : 用来做反向代理, 2) upstream :用来做负载均衡。

 

Nginx之反向代理服务器(反向代理+负载均衡)_负载均衡

 

补充概念:

  • 代理服务器:所谓代理服务器就是位于发起请求的客户端与原始服务器端之间的一台跳板服务器,正向代理可以隐藏客户端,反向代理可以隐藏原始服务器。
  • 正向代理:正向代理服务器相当于客户端。用户知道目标服务器地址,但由于网络限制等原因,无法直接访问。这时候需要先连接代理服务器,然后再由代理服务器访问目标服务器。
  • 反向代理:反向代理服务器就相当于目标服务器。用户不必知道目标服务器地址,直接访问反向代理服务器就可以获得目标服务器的资源。

 

反向代理

在高并发下,单台服务器已经不能满足用户的请求时,需要多台服务器集群。这时候需要Nginx的反向代理功能实现请求分发。

Nginx可以配置多个服务,每个服务监听不通的接口,实现不通的功能。

#配置集群
upstream www.blueStar.com{   
    server 192.168.1.172:8080;  
    server 192.168.1.173:8080;   
}

server {
    listen 80;  #监听端口
    server_name www.blueStar.com; #访问的域名(需要配置hosts)
    location / {
        #设置反向代理
        proxy_pass http://www.blueStar.com;    }
}

server {
    listen 8080;
    server_name 192.168.1.204; #访问的IP
    location / {
       #根目录定位
       root /var/www/html8080;
       index index.html;
    }
}

 

负载均衡

负载均衡(Load Balance),是指建立在现有网络结构之上,并提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其原理就是数据流量分摊到多个服务器上执行,减轻每台服务器的压力,多台服务器共同完成工作任务,从而提高了数据的吞吐量。

 

Nginx的负载均衡有3种调度规则:

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器。如果后端服务器down掉,能自动剔除。

upstream www.blueStar.com{   
    server 192.168.1.172:8080;  
    server 192.168.1.173:8080;   
}
  • 权重/weight: 指定轮询的权重值(即:访问比例),用于后端服务器性能不均的情况。
upstream www.blueStar.com{   
    server 192.168.1.172:8080 weight=2;  
    server 192.168.1.173:8080 weight=1;   
}
  • IP Hash: 按访问ip的hash结果分配。每个访客固定访问一个后端服务器,可以解决session的问题。  
upstream www.blueStar.com{   
    server 192.168.1.172:8080;  
    server 192.168.1.173:8080;  
    ip_hash;
}

 

补充

注意:调度规则使用轮询或者权重的时候,可能出现session共享问题,即:在 192.168.1.172:8080进行登陆认证后,后续访问192.168.1.173:8080会出现需要重新认证问题。

        解决方案:

       1,使用ip_hash调度规则(同一个IP值会访问同一台服务器)

       2,将session存入redis

       3,将session存入数据库,每次查询数据库进行认证(会增加数据库IO,加大数据库负担;而且数据库读写熟读相对较慢)

       4,使用cookie(session是存在服务器端,cookie存在客户端。同一个客户端cookie是一样的。但是cookie存储认证信息不安全,容易泄露)

 

upstream属性介绍

max_fails:连续访问制定次数都失败,就自动剔除该服务器
fail_timeout:访问指定时间内无返回信息,就认为访问失败

upstream web_app {   
     server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s;   
     server 192.168.1.173:8080 weight=1 max_fails=2 fail_timeout=30s;   
}