Nginx的反向代理做负载均衡
对于一个大型网站,随着网站的访问量快速增长,单台服务器很难再支撑起需要,所以我们会购置多个服务器来满足业务量的需求,然后再利用Nginx提供的反向代理功能,来实现多台服务器间的协作功能,提高网站的处理能力。那首先先了解下什么是Nginx的正向代理和反向代理
正向代理与反向代理的区别
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。
反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。
正、反代理使用场景
- 正向代理:主要用于在防火墙内的局域网提供访问外网的途径(FQ软件-红杏出墙)
- 反向代理:主要用于将防火墙后面的服务器提供给外网的客户访问,同时还有可以实现负载均衡等功能
要实现正向代理服务,客户端必须要进行一些特别的设置。这些略过,不过你可以买个vpnFQ软件感受一下
反向代理实现
利用Nginx来实现反向代理配置简单,指令proxy_pass,用于设置后端服务器的地址。地址中包括使用的协议,主机名,URL
server{ listen 80; server_name www.fx.com; # 用户访问www.fx.com 域名的请求全部都转发给ip为140,端口为8099的主机 location / { proxy_pass http://192.168.153.140:8099; } }
本地测试的时候,记得修改本地host文件来解析www.fx.com域名。
# C:\Windows\System32\drivers\etc\hosts 192.168.153.139 www.fx.com
六、反向代理相关指令
- 指令proxy_pass: 用于设置后端服务器的地址。地址中包括使用的协议,主机名,URL
- 指令proxy_set_header: 在将客户端发送后端服务器之前,更改来自客户端的请求信息
- 指令proxy_connect_timeout 配置Nginx与后端代理服务器尝试建立连接的超时时间
- 指令proxy_redirect 用于修改后端服务器返回的响应头中的Location和Refresh
七、Nginx下的负载均衡
负载均衡就是将请求压力分摊到多个服务器承担,从而提高服务器的可用性和响应速度。下面以lnmp环境测试
1、场景环境准备:
- 作为反向代理的 A主机 192.168.153.139
- B 主机 192.168.153.140
- C 主机 192.168.153.141
B、C主机添加虚拟主机 www.fz.com,项目首页文件分别显示
# B主机
[root@localhost /]# echo 'hello 140' > /home/wwwroot/www.fz.com/index.html
# C主机
[root@localhost /]# echo 'hello 141' > /home/wwwroot/www.fz.com/index.html
2、代理服务器配置
在A主机创建虚拟主机,域名:www.fz.com。修改配置文件
[root@localhost /]# vim /usr/local/nginx/conf/vhost/www.fz.com.conf
配置文件修改以下内容
upstream myfz { server 192.168.153.140:80; server 192.168.153.141:80; } server{ listen 80; server_name www.fz.com; location / { proxy_pass http://myfz; # $host 用来获取客户端真实的主机名 proxy_set_header Host $host; # $remote_addr 用来获取客户端真实的IP地址 proxy_set_header X-Real-IP $remote_addr; # $proxy_add_x_forwarded_for 用来在客户端请求头字段后添加客户端地址,使用逗号分隔,当不存在请求头字段,该变量等同于上面的$remote_addr proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
3、客户端测试
本地测试的时候,记得修改本地hosts文件来解析www.fz.com域名。
# C:\Windows\System32\drivers\etc\hosts
192.168.153.139 www.fx.com
192.168.153.139 www.fz.com
Nginx检测到后端那台服务器宕机了,则会在负载均衡时自动排除该主机。你可以重启(reboot)或关机测试(init 0)
5、权重轮询测试
很多时候,我们购置多台服务器组成负载均衡组,但是保不准服务器硬件配置高低不一样。所以我们要通过weight参数来进行权重设置,配置好的权重高些,反之设置权重低些。
注意Nginx会按照平滑加权重轮询算法进行分配。其中权重值总和为一个循环,如下配置:这里配置10次请求为一次循环,在整个过程中,140服务器会在10次请求被分配到8次,141服务器3次 但是8次和2次并不会连续执行,而是按照算法分散执行。
另外,还可以设定每台Web服务器在负载调度中的状态。
- max_fails 允许请求失败的次数,默认1次,当超过最大次数时,返回proxy_next_upstream指令定义的错误
- 在经历max_fails次失败后,暂停服务的时间。
- backup 预留的备份机器
- down 表示当前的server暂时不参与负载均衡
upstream myfz { server 192.168.153.140:80 weight=8 max_fails=1 fail_timeout=2; server 192.168.153.141:80 weight=2 max_fails=2 fail_timeout=2; }
6、让主服务器也提供服务
- 修改主服务器的nginx.conf主服务器的nginx.conf或者另外创建虚拟主机
- 服务器转发到了自己IP上,然后又进到主服务器分配IP那里,假如一直分配到本机,则会造成一个死循环
- 80端口已经用来监听负载均衡的处理,那么本服务器上就不能再使用80端口来处理fz.com的访问请求
upstream myfz { server 192.168.153.140:80 weight=8; server 192.168.153.141:80 weight=1; server 192.168.153.139:8088 weight=1; }
7、ip_hash解决session问题
ip_hash方式是指:每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session共享的问题
upstream myfz { ip_hash; server 192.168.153.140:80 weight=8; server 192.168.153.141:80 weight=1; server 192.168.153.139:8088 weight=1; }
注意:在使用ip_hash方式的时候,不能使用weight和backup设置。另外使用ip_hash方式为每一个用户ip绑定一台服务器,势必会导致某些服务器接收的请求多。所以只有在有必要的时候使用。
8、利用第三方模块fair进行负载均衡
1、首先要安装fair模块
2、配置fair方式的负载均衡
upstream myfz { server 192.168.153.140:80; server 192.168.153.141:80; fair; } server{ listen 80; server_name www.fz.com; location / { proxy_pass http://myfz; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
3、测试效果 验证fair模块是否根据后端服务器的响应时间负载均衡。
<?php sleep(10); echo 'hello 140'; ?>