本文是Nginx系列(一),将介绍如何使用Nginx+Apache实现反向代理和负载均衡;负载均衡在服务端开发中是一个比较重要的特性;因为Nginx除了作为常规的Web服务器外,还会被大规模的用于反向代理前端,因为Nginx的异步框架可以处理很大的并发请求;负载均衡简单的理解:将负载分摊到不同的服务节点中,既保证服务的可用性,解决单个服务节点压力过大,又保证响应足够快,给用户很好的体验;对于一个大型网站来说,负载均衡是永恒的话题。

1. 概述

使用代理服务器可以将请求转发给内部的Web服务器,使用这种加速模式显然可以提升静态网页的访问速度。因此也可以考虑使用这种技术,让代理服务器将请求 均匀转发给多台内部Web服务器之一上,从而达到负载均衡的目的。
使用反向代理的好处是,可以将负载均衡和代理服务器的高速缓存技术结合在一起,提供有益的性能,具备额外的安全性,外部客户不能直接访问真实的服务器。并 且实现起来可以实现较好的负载均衡策略,将负载可以非常均衡的分给内部服务器,不会出现负载集中到某个服务器的偶然现象。

2. 环境

本地使用Windows系统,安装Nginx(监听80端口)和Apache(监听8080端口);两台Centos虚拟主机,都分别安装Apache(监听8080端口);安装Nginx和Apache的过程这里就不介绍了;一台主机在前端做反向代理,三台后端Aapche服务器。
测试域名:test.minhow.com
A服务器:127.0.0.1(主机)
B服务器:192.168.22.128
C服务器:192.168.22.129
域名解析:在Windows主机上,添加127.0.0.1 test.minhow.com解析。

3. 实现反向代理和负载均衡

实现思路:A服务器(主机)作为主服务器,域名解析在127.0.0.1(主机)上,由A服务器(主机)负载均衡到A服务器(127.0.0.1),B服务器(192.168.22.128),C服务器(192.168.22.128)上。
Nginx的upstream目前支持以下几种方式的分配:

3.1 轮询(默认)

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

3.2 weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

3.3 ip_hash

对请求来源IP地址计算hash值,IPv4会考虑前3个octet,IPv6会考虑所有的地址位,然后根据得到的hash值通过某种映射分配到backend;这样每个访客固定访问一个后端服务器,可以解决session的问题。

3.4 fair(第三方)

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

3.5 url_hash(第三方)

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
现在测试第一种方式轮询,打开nginx.conf,在http段加入以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
upstream minhow {
server 127.0.0.1:8080 weight=2; # 2/6次
server 192.168.22.128:8080 weight=2; # 2/6次
server 192.168.22.129:8080 weight=2; # 2/6次
}
server {
listen 80;
server_name test.minhow.com;
location / {
proxy_pass http://minhow;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

保存重启nginx,分别在三台服务器的index.html文件打印输出不同的内容,查看是否达到负载均衡的目的,执行多次后,截取三次不同的输出如下图:

nginx_1

nginx_2

nginx_3

可以看到三台服务器分别输出不同的内容。
根据服务器的本身的性能差别及职能,可以设置不同的参数控制:

  1. down 表示负载过重或者不参与负载。
  2. weight 权重过大代表承担的负载就越大。
  3. backup 其它服务器宕机时或down时才会请求backup服务器。
  4. max_fails 失败超过指定次数会暂停或请求转往其它服务器。
  5. fail_timeout 失败超过指定次数后暂停时间。

到此,已经成功实现三台负载均衡了,下一篇文章将介绍Nginx负载均衡如何保持会话一致性,以及负载均衡算法等知识。

最后更新: 2018年01月06日 18:00

原始链接: http://blog.minhow.com/2016/12/26/server/nginx-reverse-proxy/

× 请我吃糖~
打赏二维码