https配置、高可用、平滑升级

 

https配置

nginx的ssl模块安装
使用命令查看安装nginx时是否安装ssl模块
/usr/local/nginx/sbin/nginx -V
如果有 --with-http_ssl_module配置,则证明nginx已经支持https。如果不存在该模块,则详见Nginx动态添加模块 平滑升级。
ssl证书生成
1. 检测openssl是否安装,详细安装详见:https://jingyan.baidu.com/article/c74d6000cf991d0f6a595de6.html
2. 创建服务器私钥,命令会让你输入一个口令
openssl genrsa -des3 -out server.key 1024
3. 创建签名请求的证书(CSR)
openssl req -new -key server.key -out server.csr
4. 在加载SSL支持的Nginx并使用上述私钥时除去必须的口令
openssl rsa -in server.key -out server_nopass.key
5. 最后标记证书使用上述私钥和CSR
openssl x509 -req -days 365 -in server.csr -signkey server_nopass.key -out server.crt
通过上面的命令,生成四个文件,其中server.crt、server_nopass.key是需要的证书和私钥
nginx.conf配置
ssl on; # 开启ssl
ssl_certificate
/usr/local/nginx/cert/server.crt; #证书 ssl_certificate_key /usr/local/nginx/cert/server_nopass.key;#私钥

 

# 轮训
upstream upstream{
  server 192.168.110.102:8081;
  server 192.168.110.102:8082;
}
server {
  listen 81; # 支持HTTP
  listen 443 ssl; # 添加HTTPS支持
  server_name 127.0.0.1;
  #SSL配置
  ssl_certificate /usr/local/nginx/cert/server.crt; # 配置证书
  ssl_certificate_key /usr/local/nginx/cert/server_nopass.key; # 配置证书
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 配置SSL协议版本
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; # 配置SSL加密算法
  ssl_prefer_server_ciphers on; # 优先采取服务器算法
  ssl_session_cache shared:SSL:10m; # 配置共享会话缓存大小
  ssl_session_timeout 10m; # 配置会话超时时间
  location /upstream {
    proxy_pass http://upstream/;
  }
}

 

 

nginx高可用
高可靠概念HA(High Available):高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。
keepalive是一款可以实现高可靠的软件,通常部署在2台服务器上,分为一主一备。keepalived会虚拟出一个vip地址,用户访问这个vip地址,Keepalived可以对本机上的进程进行检测,一旦Master检测出某个进程出现问题,将自己切换成Backup状态,然后通知另外一个节点切换成Master状态,这样就保证了系统的高可用。
keepalived安装
 
  现有两台机器安装了nginx分别为:192.168.110.102、192.168.110.103,需要保证系统的高可用,则在两台机器安装keepalive
 
安装192.168.110.103
1. 依赖安装
yum install -y ca-certificates # 如果安全连接拒接则安装 
yum -y install openssl-devel # 安装OpenSSL依赖
yum -y install libnl libnl-devel # 安装支持ipv6
yum install -y libnfnetlink-devel
2. 创建 /usr/local/tool文件夹
mkdir /usr/local/tool/
3. 将文件上传到该文件夹下后下载,官网地址为:https://keepalived.org/download.html
wget https://keepalived.org/software/keepalived-2.0.20.tar.gz
4. 解压文件
tar -zxvf keepalived-2.0.20.tar.gz
5. 进入keepalived-2.0.20文件夹下
cd keepalived-2.0.20
6. 检查安装环境,并指定将来要安装的路径
/configure --prefix=/etc/keepalived --sysconf=/etc
7. 编译并安装
make && make install
8. keepalived.conf配置文件配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived 
global_defs {
  router_id LVS_1
}
vrrp_instance VI_1 {
  state MASTER
  interface eth0 #系统网卡
  virtual_router_id 51 #主备两机器一致
  priority 100 #值大的机器,胜出
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  track_script {
    chk_http_port #(调用检测脚本)
  }
  virtual_ipaddress { #可虚拟多个ip
    192.168.110.200
  }
}
9. 启动keepalived
/etc/keepalived/sbin/keepalived
10. 查看是否启动完成
ps -ef |grep keepalived
11. 查看启动日志
tail -f /var/log/messages
安装192.168.110.104
1. 按照192.168.110.103的1到7进行安装
2. keepalived.conf配置文件配置
vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived 
  global_defs {
    router_id LVS_2
  }
  vrrp_instance VI_1 {
  state BACKUP
  interface eth0
  virtual_router_id 51
  priority 50
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.244.200
  }
}
3. 按照192.168.110.102的9到11步启动并查看日志信息
 
