反向代理与负载均衡

反向代理

// nginx/conf/nginx.conf
http {
    // ......
    upstream local {    # 配置上游服务器
        server 127.0.0.1:8080;  --> 转发给本机上的监听8080端口的服务
    }
    server {
        server_name test.abc.cn;
        listen 80;
        location / {
            proxy_redirect   off;   # 禁用所有 proxy_redirect 指令
            # 让上游服务器获得真实的用户IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_pass http://local; #Nginx代理转发给上游服务器
        }
    }
}
  1. 配置了反向代理之后,浏览器是和Nginx服务器直接建立的连接,Nginx又和上游服务器建立连接,那么上游服务器获取的域名和 IP 其实是Nginx服务器的,而不是浏览器的;
         # 把浏览器的域名和`IP`转交给上游服务器的配置
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    
  2. proxy_cache:缓存配置,让Nginx缓存一些不常变化的数据,利用Nginx的高性能,高效处理请求;
        proxy_cache_path /tmp/nginx levels=1:2 
            keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
        server {
            //...
            location / {
                //......
                proxy_cache my_cache;  #缓存的共享内存名
                proxy_cache_key $host$uri$is_args$args; 
                proxy_cache_valid 200 304 302 ld;  #指定不返回的响应
                proxy_pass http://local;  #反向代理
            }
        }
    
    1. proxy_cache_path 设置缓存路径,大小,文件命名方式等信息;共享内存命名为my_cache,大小为10M,路径为/tmp/nginx
    2. proxy_cache_key 设置缓存的key,同一个URL对不同用户的展示内容可能是不同的,用户作为一个变量,以 key-value 的形式缓存共享内存中;
    3. proxy_cache_valid 状态为 200 304 302 的缓存内容,在 1天 后过期;
    4. proxy_ignore_headers Set-Cookie Cache-Control; 尤其要忽略set-cookie
  3. proxy_redirect 在做反向代理功能时,有时会出现重定向的url不是期望的,使用proxy_redirect可以设置url重定向,其作用是对发送给客户端的URL进行修改。
    # 语法:proxy_redirect [ default|off|redirect replacement ];
    # 配置块:http、server、location
    proxy_redirect default;  # 默认
    

负载均衡

反向代理引出了服务器集群的负载均衡

        http {
            upstream nodes {
                // ...
            }
            server {
                // ...
            }
        }
  • upstream指令用于配置上游服务器,可以有多个 upstream 指令,一个 upstream 指令又可以配置多个上游服务器;
  • upstream指令对配置的上游服务器按照默认的轮询方式进行请求。如果上游服务器挂掉,能自己主动剔除,无需手动干预;
  • 但如果上游服务器在配置不均衡的情况下,是解决不了负载均衡的,所以还需要nginx的其他配置。

负载均衡的常用算法

  1. 轮循
    轮询是负载均衡中较为基础也较为简单的算法,它不需要配置额外参数。
    假设配置文件中共有 M 台服务器,该算法遍历服务器节点列表,并按节点次序每轮选择一台服务器处理请求。当所有节点均被调用过一次后,该算法将从第一个节点开始重新一轮遍历。
    特点:由于该算法中每个请求按时间顺序逐一分配到不同的服务器处理,因此适用于服务器性能相近的集群情况,其中每个服务器承载相同的负载。但对于服务器性能不同的集群而言,该算法容易引发资源分配不合理等问题。

  2. 加权轮询
    为了避免普通轮询带来的弊端,加权轮询应运而生。在加权轮询中,每个服务器会有各自的 weight。一般情况下,weight 的值越大意味着该服务器的性能越好,可以承载更多的请求。该算法中,客户端的请求按权值比例分配,当一个请求到达时,优先为其分配权值最大的服务器。
    特点:加权轮询可以应用于服务器性能不等的集群中,使资源分配更加合理化。

  3. IP哈希
    ip_hash 依据发出请求的客户端 IPhash 值来分配服务器,该算法可以保证同 IP 发出的请求映射到同一服务器,或具有相同 hash 值的不同 IP 映射到同一服务器。
    特点:该算法在一定程度上解决了集群部署环境下 Session 不共享的问题。

    Session不共享问题是说,假设用户已经登录过,此时发出的请求被分配到了 A 服务器,但 A 服务器突然宕机,用户的请求则会被转发到 B 服务器。但由于 Session 不共享,B 无法直接读取用户的登录信息来继续执行其他操作。

    实际应用中,我们可以利用 ip_hash,将一部分 IP 下的请求转发到运行新版本服务的服务器,另一部分转发到旧版本服务器上,实现灰度发布。再者,如遇到文件过大导致请求超时的情况,也可以利用 ip_hash 进行文件的分片上传,它可以保证同客户端发出的文件切片转发到同一服务器,利于其接收切片以及后续的文件合并操作。

