1. Nginx相关概念
代理服务器一般分为正向代理(通常直接称为代理服务器)和反向代理。
通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服
务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的。
而反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返
回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
1.1. 反向代理(服务器端的代理)
反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果
返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
1.1. 正向代理(客户端的代理)
正向代理是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理
向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
3.1. 配置反向代理(虚拟主机)
Nginx配置nginx.conf(/usr/local/nginx/conf/nginx.conf)(功能2:作为集群构建者拥有反向代理功能)
server {
listen 8888;
server_name shizhan2; #nginx所在服务器的主机名
#反向代理的配置
location / { #拦截所有请求
root html;
proxy_pass http://192.168.232.200:8080; #这里是代理走向的目标服务器:tomcat
}
}
nginx的反向代理功能的实现:通过访问Nginx服务允许请求跳转到其他服务器
启动201的Nginx服务,200的Tomcat服务,然后访问代理服务器地址:http://192.168.232.201,然后刷新:用服务名访问,需要配置hosts
即就是:
3.2. 配置动静分离
如果请求jsp或者servlet,需要进行业务逻辑的处理,将静态的放在前端,动态的放在后端(功能1:作为前端服务器拥有响应静态页面功能)
#动态资源 index.jsp location ~ .*.(jsp|do|action)$ { proxy_pass http://tomcat-01:8080; } #静态资源 location ~ .*.(html|js|css|gif|jpg|jpeg|png)$ { expires 3d; }
location配置规则
3.2. 配置负载均衡
负载均衡,英文名称为Load Balance,是指建立在现有网络结构之上,并提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据
处理能力、提高网络的灵活性和可用性。其原理就是数据流量分摊到多个服务器上执行,减轻每台服务器的压力,多台服务器共同完成工作任务,从而提高了数据的吞吐量
在http这个节下面配置一个叫upstream的,后面的名字可以随意取,但是要和location下的proxy_pass http://后的保持一致
http {
是在http里面的, 已有http, 不是在server里,在server外面 upstream tomcats { server 192.168.232.200:8080 weight=1;#weight表示权重 server 192.168.232.205:8080 weight=1; } #卸载server里
server{
listen 8888; location ~ .*.(jsp|do|action) { ~:表示大小写敏感 proxy_pass http://tomcats; #tomcats是后面的tomcat服务器组的逻辑组号(可以理解为后台一组服务器的名称)和 upstream后面一样 }
}
}
2. 利用keepalived实现高可靠配置(HA)
2.1. 高可靠概念
HA(High Available):高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。
2.2. 高可靠软件keepalived
keepalive是一款可以实现高可靠的软件,通常部署在2台服务器上,分为一主一备。Keepalived可以对本机上的进程进行检测,一旦Master检测出某个进程出
现问题,将自己切换成Backup状态,然后通知另外一个节点切换成Master状态。
2.3. keepalived安装
下载keepalived官网:http://keepalived.org
将keepalived解压到/usr/local/src目录下:tar -zxvf keepalived-1.2.19.tar.gz -C /usr/local/src
进入到/usr/local/src/keepalived-1.2.19目录:cd /usr/local/src/keepalived-1.2.19
开始configure(检查安装环境,并指定将来要安装的路径):./configure --prefix=/usr/local/keepalived
#编译并安装:make && make install
2.4. 将keepalived添加到系统服务中
拷贝执行文件:cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
将init.d文件拷贝到etc下,加入开机启动项:cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/keepalived
将keepalived文件拷贝到etc下:cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
创建keepalived文件夹:mkdir -p /etc/keepalived
将keepalived配置文件拷贝到etc下:cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf
添加可执行权限:chmod +x /etc/init.d/keepalived
添加keepalived到开机启动:chkconfig --add keepalived chkconfig keepalived on
2.4. 配置keepalived虚拟IP
1.基本服务器宕机的主从切换配置
机器IP |
安装软件 |
角色 |
虚拟ip |
描述 |
192.168.232.201 |
Nginx、keepalived |
Nginx主机 |
192.168.232.203 |
反向代理到tomcat1和tomcat2 |
192.168.232.205 |
Nginx、keepalived |
Nginx备机 |
主机挂了切换虚拟ip 192.168.232.203 |
反向代理到tomcat1和tomcat2 |
192.168.232.200 |
Tomcat |
Tomcat1 |
无 |
|
192.168.232.204 |
Tomcat |
Tomcat2 |
无 |
两台nginx服务器,分别安装keepalived,配置/etc/keepalived/keepalived.conf
主从配置:
主nginx修改配置文件: /etc/keepalived/keepalived.conf
#MASTER节点
#全局配置
global_defs {
notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个
XXX@XXX.com
}
notification_email_from Alexandre.Cassen@firewall.loc #指定发件人
smtp_server 192.168.200.1 #指定smtp服务器地址
smtp_connect_timeout 30 #指定smtp连接超时时间
router_id LVS_DEVEL #运行keepalived机器的一个标识
} vrrp_instance VI_1 { state MASTER #指定A节点为主节点 备分机上设置为BACKUP即可 interface eth0 #设置实例绑定的网卡 virtual_router_id 51 #VRRP组名,两个节点的设置必须一样,以指明各个节点属于同一VRRP组(同一实例下virtual_router_id必须相同) priority 100 #主节点的优先级(1-254之间),备用节点必须比主节点优先级低 advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置验证信息,两个节点必须一致 auth_type PASS #主从服务器验证方式 auth_pass 1111 } virtual_ipaddress { #指定虚拟IP, 两个节点设置必须一样 192.168.232.203/24 #如果两个nginx的ip分别是192.168.232.201,,...205,则此处的虚拟ip跟它俩同一个网段即可,24子网掩码(255.255.255.0),可以多个虚拟IP,换行即可 } }
备nginx
修改备nginx下/etc/keepalived/keepalived.conf文件
配置备nginx时需要注意:需要修改state为BACKUP , priority比MASTER低,virtual_router_id和master的值一致
#BACKUP节点
global_defs { } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 51 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.232.203/24 } }
#分别启动两台机器上的keepalived:
service keepalived start
用ip addr查看主从:
主机:
备机:
此时如果主机宕机则备机会顶替主机获得虚拟ip
首先将主机的keepalived关闭:
再次查看主机:ip addr
备机:
至此,基本服务器宕机的主从切换配置完毕
访问虚拟ip是不是还能轮询访问tomcat
2.基于nginx进程死掉的主从切换配置
keepalived是通过检测keepalived进程是否存在判断服务器是否宕机,如果keepalived进程在但是nginx进程不在了那么keepalived是不会做主备切换,所以我们需要写
个脚本来监控nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉。
在主nginx上需要编写nginx进程检测脚本(check_nginx.sh),判断nginx进程是否存在,如果nginx不存在就将keepalived进程杀掉,check_nginx.sh内容如下:
#!/bin/bash # 如果进程中没有nginx则将keepalived进程kill掉 A=`ps -C nginx --no-header |wc -l` ## 查看是否有 nginx进程 把值赋给变量A if [ $A -eq 0 ];then ## 如果没有进程值得为 零 service keepalived stop ## 则结束 keepalived 进程 fi
将check_nginx.sh拷贝至/etc/keepalived下,
注意修改/etc/keepalived/check_nginx.sh的可执行权限
修改主nginx的keepalived.conf,添加脚本定义检测:
注意下边红色标识地方:
#全局配置 global_defs { notification_email { #指定keepalived在发生切换时需要发送email到的对象,一行一个 XXX@XXX.com } notification_email_from miaoruntu@itcast.cn #指定发件人 #smtp_server XXX.smtp.com #指定smtp服务器地址 #smtp_connect_timeout 30 #指定smtp连接超时时间 router_id LVS_DEVEL #运行keepalived机器的一个标识 } vrrp_script check_nginx { script "/etc/keepalived/check_nginx.sh" ##监控脚本 interval 2 ##时间间隔,2秒 weight 2 ##权重 } vrrp_instance VI_1 { state MASTER #标示状态为MASTER 备份机为BACKUP interface eth0 #设置实例绑定的网卡 virtual_router_id 51 #同一实例下virtual_router_id必须相同 priority 100 #MASTER权重要高于BACKUP 比如BACKUP为99 advert_int 1 #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒 authentication { #设置认证 auth_type PASS #主从服务器验证方式 auth_pass 8888 } track_script { check_nginx #监控脚本 } virtual_ipaddress { #设置vip 192.168.101.100 #可以多个虚拟IP,换行即可 } }
修改后重启keepalived
2.5. 配置keepalived对后端服务器心跳检查(健康检查模块)
原理:Keepalived并不跟nginx耦合,它俩完全不是一家人但是keepalived提供一个机制:让用户自定义一个shell脚本去检测用户自己的程序,返回状态给keepalived就可以了
#MASTER节点
global_defs { } vrrp_script chk_health { script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" interval 1 #每隔1秒执行上述的脚本,去检查用户的程序ngnix weight -2 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 1 priority 100 advert_int 2 authentication { auth_type PASS auth_pass 1111 } track_script { chk_health } virtual_ipaddress { 10.0.0.10/24 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" }
#添加切换通知脚本:vi /usr/local/keepalived/sbin/notify.sh
#!/bin/bash case "$1" in master) /usr/local/nginx/sbin/nginx exit 0 ;; backup) /usr/local/nginx/sbin/nginx -s stop /usr/local/nginx/sbin/nginx exit 0 ;; fault) /usr/local/nginx/sbin/nginx -s stop exit 0 ;; *) echo 'Usage: notify.sh {master|backup|fault}' exit 1 ;; esac
#添加执行权限:chmod +x /usr/local/keepalived/sbin/notify.sh
global_defs { } vrrp_script chk_health { script "[[ `ps -ef | grep nginx | grep -v grep | wc -l` -ge 2 ]] && exit 0 || exit 1" interval 1 weight -2 } vrrp_instance VI_1 { state BACKUP interface eth0 virtual_router_id 1 priority 99 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_health } virtual_ipaddress { 10.0.0.10/24 } notify_master "/usr/local/keepalived/sbin/notify.sh master" notify_backup "/usr/local/keepalived/sbin/notify.sh backup" notify_fault "/usr/local/keepalived/sbin/notify.sh fault" }
#在第二台机器上添加notify.sh脚本
#分别在两台机器上启动keepalived
service keepalived start
chkconfig keepalived on