这样keepalived就搭建完成了,下面我们访问一下,访问http://192.168.110.200/
访问VIP地址http://192.168.110.200/,访问到了102这台master的nginx,当将102上的keepalived关闭时,再一次访问。

当102的keepalived被关闭时,自动切换到了103上的nginx上。
 
在主服务器上添加检测脚本
当主服务器的keepalived启动,但nginx已经停止运行了,keepalived不会自动关闭或指定到备用服务器上,这就需要我们添加检测脚本
1. 创建可执行文件,添加完成后,为chk_nginx_pid.sh 文件授权,便于脚本获得执行权限
/etc/keepalived/sbin/chk_nginx_pid.sh
2. 编写检测脚本
#!/bin/bash 
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then
  /usr/local/nginx/sbin/nginx #重启nginx
  if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then #nginx重启失败,则停掉 keepalived服务,进行VIP转移
    killall keepalived #杀掉,vip就漫游到另一台机器
  fi
fi
3. 修改keepalived脚本,添加nginx检测脚本
! Configuration File for keepalived 
global_defs {
  router_id LVS_1
}
vrrp_script chk_http_port {
  script "/data/program/keepalived/sbin/chk_nginx_pid.sh" #心跳执行的脚本
  interval 2 #(检测脚本执行的间隔,单位是秒)
  weight 2
}
vrrp_instance VI_1 {
  state MASTER
  interface ens33 #系统网卡
  virtual_router_id 51 #主备两机器一致
  priority 100 #值大的机器,胜出
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  track_script {
    chk_http_port #(调用检测脚本)
  }
  virtual_ipaddress { #可虚拟多个ip
    192.168.110.200
  }
}
keepalived抢占模式和非抢占模式
1. 默认配置为抢占式
如果master挂掉,则跳转到backup,如果master重新启动,则重新指向master
2. 非抢占模式
非抢占模式所有节点都为backup,按照配置的优先级来决定哪个是master。如果其中一个挂掉,则另一个变成master。
#Master 
  vrrp_instance VI_1 {
    state BACKUP
    priority 150
    nopreempt #非抢占模式
    .
    .
    .
  }
#Backup
  vrrp_instance VI_1 {
    state BACKUP
    priority 100
    nopreempt #非抢占模式
    .
    .
    .
  }
keepalived配置
1. keepalived主
! Configuration File for keepalived
global_defs {
  router_id LVS_1
}
vrrp_script chk_http_port {
  script "/data/program/keepalived/sbin/chk_nginx_pid.sh" #心跳执行的脚本
  interval 2 #(检测脚本执行的间隔,单位是秒)
  weight 2
}
vrrp_instance VI_1 {
  state MASTER
  interface ens33 #系统网卡
  virtual_router_id 51 #主备两机器一致
  priority 100 #值大的机器,胜出
  advert_int 1
  authentication {
    auth_type PASS
    auth_pass 1111
  }
  track_script {
    chk_http_port #(调用检测脚本)
  }
  virtual_ipaddress { #可虚拟多个ip
    192.168.110.200
  }
}
2. keepalived备
! Configuration File for keepalived
global_defs {
  router_id LVS_2
}
vrrp_instance VI_1 {
  state BACKUP
  interface ens33
  virtual_router_id 51
  priority 50
  advert_int 1
  authentication {
  auth_type PASS
    auth_pass 1111
  }
  virtual_ipaddress {
    192.168.244.200
  }
}
3. 配置文件解析
! Configuration File for keepalived
 