4、其他算法

  • URL hash
    url_hash 是根据请求的 URLhash 值来分配服务器。
    特点:相同 URL 的请求会分配给固定的服务器,当存在缓存的时候,效率一般较高。然而 Nginx默认不支持这种负载均衡算法,需要依赖第三方库。
  • 最小连接数(Least Connections)
    假设共有M台服务器,当有新的请求出现时,遍历服务器节点列表并选取其中连接数最小的一台服务器来响应当前请求。连接数可以理解为当前处理的请求数。

upstream配置

  1. 权重配置
    1. weight 和请求数量成正比,主要用于上游服务器配置不均衡的情况下
       upstream nodes {
           server 192.168.10.1:8668 weight=5;
           server 192.168.10.2:8668 weight=10;
       }
    
    1. 192.168.10.2机器的请求量是192.168.10.1机器的 2 倍。
  2. ip_hash配置
    每一个请求按照请求 iphash 结果分配,这样每一个请求固定访问同一个上游服务器,能够解决 ip 会话session在同一台服务器的问题。
        upstream nodes {
            ip_hash;
            server 192.168.10.1:8668 weight=5;
            server 192.168.10.2:8668 weight=10;
        }
    
  3. fair配置
    按上游服务器的响应时间来分配请求,响应时间短的优先分配
        upstream nodes {
            server 192.168.10.1:8668 weight=5;
            server 192.168.10.2:8668 weight=10;
            fair;
        }
    
  4. url_hash配置
    按照访问 urlhash 结果来分配请求,使每一个 url 定向到同一个上游服务器
        upstream nodes {
            server 192.168.10.1:8668 weight=5;
            server 192.168.10.2:8668 weight=10;
            hash $request_uri;
            hash_method crc32;  #使用的hash算法
        }
    

upstream的常用配置项

  1. down:表示当前的server不參与负载均衡
  2. weight:默认1weight越大,负载的权重就越大,分配到请求的几率越大
  3. max_fails:请求失败的次数,默认1
  4. fail_timeout : max_fails次失败后,暂停请求此台服务器的时间
  5. backup:其他全部的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻
    upstream nodes {
        ip_hash;
        server 192.168.10.1:8668 down;
        server 192.168.10.2:8668 weight=2;
        server 192.168.10.3:8668;
        server 192.168.10.4:8668 backup;
    }
    

server指令节点

    server {
        listen       80;    #Nginx监听的端口号
        server_name  www.test.com;  # 访问的域名

        location / {
            root   /root;   #定义服务器的默认网站根目录位置
            index index.php index.html index.htm;   #定义首页索引文件的名称

            #以下是一些反向代理的配置可删除.
            proxy_redirect off;

            #让上游Web服务器可以获取用户的真实IP
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            client_max_body_size 10m;   #允许客户端请求的最大单文件字节数
            client_body_buffer_size 128k;   #缓冲区代理缓冲用户端请求的最大字节数,
            proxy_connect_timeout 90;   #nginx跟后端服务器连接超时时间(代理连接超时)
            proxy_send_timeout 90;  #后端服务器数据回传时间(代理发送超时)
            proxy_read_timeout 90;  #连接成功后,后端服务器响应时间(代理接收超时)
            proxy_buffer_size 4k;   #设置代理服务器(nginx)保存用户头信息的缓冲区大小
            proxy_buffers 4 32k;    #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
            proxy_busy_buffers_size 64k;    #高负荷下缓冲大小(proxy_buffers*2)
            proxy_temp_file_write_size 64k; #设定缓存大小,大于这个值,将从upstream服务器传
            ......

            proxy_pass  http://nodes;  #请求转向
            proxy_connect_timeout  500ms;  #Nginx连接上游服务器的超时时间,默认60s
        }

        location /buy {
            proxy_pass   http://172.18.144.23:5789/;  # 转发到指定服务器
        }
        
        error_page   500 502 503 504  /50x.html;
        
        location = /50x.html {
            root   html;
        }
    }
  1. 为了便于管理,可以在 nginx/conf 下创建目录如vhost
  2. vhost 目录下新建一些文件,如a.conf,b.conf,c.conf,在其中管理server等指令节点
  3. 在主配置配置文件 nginx/conf/nginx.conf 中,使用 include 引入其他配置文件
http {
    include vhost/*.conf;   #引入nginx/conf/vhost目录下的、后缀名为.conf的文件
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352