Nginx反向代理与负载均衡
一、Nginx反向代理
代理分两类:正向代理和单向代理
正向代理:帮助客户访问服务器、缓存服务器内容。
1. 什么是Nginx反向代理
反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。
Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能
2. 实现反向代理实验
nginx可以代理七层(应用层)和四层(网络层),代理七层代理比四层代理看到的东西多功能强大,可以看到真实数据。
使用模块: proxy_pass 反向代理的服务器地址或域名;
实验拓扑图,如下:
2.1 实验目的:pc2w为代理服务器,代理 服务端pc3处理用户pc1的请求。
2.2 实验过程
1 ①首先准备三台虚拟机且关闭防火墙和selinux,其中pc2和pc3安装nginx。 2 pc2、pc3执行: 3 yum install epel-release -y 4 yum install nginx -y 5 #安装nginx 6 ②pc2和pc3上创建子配置文件test.conf 7 pc2、pc3执行: 8 cd /etc/nginx/conf.d/ 9 touch test.conf 10 #进入子配置文件目录创建子配置文件 11 ③服务端pc3子配置文件内容 12 server { 13 root /etc/nginx/html; 14 #指定虚拟主机根目录 15 } 16 ④创建服务端pc3虚拟主机的根目录,并写默认内容为this is pc3在index.html中 17 mkdir -p /etc/nginx/html; 18 echo "this is pc3">/etc/nginx/html/index.html 19 #递归创建文件夹并设置默认主页内容 20 ⑤反向代理服务器pc2的配置文件内容: 21 server { 22 listen 80; 23 #监听所有80端口 24 server_name www.dw.com; 25 #创建虚拟主机www.dw.com 26 location /{ 27 proxy_pass http://192.168.50.150 28 #访问反代的虚拟主机www.dw.com则由192.168.50.150处理请求 29 } 30 } 31 ⑥代理服务和服务端开启nginx服务,并在pc1客户端添加www.dw.com的对应hosts文件进行测试 32 pc2、pc3执行: 33 systemctl start nginx 34 pc1执行: 35 sed -i '1a\192.168.50.100 www.dw.com' /etc/hosts 36 #在/etc/hosts文件的第一行添加192.168.50.100 www.dw.com内容 37 curl www.dw.com 38 #访问反向代理服务器 39 得到内容 40 this is pc3
二、反向代理负载均衡
nginx反向代理负载均衡中用的是upstream模块,应用于http模块中,目的为可为所有server模块提供服务,默认算法为轮询。
使用格式:
upstream name(反代名称){
server 后端服务器地址 [算法] [其他配置] ;
}
其他配置:
①max_conns=数字;设置最大活动连接数,默认为0表示无限制
②max_fails=数字;后端服务器下载条件,对本次调度选择的后端服务器进行连续检查,如果都失败标记不可用,默认1次
③fail_timeout=time;后的服务器上行时间,坏掉后修复需要检查多久才能上线使用,默认检查10s
④backup 设置为备份服务器,所有服务器不可用时使用此服务,注意不能指定自己;
⑤down 指定此服务器down状态,无论本身是什么状态;
1. 反向代理负载均衡调度算法
- 轮询算法
默认算法是轮询算法即反向代理服务器处理用户请求时,每个后端服务器都轮流给。
upstream lhj{ server http://192.168.30.11;
server http://192.168.30.12;
}
- 加权轮询算法
在默认轮询的基础上增加权重,weight=number。如果后端有2个服务器其中一个配置权重为weight=3另外一个不配置默认是1,则有用户访问时分配给给有权重的服务器和不配置权重的服务器的比例为3:1。
upstream lhj{ server http://192.168.30.11 weight=3;
server http://192.168.30.12;
}
- 最小连接数算法
按照nginx反向代理服务器和后端服务器的连接数分配请求,连接越少的分配处理请求优先级越高。例如若最小连接数(least_conn;)是设置是3,后端服务器1有2个请求在处理,而后端服务器2只有一个请求在处理则新请求交给后端服务器2。
upstream lhj{ least_conn;
server http://192.168.30.11;
server http://192.168.30.12;
}
- ip、url 哈希算法
每个请求按访问ip或者url的hash结果分配,这样每个访客固定访问一个后端服务器,不需要知道是如何计算的,只要了解会固定访问一个后端服务器即可。
响应时间fair算法
需要解读nginx第三方模块ngx_http_upstream_fair_module实现,配置时max_fails=number为后端服务器配置,默认单位为秒,按照响应时间来处理请求,响应时间越短越优先分配
2、实现反向代理负载均衡实验
使用变量:$remote_root
实验目的:用户pc1访问代理服务的www.lhj.com虚拟主机域名时,若由服务端pc3服务器处理则返回this is pc3若由服务端pc4服务器处理则返回this is pc4 用nginx反向代理实现负载均衡。
实验过程:
1 ①首先准备四台虚拟机且关闭防火墙和selinux,其中pc2、pc3、pc4安装nginx。 2 pc2、pc3、pc4执行: 3 yum install epel-release -y 4 yum install nginx -y 5 #安装nginx 6 ②pc2、pc3、pc4上创建子配置文件test.conf 7 pc2、pc3、pc4执行: 8 cd /etc/nginx/conf.d/ 9 touch test.conf 10 #进入子配置文件目录创建子配置文件 11 ③服务端pc3子配置文件内容 12 server { 13 root /etc/nginx/html; 14 #指定虚拟主机根目录 15 } 16 ④创建服务端pc3虚拟主机的根目录,并写默认内容为this is pc3在index.html中 17 mkdir -p /etc/nginx/html; 18 echo "this is pc3">/etc/nginx/html/index.html 19 #递归创建文件夹并设置默认主页内容 20 ⑤服务端pc4子配置文件内容 21 server { 22 root /etc/nginx/html; 23 #指定虚拟主机根目录 24 } 25 ⑥服务端pc4子配置文件内容 26 server { 27 root /etc/nginx/html; 28 #指定虚拟主机根目录 29 } 30 ⑦创建服务端pc4虚拟主机的根目录,并写默认内容为this is pc4在index.html中 31 mkdir -p /etc/nginx/html; 32 echo "this is pc4">/etc/nginx/html/index.html 33 ⑧反向代理服务器pc2的主配置文件和子配置文件修改: 34 主配置文件内容修改: 35 vim /etc/nginx/nginx.conf 36 #打开主配置文件,在主配置文件的http模块中添加内容如下: 37 upstream lhj { 38 #创建名字为lhj的方向代理负载均衡 39 server 192.168.30.13; 40 #服务端pc3地址 41 server 192.168.30.14; 42 #服务端pc4地址 43 } 44 #子配置文件test.conf内容: 45 server { 46 listen 80; 47 #监听所有80端口 48 server_name www.lhj.com; 49 #创建虚拟主机www.lhj.com 50 location /{ 51 proxy_pass http://lhj; 52 #访问反代的虚拟主机www.lhj.com则由反向代理负载均衡lhj来处理请求 53 } 54 } 55 ⑨代理服务和服务端开启nginx服务,并在pc1客户端添加www.lhj.com的对应hosts文件进行测试 56 pc2、pc3、pc4执行: 57 systemctl start nginx 58 pc1执行: 59 sed -i '1a\192.168.30.12 www.lhj.com' /etc/hosts 60 #在/etc/hosts文件的第一行添加192.168.30.12 www.lhj.com内容 61 curl www.lhj.com 62 #多次使用访问反向代理服务器 63 得到内容 64 this is pc3 65 this is pc4的比例大概为1:1