global_defs {
  notification_email {
    [email protected]
    [email protected]
    [email protected] #邮件报警,可以不设置,后期nagios统一监控。
  }
  notification_email_from [email protected]
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。
  vrrp_skip_check_adv_addr
  vrrp_strict
  vrrp_garp_interval 0
  vrrp_gna_interval 0
}
++++++++++++++++我是分隔符++++++++++++++++++++++
#VRRP实例定义块
 
vrrp_instance VI_1 {
  state MASTER #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
  interface eth0
  lvs_sync_daemon_inteface eth0 #这个默认没有,相当于心跳线接口,DR模式用的和上面的接口一样,也可以用机器上的其他网卡eth1,用来防止脑裂。
  virtual_router_id 51 #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。
  priority 100 #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
  advert_int 1 #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
  authentication {
    auth_type PASS #验证authentication。包含验证类型和验证密码。类型主要有PASS、AH 两种,通常使用的类型为PASS, 27 auth_pass 1111 据说AH 使用时有问题。验证密码为明文,同一vrrp 实例MASTER 与BACKUP 使用相同的密码才能正常通信。
  }
  virtual_ipaddress { #虚拟ip地址,可以有多个地址,每个地址占一行,不需要子网掩码,同时这个ip 必须与我们在lvs 客户端设定的vip 相一致!
    192.168.200.100
    192.168.200.101
    192.168.200.102
  }
}
++++++++++++++++我是分隔符++++++++++++++++++++++
#虚拟服务器定义块
 
virtual_server 192.168.200.100 443 { #虚拟IP,来源与上面的虚拟IP地址,后面加空格加端口号
  delay_loop 6 #健康检查间隔,单位为秒
  lb_algo rr #负载均衡调度算法,一般用wrr、rr、wlc
  lb_kind NAT #负载均衡转发规则。一般包括DR,NAT,TUN 3种。
  persistence_timeout 50 #会话保持时间,会话保持,就是把用户请求转发给同一个服务器,不然刚在1上提交完帐号密码,就跳转到另一台服务器2上了。
  protocol TCP #转发协议,有TCP和UDP两种,一般用TCP,没用过UDP。
 
  real_server 192.168.201.100 80 { #真实服务器,包括IP和端口号
    weight 1 #权重,数值越大,权重越高
    TCP_CHECK { #通过tcpcheck判断RealServer的健康状态
      connect_timeout 3 #连接超时时间
      nb_get_retry 3 #重连次数
      delay_before_retry 3 #重连时间间隔
      connect_port 80 #检测端口
    }
  }
}
其实配置文件中主要要修改的选项没有很多,有三个参数要注意
route_id XXX #MASTER和BACKUP不同
virtual_router_id 51 #同一个实例下,MASTER和BACKUP相同
priority 100 #优先级,同一个实例下,MASTER高于BACKUP

 

Nginx动态添加模块 平滑升级
已经安装nginx但想要添加一个新模块,这就需要动态添加模块。现在以添加ngx_http_google_filter_module为例作为演示。
1. 备份原文件
# 停止服务 
/usr/local/nginx/sbin/nginx -s stop
# 将原nginx执行文件备份
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
2. 下载ngx_http_google_filter_module模块
cd /usr/local/nginx/module 
git clone https://github.com/openresty/echo-nginx-module.git
3. 查看原nginx安装了那些模块
/usr/local/nginx/sbin/nginx -V

可以看出编译安装使用了 configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-pcre
4. 编译时添加新模块
/usr/local/nginx/nginx-1.14.0/configure --prefix=/usr/local/nginx --with- http_stub_status_module --with-http_ssl_module --with-pcre --add- module=/usr/local/nginx/module/echo-nginx-module

5. 编译
make
6. 替换nginx二进制文件
# 将新生成的nginx复制到/usr/local/nginx/sbin/下 
cp /usr/local/nginx/nginx-1.14.0/objs/nginx /usr/local/nginx/sbin/

 

posted @ 2022-04-21 17:17  Dabo丶  阅读(190)  评论(0编辑  收藏  举报