专业的培训行业网站模板,上海网站建设润滋,公司备案证查询网站查询网站查询,深圳联合办公空间注意#xff1a;本文为 “Linux 搭建 nginxkeepalived (主备双主模式) 高可用 | Nginx反向代理” 相关文章合辑。 KeepalivedNginx实现高可用#xff08;HA#xff09;
xyang0917 于 2016-09-17 00:24:15 发布
keepalived 的 HA 分为抢占模式和非抢占模式#xff0c;抢占…注意本文为 “Linux 搭建 nginxkeepalived (主备双主模式) 高可用 | Nginx反向代理” 相关文章合辑。 KeepalivedNginx实现高可用HA
xyang0917 于 2016-09-17 00:24:15 发布
keepalived 的 HA 分为抢占模式和非抢占模式抢占模式即 MASTER 从故障中恢复后会将 VIP 从 BACKUP 节点中抢占过来。非抢占模式即 MASTER 恢复后不抢占 BACKUP 升级为 MASTER 后的 VIP。下面分别介绍 CentOS7 下抢占模式和非抢占模式的配置方式
1、方案规划
VIPIP主机名Nginx端口192.168.1.210192.168.1.201nginx-0180192.168.1.210192.168.1.202nginx-0280
两台服务器的 VIP 为192.168.1.210
分别在两台 WEB 服务器安装 nginx 和 keepalived
1、安装 Nginx请参考《Nginx源码安装》
http://blog.csdn.net/xyang81/article/details/51476293)
2、安装 Keepalived请参考《Keepalived安装与配置》
http://blog.csdn.net/xyang81/article/details/52554398
3、防火墙添加 arrp 组播规则或关闭防火墙
1 iptables
shell vi /etc/sysconfig/iptables
-A INPUT -p vrrp -d 224.0.0.18/32 -j ACCEPT2 firewall
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface enp4s0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload4、关闭selinux
shell vi /etc/sysconfig/selinux
#修改:
SELINUXdisabled
#setenforce 02、抢占模式配置
编辑/etc/keepalived/keepalived.conf配置文件
1 MASTER192.168.1.201
global_defs {router_id nginx_01 #标识本节点的名称通常为hostname
}## keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
##如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加。如果脚本执行结果非0,
##并且weight配置的值小于 0,则优先级相应的减少。其他情况,维持原本配置的优先级,即配置文件中priority对应的值。
vrrp_script chk_nginx {script /etc/keepalived/nginx_check.shinterval 2 #每2秒检测一次nginx的运行状态weight -20 #失败一次将自己的优先级-20
}
vrrp_instance VI_1 {state MASTER # 状态主节点为MASTER备份节点为BACKUPinterface enp0s3 # 绑定VIP的网络接口通过ifconfig查看自己的网络接口virtual_router_id 51 # 虚拟路由的ID号,两个节点设置必须一样,可选IP最后一段使用,相同的VRID为一个组,他将决定多播的MAC地址mcast_src_ip 192.168.1.201 # 本机IP地址priority 100 # 节点优先级值范围0254MASTER要比BACKUP高advert_int 1 # 组播信息发送时间间隔两个节点必须设置一样默认为1秒# 设置验证信息两个节点必须一致authentication {auth_type PASSauth_pass 1111}# 虚拟IP两个节点设置必须一样。可以设置多个一行写一个virtual_ipaddress {192.168.1.210}track_script {chk_nginx # nginx存活状态检测脚本}
}2 BACKUP192.168.1.202
global_defs {router_id nginx_02
}
vrrp_script chk_nginx {script /etc/keepalived/nginx_check.shinterval 2weight -20
}
vrrp_instance VI_1 {state BACKUPinterface enp0s3virtual_router_id 51mcast_src_ip 192.168.1.202priority 90advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.210}track_script {chk_nginx}
}3 创建nginx服务检测脚本
分别在主备服务器/etc/keepalived目录下创建nginx_check.sh脚本并为其添加执行权限
chmod x /etc/keepalived/nginx_check.sh
用于 keepalived 定时检测 nginx 的服务状态如果 nginx 停止了会尝试重新启动 nginx如果启动失败会将 keepalived 进程杀死将 vip 漂移到备份机器上。
#!/bin/bash
Aps -C nginx --no-header | wc -l
if [ $A -eq 0 ];then/opt/nginx/sbin/nginx #尝试重新启动nginxsleep 2 #睡眠2秒if [ ps -C nginx --no-header | wc -l -eq 0 ];thenkillall keepalived #启动失败将keepalived服务杀死。将vip漂移到其它备份节点fi
fi4 启动 keepalived 服务
shell service keepalived start
shell ps -ef | grep keepalived
[rootlocalhost ~]# ps -ef | grep keepalived
root 865 1 0 23:36 ? 00:00:00 keepalived -D
root 869 865 0 23:36 ? 00:00:00 keepalived -D
root 870 865 0 23:36 ? 00:00:00 keepalived -D如果看到如上进程信息表示keepalived已经启动成功。下面用ip add命令查看vip绑定的情况如下图所示 从上图可以看出vip地址192.168.1.210绑定在MASTER192.168.1.201)的enp0s3网卡上。
5 测试故障转移
将MASTER上的keepalived停止查看vip是否会漂移到192.168.2.202上。
停止201的keepalived服务
shell service keepalived stop
shell ip addr12从上图可以看出vip已经成功从201漂移到了202。此时再将201的keepalived服务启动后由于201是MASTER所以会将202的VIP抢占过来。
启动201的keepalived服务
shell service keepalived start1结果VIP又回到了201如下图所示
3、非抢占模式
master从故障中恢复后不会抢占备份节点的vip
1 MASTER192.168.1.201
global_defs {router_id nginx_01 #标识本节点的名称通常为hostname
}vrrp_script chk_nginx {script /etc/keepalived/nginx_check.shinterval 2weight -20
}vrrp_instance VI_1 {state BACKUPinterface enp0s3virtual_router_id 51mcast_src_ip 192.168.1.201priority 100advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.210}track_script {chk_nginx # nginx存活状态检测脚本}
}2 BACKUP192.168.1.202
global_defs {router_id nginx_02
}vrrp_script chk_nginx {script /etc/keepalived/nginx_check.shinterval 2weight -20
}vrrp_instance VI_1 {state BACKUPinterface enp0s3virtual_router_id 51mcast_src_ip 192.168.1.202priority 90advert_int 1nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.1.210}track_script {chk_nginx}
}和非抢占模式的配置相比只改了两个地方 1 在vrrp_instance块下两个节点各增加了nopreempt指令表示不争抢vip 2 节点的state都为BACKUP 两个keepalived节点都启动后默认都是BACKUP状态双方在发送组播信息后会根据优先级来选举一个MASTER出来。由于两者都配置了nopreempt所以MASTER从故障中恢复后不会抢占vip。这样会避免VIP切换可能造成的服务延迟。 Linux搭建nginxkeepalived 高可用(主备双主模式)
the丶only于 2021-06-30 21:46:15 发布
一keepalived简介
反向代理及负载均衡参考
nginx反向代理与负载均衡 https://blog.csdn.net/weixin_52270081/article/details/118297655
当你了解会搭建 nginx 负载均衡后需要考虑nginx这台服务器的安全性啦如果只有一台这台 nginx 一出问题web 就会无法访问的情况所以为了应对这种情况就需要两台nginx做主备服务器。
nginxkeepalived如下图所示 Keepalived 是 Linux 下面实现 VRRP 备份路由的高可靠性运行件。基于 Keepalived 设计的服务模式能够真正做到主服务器和备份服务器故障时 IP 瞬间无缝交接。 VRRP 协议全称 Virtual Router Redundancy Protocol 即虚拟路由冗余协议。可以认为它是实现路由器高可用的容错协议即将 N 台提供相同功能的路由器组成一个路由器组 (RouterGroup)这个组里面有一个 master 和多个 backup但在外界看来就像一台一样构成虚拟路由器拥有一个虚拟 IPvip也就是路由器所在局域网内其他机器的默认路由占有这个 IP 的 master 实际负责 ARP 相应和转发 IP 数据包组中的其它路由器作为备份的角色处于待命状态。master 会发组播消息当 backup 在超时时间内收不到 vrrp 包时就认为 master 宕掉了这时就需要根据 VRRP 的优先级来选举一个 backup 当 master保证路由器的高可用。 总结两台主备机器通过keepalived虚拟一个IP也就是VIP不是贵宾的意思是Virtual IP的意思。VIP开始为主机器所有备份机为空闲状态同时在两台keepalived之间通信相当于有一条心跳线通过心跳线互相通信只要主机器监控通过脚本到ngin服务停止则主机器自己停止keepalived将VIP交给备份机器处理web请求直至主机器再次恢复正常将VIP返还给主机器。
高可用有2种方式 1、Nginxkeepalived 主从配置 这种方案使用一个vip地址前端使用2台机器一台做主一台做备但同时只有一台机器工作另一台备份机器在主机器不出现故障的时候永远处于浪费状态对于服务器不多的网站该方案不经济实惠。
2、Nginxkeepalived 双主配置 这种方案使用两个vip地址前端使用2台机器互为主备同时有两台机器工作当其中一台机器出现故障两台机器的请求转移到一台机器负担非常适合于当前架构环境。
如下图所示 模拟搭建环境4台主机系统centos7注本人搭建的环境为双网卡模式192.168.200.0/24外网172.16.2.0/内网。所以本文配置的VIP均为外网IP。
nginx1172.16.2.50已安装nginx外网ip192.168.200.150nginx2172.16.2.51已安装nginx外网ip192.168.200.151web1172.16.2.20已安装nginxphpweb1172.16.2.21已安装nginxphp 目的配置nginx主备模拟其中一台服务终止后另外一台可正常访问到web服务器当那台恢复正常时两台恢复同时处理请求。
二在nginx服务安装keepalived软件
keepalived官网https://www.keepalived.org/
由于yum安装的版本实在太旧了所以自己下载下来编译安装不嫌弃旧版本的直接yum -y install keepalived一步到位即可。
1安装基础依赖包有的话就没必要安装了 主要是gcc openssl-devel libnl libnl-devel libnfnetlink-devel net-tools vim这几个包。
yum install -y gcc openssl-devel libnl libnl-devel libnfnetlink-devel net-tools vim2在官网下载最新版 目前最新版为2.2.2
wget https://www.keepalived.org/software/keepalived-2.2.2.tar.gz3: 解压到指定目录并重命名 解压移动到/usr/local目录重命名keepalived文件夹
tar -zxvf keepalived-2.2.2.tar.gz
mv keepalived-2.2.2 /usr/local/keepalived4进入目录编译安装
cd /usr/local/keepalived/
./configure
make make install5复制相关文件到系统中 之所以不喜欢编译安装就是这一步由于版本不同移少移错都可能导致启动失败
确定好自己的文件路径复制到系统相关文件夹即可。
mkdir /etc/keepalived
cp /usr/local/keepalived/keepalived/etc/init.d/keepalived /etc/init.d/
cp /usr/local/keepalived/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/
cp /usr/local/keepalived/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
cp /usr/local/sbin/keepalived /usr/sbin/6启动测试
/etc/init.d/keepalived start提示正确或者OK则表示安装成功 但是这时用/etc/init.d/keepalived status 或者 systemctl status keepalived.service命令查看服务是关闭状态并没有启动起来。 那是因为我们配置文件并没有配置好无论怎么start都起不来的。
三keepalived配置文件基础配置
此配置为主备模式先理解主备后在配置双主模式更简单。
配置文件位置/etc/keepalived/keepalived.conf 打开也许会很懵其实用不了太多模块先备份原配置然后删掉其他留下最基础的配置配置全部参数说明参考本文最后。
cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
vim /etc/keepalived/keepalived.conf基础三个模块global_defs全局模块vrrp_instance配置vip模块vrrp_script 脚本模块用来检测nginx服务。 注vrrp_script定义脚本后在vrrp_instance模块必须加上track_script 参数。我就入了这个坑导致脚本不生效。
global_defs模块参数
notification_email keepalived在发生诸如切换操作时需要发送email通知地址后面的 smtp_server 相比也都知道是邮件服务器地址。也可以通过其它方式报警毕竟邮件不是实时通知的。router_id 机器标识通常可设为hostname。故障发生时邮件通知会用到。
vrrp_instance模块参数
state 指定instance(Initial)的初始状态 MASTER 或者BACKUP不是唯一性的跟后面的优先级priority参数有关。interface 实例绑定的网卡因为在配置虚拟IP的时候必须是在已有的网卡上添加的(注意自己系统我的默认是ens33,有的是eth0)mcast_src_ip 发送多播数据包时的源IP地址这里注意了这里实际上就是在那个地址上发送VRRP通告这个非常重要一定要选择稳定的网卡端口来发送这里相当于heartbeat的心跳端口如果没有设置那么就用默认的绑定的网卡的IP也就是interface指定的IP地址virtual_router_id 这里设置VRID这里非常重要相同的VRID为一个组他将决定多播的MAC地址priority 设置本节点的优先级优先级高的为master1-255advert_int 检查间隔默认为1秒。这就是VRRP的定时器MASTER每隔这样一个时间间隔就会发送一个advertisement报文以通知组内其他路由器自己工作正常authentication 定义认证方式和密码主从必须一样virtual_ipaddress 这里设置的就是VIP也就是虚拟IP地址他随着state的变化而增加删除当state为master的时候就添加当state为backup的时候删除这里主要是有优先级来决定的和state设置的值没有多大关系这里可以设置多个IP地址track_script 引用VRRP脚本即在 vrrp_script 部分指定的名字。定期运行它们来改变优先级并最终引发主备切换。
vrrp_script模块参数 告诉 keepalived 在什么情况下切换所以尤为重要。可以有多个 vrrp_script
script 自己写的检测脚本。也可以是一行命令如killall -0 nginxinterval 2 每2s检测一次weight -5 检测失败脚本返回非0则优先级 -5fall 2 检测连续 2 次失败才算确定是真失败。会用weight减少优先级1-255之间rise 1 检测 1 次成功就算成功。但不修改优先级
在主nginx服务器172.16.2.50上 VIP设置为192.168.200.200配置如下
global_defs {router_id Nginx_01
}
vrrp_script check_nginx {script /etc/keepalived/check_nginx.shinterval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.200}track_script {check_nginx}
}
在备用nginx服务器172.16.2.51上配置一样就三点不同一点必须相同1. router_id 不同 2. state BACKUP不同 3. priority不同。 4.virtual_router_id 必相同。 配置如下
global_defs {router_id Nginx_02
}
vrrp_script check_nginx {script /etc/keepalived/check_nginx.shinterval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.200}track_script {check_nginx}
}
四nginx脚本与配置
由于待会测试所以第一个简单脚本就可以了只要判断nginx进程没有数值则停止keepalived服务。测试脚本如下
#! /bin/bash
pidof nginx
if [ $? -ne 0 ];then
/etc/init.d/keepalived stop
fi
如果测试完可以加个尝试启动nginx如果尝试失败两次就停止keepalived服务。脚本如下
#!/bin/bash
counter$(ps -C nginx --no-heading|wc -l)
if [ ${counter} 0 ]; then/usr/local/bin/nginxsleep 2counter$(ps -C nginx --no-heading|wc -l)if [ ${counter} 0 ]; then/etc/init.d/keepalived stopfi
fi
nginx服务器中的nginx配置只需要把server_name 改成VIP的IP即可其他无需更改负载均衡时也只要访问这个VIP地址即可。
upstream phpserver1 {server 172.16.2.20:9091;server 172.16.2.21:9092;
}server {listen 80;server_name 192.168.200.200;location / {proxy_pass http://phpserver1;index index.html index.htm;}}
五keepalived启动与测试
1启动nginx服务在启动keepalived服务
依次在两台nginx服务器启动
systemctl restart nginx.service
syetemctl start keepalived此时在用syetemctl status keepalived查看服务已经正常启动 分别在nginx主备两台用ip addr查看IP地址主nginx1的网卡此时已经自动获取VIP备nginx2则没有处于空闲状态 在浏览器访问VIP192.168.200.200也正常可依次负载均衡至两台web服务器的测试页面如图展示
2模拟主nginx1的nginx服务停止
systemctl stop nginx.service再次在两台nginx服务器上ip addr查看ip地址主nginx1上此时已经没有VIP192.168.200.200了在备nginx2此时已经得到VIP了浏览器访问VIP依然正常可得到web1和web2的测试网页
3测试再次启动主nginx服务器nginx服务和keepalived服务
systemctl start nginx.service
syetemctl start keepalived最后在主nginx1上启动nginx后在启动keepalived后nginx重新抢回VIP一切恢复正常。备nginx2恢复空闲状态。可自行测试查看结果。
六keepalived双主模式
1keepalived配置
当了解主备模式后双主模式就容易配置多了。只需要在每台keepalived配置文件加上一个vrrp_instance命名vrrp_instance VI_2即可更改几个参数设置另一个VIP192.168.200.210
nginx1state BACKUP priority 100 virtual_router_id 52
nginx2state MASTER priority 150 virtual_router_id 52nginx1的配置如下
global_defs {router_id Nginx_01
}
vrrp_script check_nginx {script /etc/keepalived/check_nginx.shinterval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state MASTERinterface ens33virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.200}track_script {check_nginx}
}
vrrp_instance VI_2 {state BACKUPinterface ens33virtual_router_id 52priority 100advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.210}track_script {check_nginx}
}
nginx2配置如下
global_defs {router_id Nginx_02
}
vrrp_script check_nginx {script /etc/keepalived/check_nginx.shinterval 2weight -5fall 3rise 2
}
vrrp_instance VI_1 {state BACKUPinterface ens33virtual_router_id 51priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.200}track_script {check_nginx}}vrrp_instance VI_2 {state MASTERinterface ens33virtual_router_id 52priority 150advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.200.210}track_script {check_nginx}
}同样在nginx做负载均衡时需要在nginx的配置文件中server_name加上这个192.168.200.210这个VIP2的地址配置如下
upstream phpserver1 {server 172.16.2.20:9091;server 172.16.2.21:9092;
}server {listen 80;server_name 192.168.200.200;server_name 192.168.200.210;location / {proxy_pass http://phpserver1;index index.html index.htm;}}
2启动测试查看ip
依次重启两台的keepalived服务查看IP最后看到的为以下结果
在浏览器分别访问192.168.200.200和192.168.200.210都可以负载均衡至web1和web2。 双主模式配置完成
七keepalived配置文件详解参考
#全局配置
global_defs {# 邮件通知信息notification_email {# 定义收件人acassenfirewall.loc}# 定义发件人notification_email_from Alexandre.Cassenfirewall.loc# SMTP服务器地址smtp_server 192.168.200.1smtp_connect_timeout 30# 路由器标识一般不用改也可以写成每个主机自己的主机名router_id LVS_DEVEL# VRRP的ipv4和ipv6的广播地址配置了VIP的网卡向这个地址广播来宣告自己的配置信息下面是默认值vrrp_mcast_group4 224.0.0.18vrrp_mcast_group6 ff02::12
}# 定义用于实例执行的脚本内容比如可以在线降低优先级用于强制切换
vrrp_script SCRIPT_NAME {}# 一个vrrp_instance就是定义一个虚拟路由器的实例名称
vrrp_instance VI_1 {# 定义初始状态可以是MASTER或者BACKUPstate MASTER# 工作接口通告选举使用哪个接口进行interface ens33# 虚拟路由ID如果是一组虚拟路由就定义一个ID如果是多组就要定义多个而且这个虚拟# ID还是虚拟MAC最后一段地址的信息取值范围0-255virtual_router_id 51# 使用哪个虚拟MAC地址use_vmac XX:XX:XX:XX:XX# 监控本机上的哪个网卡网卡一旦故障则需要把VIP转移出去track_interface {eth0ens33}# 如果你上面定义了MASTER,这里的优先级就需要定义的比其他的高priority 100# 通告频率单位为秒advert_int 1# 通信认证机制这里是明文认证还有一种是加密认证authentication {auth_type PASSauth_pass 1111}# 设置虚拟VIP地址一般就设置一个在LVS中这个就是为LVS主机设置VIP的这样你就不用自己手动设置了virtual_ipaddress {# IP/掩码 dev 配置在哪个网卡192.168.200.16/24 dev eth1# IP/掩码 dev 配置在哪个网卡的哪个别名上192.168.200.17/24 dev label eth1:1}# 虚拟路由在需要的情况下可以设置lvs主机 数据包在哪个网卡进来从哪个网卡出去virtual_routes {192.168.110.0/24 dev eth2}# 工作模式nopreempt表示工作在非抢占模式默认是抢占模式 preemptnopreempt|preempt# 如果是抢占默认则可以设置等多久再抢占默认5分钟preempt delay 300# 追踪脚本通常用于去执行上面的vrrp_script定义的脚本内容track_script {}# 三个指令如果主机状态变成Master|Backup|Fault之后会去执行的通知脚本脚本要自己写notify_master notify_backup notify_fault
}# 定义LVS集群服务可以是IPPORT也可以是fwmark 数字也就是防火墙规则
# 所以通过这里就可以看出来keepalive天生就是为ipvs而设计的
virtual_server 10.10.10.2 1358 {delay_loop 6# 算法lb_algo rr|wrr|lc|wlc|lblc|sh|dh# LVS的模式lb_kind NAT|DR|TUN# 子网掩码这个掩码是VIP的掩码nat_mask 255.255.255.0# 持久连接超时时间persistence_timeout 50# 定义协议protocol TCP# 如果后端应用服务器都不可用就会定向到那个服务器上sorry_server 192.168.200.200 1358# 后端应用服务器 IP PORTreal_server 192.168.200.2 1358 {# 权重weight 1# MSIC_CHECK|SMTP_CHEKC|TCP_CHECK|SSL_GET|HTTP_GET这些都是# 针对应用服务器做健康检查的方法MISC_CHECK {}# 用于检查SMTP服务器的SMTP_CHEKC {}# 如果应用服务器不是WEB服务器就用TCP_CHECK检查TCP_CHECK {# 向哪一个端口检查如果不指定默认使用上面定义的端口connect_port PORT# 向哪一个IP检测如果不指定默认使用上面定义的IP地址bindto IP# 连接超时时间connect_timeout 3}# 如果对方是HTTPS服务器就用SSL_GET方法去检查里面配置的内容和HTTP_GET一样SSL_GET {}# 应用服务器UP或者DOWN就执行那个脚本notify_up 这里写的是路径如果脚本后有参数整体路径参数引起来notify_down /PATH/SCRIPTS.sh 参数# 使用HTTP_GET方法去检查HTTP_GET {# 检测URLurl {# 具体检测哪一个URLpath /testurl/test.jsp# 检测内容的哈希值digest 640205b7b0fc66c1ea91c463fac6334d# 除了检测哈希值还可以检测状态码比如HTTP的200 表示正常两种方法二选一即可status_code 200}url {path /testurl2/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}url {path /testurl3/test.jspdigest 640205b7b0fc66c1ea91c463fac6334d}# 向哪一个端口检查如果不指定默认使用上面定义的端口connect_port PORT# 向哪一个IP检测如果不指定默认使用上面定义的IP地址bindto IP# 连接超时时间connect_timeout 3# 尝试次数nb_get_retry 3# 每次尝试之间间隔几秒delay_before_retry 3}}real_server 192.168.200.3 1358 {weight 1HTTP_GET {url {path /testurl/test.jspdigest 640205b7b0fc66c1ea91c463fac6334c}url {path /testurl2/test.jspdigest 640205b7b0fc66c1ea91c463fac6334c}connect_timeout 3nb_get_retry 3delay_before_retry 3}}
}Nginx——Nginx反向代理
啊噢1231 已于 2022-09-15 16:55:51 修改
1、Nginx反向代理概述
正向代理代理的对象是客户端反向代理代理的是服务端这是两者最大的区别。
Nginx 既可以实现正向代理也可以实现反向代理。
1.1、Nginx正向代理 1、服务端的设置 log_format main client send requestclientIp$remote_addr serverIp$host;server {listen 80;server_name localhost;# 指定日志文件存放位置和格式access_log logs/access.log main;location / {root html;index index.html index.htm;}}2、使用客户端访问服务端打开日志查看结果
client send requestclientIp192.168.200.1 serverIp192.168.200.1333、代理服务器设置 server {listen 82;# 设置DNS的IP用来解析proxy_pass中的域名resolver 8.8.8.8;location / {proxy_pass http://$host$request_uri;}}4、查看代理服务器的 IP192.168.200.146和 Nginx 配置监听的端口82
5、在客户端配置代理服务器 6、设置完成后再次通过浏览器访问服务端
浏览器输入url192.168.200.133服务端日志client send request clientIp192.168.200.146 serverIp192.168.200.133通过对比上下两次的日志记录会发现虽然我们是客户端访问服务端但是如果使用了代理那么服务端能看到的只是代理发送过去的请求这样的话就是用Nginx实现了正向代理的设置。
但是Nginx正向代理在实际的应用中不是特别多。
1.2、Nginx反向代理
1.2.1、Nginx反向代理的配置语法
Nginx反向代理模块的指令是由ngx_http_proxy_module模块进行解析该模块在安装Nginx的时候已经自己加装到Nginx中了接下来介绍反向代理中的常用指令
proxy_passproxy_set_headerproxy_redirect
1、proxy_pass
该指令用来设置被代理服务器地址可以是主机名称、IP地址加端口号形式。
语法proxy_pass URL默认值——位置location
URL为要设置的被代理服务器地址包含传输协议http,https://、主机名称或IP地址加端口号、URI等要素。
举例
proxy_pass http://www.baidu.com;
proxy_pass http://192.168.200.146/;在编写proxy_pass的时候后面的值要不要加 /
server {listen 80;server_name localhost;location / {# proxy_pass http://192.168.200.146;proxy_pass http://192.168.200.146/;}
}
当客户端访问 http://localhost/index.html效果是一样的
server {listen 80;server_name localhost;location /server {# proxy_pass http://192.168.200.146;proxy_pass http://192.168.200.146/;}
}当客户端访问 http://localhost/server/index.html这个时候第一个proxy_pass就变成了http://localhost/server/index.html第二个proxy_pass就变成了http://localhost/index.html效果就不一样了。2、proxy_set_header
该指令可以更改Nginx服务器接收到的客户端请求的请求头信息然后将新的请求头发送给代理的服务器。
语法proxy_set_header field value;默认值proxy_set_header Host $proxy_host;proxy_set_header Connection close;位置http、server、location
需要注意的是如果想要看到结果必须在被代理的服务器上来获取添加的头信息。
被代理服务器192.168.200.146
server {listen 8080;server_name localhost;location / {default_type text/plain;return 200 $http_username;}
}
代理服务器192.168.200.133
server {listen 8080;server_name localhost;location /server {proxy_pass http://192.168.200.146:8080/;# 添加请求头信息username:TOMproxy_set_header username TOM;}
}3、proxy_redirect
该指令用来重置头信息中的“Location”和“Refresh”的值。
语法proxy_redirect redirect replacement;proxy_redirect default;proxy_redirect off;默认值proxy_redirect default;位置http、server、location
为什么要用该指令
# 服务端192.168.200.146
server {listen 8081;server_name localhost;if (!-f $request_filename) {return 302 http://192.168.200.146;}
}
# 代理服务端
server {listen 8080;server_name localhost;location / {proxy_pass http://192.168.200.146:8081/;proxy_redirect http://192.168.200.146 http://192.168.200.133;}
}
server {listen 80;server_name localhost;location / {proxy_pass http://192.168.200.146:8081/;}
}该指令的几组选项
proxy_redirect redirect replacement;redirect目标location的值replacement要替换的值
proxy_redirect default;将location块的uri变量作为replacement将proxy_pass变量作为redirect进行替换
proxy_redirect off;关闭proxy_redirect的功能1.2.2、Nginx反向代理实战 服务器1,2,3存在两种情况 第一种情况三台服务器的内容不一样 如果服务器1,2,3的内容不一样那我们可以根据用户请求来分发到不同的服务器。
# 代理服务器# 服务器1server {listen 9001;server_name localhost;default_type text/html;location / {return 200 h1server:9001/h1;}}# 服务器2server {listen 9002;server_name localhost;default_type text/html;location / {return 200 h1server:9002/h1;}}# 服务器3server {listen 9003;server_name localhost;default_type text/html;location / {return 200 h1server:9003/h1;}}# 代理服务器server {listen 8080;server_name localhost;location /server1 {proxy_pass http://localhost:9001/;}location /server2 {proxy_pass http://localhost:9002/;}location /server3 {proxy_pass http://localhost:9003/;}}第二种情况三台服务器的内容一样。
2、Nginx的安全控制
关于web服务器的安全是比较打的一个话题里面所涉及的内容很多Nginx反向代理是如何来提升web服务器的安全呢
安全隔离
什么是安全隔离
通过代理分开了客户端到应用程序服务器端的连接实现了安全措施。在反向代理之前设置防火墙仅留一个入口供代理服务器访问。
2.1、如何使用SSL对流量进行加密
翻译成熟悉的说法就是将我们常用的http请求转变成https请求那么这两个之间的区别简单来说两个都是http协议只不过https是身披SSL外壳的http。
HTTPS是一种通过计算机网络进行安全通信的传输协议它经由HTTP进行通信利用SSL/TLS建立全通信加密数据包确保数据的安全性。
SSLSecure Sockets Layer安全套接层。TLSTransport Layer Security传输层安全。
上述这两个是为网络通信安全及数据完整性的一种安全协议TLS和SSL在传输层和应用层对网络连接进行加密。
总结来说为什么要使用httpshttp协议是明文传输数据存在安全问题而http是加密传输相当于http ssl 并且可以防止流量劫持。
Nginx要想使用SSL需要满足一个条件即需要添加一个模块 --with–http_ssl_module而该模块在编译的过程中又需要OpenSSL的支持。
2.1.1、nginx添加SSL的支持
1、完成 --with-http_ssl_module模块的增量添加
将原有 /usr/local/nginx/sbin/nginx 进行备份
拷贝 nginx 之前的配置信息
在 nginx 的安装源码进行配置指定对应模块 ./configure --with-http_ssl_module
通过 make 模板进行编译
将 objs下面的 nginx 移动到 /usr/local/nginx/sbin下
在源码目录下执行 make upgrade 进行升级这个可以实现不停机添加新模块的功能
2.1.2、Nginx的SSL相关指令
因为刚才我们介绍过该模块的指令都是通过ngx_http_ssl_module模块来解析的。
1、ssl该指令用来在指定的服务器开启HTTPS可以使用 listen 443 ssl后面这种方式更通用些。
语法ssl on | off;默认值ssl off;位置http、server
server {listen 443 ssl;
}2、ssl_certificate为当前这个虚拟主机指定一个带有PEM格式证书的证书。
语法ssl_certificate file;默认值——位置http、server
3、ssl_certificate_key该指令用来指定PEM secret key文件的路径。
语法ssl_certificate_key file;默认值——位置http、server
4、ssl_session_cache该指令用来配置用于SSL会话的缓存。
语法sse_session_cache off | none | [builtin[:size]] [shared:name:size];默认值ssl_session_cache none;位置http、server
off禁用会话缓存客户端不得重复使用会话。none禁止使用会话缓存客户端可以重复使用但是并没有在缓存中存储会话参数。builtin内置OpenSSL缓存仅在一个工作进程中使用。shared所有工作进程之间共享缓存缓存的相关信息用name和size来指定。
5、ssl_session_timeout开启SSL会话功能后设置客户端能够反复使用储存在缓存中的会话参数时间。
语法ssl_session_timeout time;默认值ssl_session_timeout 5m;位置http、server
6、ssl_ciphers指出允许的密码密码指定为OpenSSL支持的格式。
语法ssl_ciphers ciphers;默认值ssl_ciphers HIGH:!aNULL:!MD5;位置http、server
可以使用openssl ciphers查看openssl支持的格式。
7、ssl_prefer_server_ciphers该指令指定是否服务器密码优先客户端密码。
语法ssl_prefer_server_cipher on | off;默认值ssl_prefer_server_ciphers off;位置http、server
2.1.3、生成证书
方式1使用阿里云/腾讯云等第三方服务进行购买方式2使用openssl生成证书。 先要确认当前系统是否有安装openssl openssl version 安装下面的命令进行生成
makedir /root/cert
cd /root/cert
openssl genrsa -des3 -out -server.key 1024
openssl req -new -key server.key -out server.csr
cp server.key server.key.org
openssl rsa -in server.key.org -out server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt2.1.4、开启SSL实例
3、Nginx反向代理系统调优
反向代理值Buffer和Cache。Buffer翻译过来是“缓冲”Cache翻译过来是“缓存”。
总结如下
相同点
两种方式都是用来提供 IO 吞吐效率都是用来提升 Nginx 代理的性能。 不同点
1、缓冲主要是用来解决不同设备之间数据传递不一致导致的性能低的问题缓冲中的数据一旦此次操作完成后就可以删除。
2、缓存主要是备份将被代理服务器的数据缓存一份到代理服务器这样的话客户端再次获取相同数据的时候就只需要从代理服务器上获取效率较高缓存中的数据可以重复使用只有满足特定条件才会删除。
3.1、Proxy Buffer
3.1.1、Proxy Buffer相关指令
1、proxy_buffering该指令用来开启或者关闭代理服务器的缓冲区。
语法proxy_buffering on | off;默认值proxy_buffering on;位置http、server、location
2、proxy_buffers该指令用来指定单个连接从代理服务器读取响应的缓存区的个数和大小。
语法proxy_buffers number size;默认值proxy_buffers 8 4k | 8k; 与系统平台有关位置http、server、location
number缓冲区的个数。size每个缓冲区的大小缓冲区的总大小就是number * size 。
3、proxy_buffer_size该指令用来设置从被代理服务器获取的第一部分响应数据的大小。保持与proxy_buffers中的size一致即可当然也可以更小。
语法proxy_buffer_size size;默认值proxy_busy_buffers_size 8k | 16k;位置http、server、location
4、proxy_busy_buffers_size该指令用来限制同时处于BUSY状态的缓冲总大小。
语法proxy_busy_buffers_size size;默认值proxy_busy_buffers_size 8k | 16k;位置http、server、location
5、proxy_temp_path当缓冲区存满后仍未被Nginx服务器完全接收响应数据就会被临时存放在磁盘文件上该指令设置文件路径。
语法proxy_temp_path path;默认值proxy_temp_path proxy_temp;位置http、server、location
注意path最多设置三层。
6、proxy_temp_file_write_size该指令用来设置磁盘上缓冲文件的大小。
语法proxy_temp_file_write_size size;默认值proxy_temp_file_write_size 8k | 16k;位置http、server、location
通用网站的配置
proxy_buffering on;
proxy_buffer_size 4 32k;
proxy_buffer_buffers_size 64k;
proxy_temp_file_write_size 64k;根据项目的具体内容进行响应的调节。 via: KeepalivedNginx实现高可用HA_nginxkeepalived的ha 非抢占模式配置-CSDN博客 xyang0917 于 2016-09-17 00:24:15 发布 https://blog.csdn.net/xyang81/article/details/52556886 Linux搭建nginxkeepalived 高可用(主备双主模式)_nginxkeepalived需要几台机器-CSDN博客 the丶only于 2021-06-30 21:46:15 发布 https://blog.csdn.net/weixin_52270081/article/details/118341576 Nginx——Nginx反向代理_nginx反向代理模块-CSDN博客 啊噢1231 已于 2022-09-15 16:55:51 修改 https://blog.csdn.net/weixin_44623055/article/details/124705154