VIP IP 主机名 Nginx端口 默认主从
192.168.200.100 192.168.200.20 master 80 master
192.168.200.100 192.168.200.30 backup 80 backup

安装Nginx

1.安装编译Nginx所需的依赖包和工具

  1. #yum install -y gcc gcc-c++ make automake autoconf libtool pcre pcre-devel zlib zlib-devel openssl openssl-devel wget net-tools vim

2.下载Nginx

  1. # cd /usr/local/src/
  2. # wget http://nginx.org/download/nginx-1.13.0.tar.gz

3.编译安装Nginx

  1. # cd /usr/local/src/
  2. # tar -zxvf nginx-1.13.0.tar.gz
  3. # cd nginx-1.13.0
  4. # ./configure --prefix=/usr/local/nginx
  5. # make && make install

4.配置Nginx

  1. # vi /usr/local/nginx/conf/nginx.conf
  2. user root;
  3. worker_processes 1;
  4. #error_log logs/error.log;
  5. #error_log logs/error.log notice;
  6. #error_log logs/error.log info;
  7. #pid logs/nginx.pid;
  8. events {
  9. worker_connections 1024;
  10. }
  11. http {
  12. include mime.types;
  13. default_type application/octet-stream;
  14. #log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  15. # '$status $body_bytes_sent "$http_referer" '
  16. # '"$http_user_agent" "$http_x_forwarded_for"';
  17. #access_log logs/access.log main;
  18. sendfile on;
  19. #tcp_nopush on;
  20. #keepalive_timeout 0;
  21. keepalive_timeout 65;
  22. #gzip on;
  23. server {
  24. listen 88;
  25. server_name localhost;
  26. #charset koi8-r;
  27. #access_log logs/host.access.log main;
  28. location / {
  29. root html;
  30. index index.html index.htm;
  31. }
  32. #error_page 404 /404.html;
  33. # redirect server error pages to the static page /50x.html
  34. error_page 500 502 503 504 /50x.html;
  35. location = /50x.html {
  36. root html;
  37. }
  38. }
  39. }

5.修改Nginx欢迎页面的内容(便于后面的测试时区分两个节点的Nginx)

  1. # vi /usr/local/nginx/html/index.html
  2. 192.168.200.20 中的标题加 1
  3. <h1>Welcome to nginx! 1</h1>
  4. 192.168.200.30 中的标题加 2
  5. <h1>Welcome to nginx! 2</h1>

6.启动Nginx

  1. # /usr/local/nginx/sbin/nginx

重启Nginx

  1. # /usr/local/nginx/sbin/nginx -s reload

7.访问两个节点的Nginx

bd51aff5d9fb7b1c282c46967b1d7c8b.png07ca14f99255039acbd8582252561342.png

安装Keepalived

1.下载keepalived包

因为Centos默认的yum源里就有keepalived包,所以直接使用yum安装

  1. # yum install -y keepalived

2.编辑master(192.168.200.20)的keepalived配置文件

  1. # vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3. notification_email {
  4. 131917381@qq.com
  5. }
  6. notification_email_from root@aaaaa.com
  7. smtp_server 127.0.0.1 #表示发送email时使用的smtp服务器地址,这里可以用本地的sendmail来实现
  8. smtp_connect_timeout 30
  9. router_id LVS_DEVEL
  10. }
  11. vrrp_script chk_nginx {
  12. script "/usr/local/sbin/check_ng.sh"#检查服务是否正常,通过写脚本实现,脚本检查服务健康状态
  13. interval 3 #检查时间间断是3秒
  14. }
  15. vrrp_instance VI_1 {
  16. state MASTER #定义master相关
  17. interface ens33 #通过vrrp协议去通信、去发广播。此为网卡名
  18. virtual_router_id 51 #定义路由器ID ,配置的时候和从机器一致
  19. priority 90
  20. advert_int 1
  21. authentication {
  22. auth_type PASS
  23. auth_pass 5201314>g
  24. }
  25. virtual_ipaddress { #设置虚拟IP地址 (VIP),又叫做漂移IP地址
  26. 192.168.200.100
  27. }
  28. track_script { #加载脚本
  29. chk_nginx
  30. }
  31. }

3.自定义脚本实现监控Nginx服务

  1. # vim /usr/local/sbin/check_ng.sh
  2. #!/bin/bash
  3. #时间变量,用于记录日志
  4. d=`date --date today +%Y%m%d_%H:%M:%S`
  5. #计算nginx进程数量
  6. n=`ps -C nginx --no-heading|wc -l`
  7. #如果进程为0,则启动nginx,并且再次检测nginx进程数量
  8. if [ $n -eq "0" ]; then
  9. /etc/init.d/nginx start
  10. n2=`ps -C nginx --no-heading|wc -l`
  11. #如果还为0,说明nginx无法启动,此时需要关闭keepalived
  12. if [ $n2 -eq "0" ]; then
  13. echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
  14. systemctl stop keepalived
  15. fi
  16. fi

编辑完成后给予该脚本x权限,否则无法被keepalived调用

  1. # chmod a+x /usr/local/sbin/check_ng.sh

4.启动主节点的keepalived和Nginx

  1. # systemctl start keepalived
  2. # ip add
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. inet 127.0.0.1/8 scope host lo
  6. valid_lft forever preferred_lft forever
  7. inet6 ::1/128 scope host
  8. valid_lft forever preferred_lft forever
  9. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  10. link/ether 00:0c:29:f8:e3:b9 brd ff:ff:ff:ff:ff:ff
  11. inet 192.168.200.20/24 brd 192.168.200.255 scope global noprefixroute ens33
  12. valid_lft forever preferred_lft forever
  13. inet 192.168.200.100/32 scope global ens33
  14. valid_lft forever preferred_lft forever
  15. inet6 fe80::a709:f89:6e2d:666a/64 scope link noprefixroute
  16. valid_lft forever preferred_lft forever
  17. inet6 fe80::f47a:43ff:375e:c80/64 scope link tentative noprefixroute dadfailed
  18. valid_lft forever preferred_lft forever

5.编辑backup(192.168.200.30)的keepalived文件

  1. # vim /etc/keepalived/keepalived.conf
  2. global_defs {
  3. notification_email {
  4. 131917381@qq.com
  5. }
  6. notification_email_from root@aaaaa.com
  7. smtp_server 127.0.0.1
  8. smtp_connect_timeout 30
  9. router_id LVS_DEVEL
  10. }
  11. vrrp_script chk_nginx {
  12. script "/usr/local/sbin/check_ng.sh"
  13. interval 3
  14. }
  15. vrrp_instance VI_1 {
  16. state MASTER
  17. interface ens33
  18. virtual_router_id 51
  19. priority 90
  20. advert_int 1
  21. authentication {
  22. auth_type PASS
  23. auth_pass 5201314>g
  24. }
  25. virtual_ipaddress {
  26. 192.168.200.100
  27. }
  28. track_script {
  29. chk_nginx
  30. }
  31. }

6.编辑监控脚本并给予权限

  1. # vim /usr/local/sbin/check_ng.sh
  2. d=`date --date today +%Y%m%d_%H:%M:%S`
  3. n=`ps -C nginx --no-heading|wc -l`
  4. if [ $n -eq "0" ]; then
  5. systemctl start nginx
  6. n2=`ps -C nginx --no-heading|wc -l`
  7. if [ $n2 -eq "0" ]; then
  8. echo "$d nginx down,keepalived will stop" >> /var/log/check_ng.log
  9. systemctl stop keepalived
  10. fi
  11. fi
  12. # chmod a+x /usr/local/sbin/check_ng.sh

7.启动从节点的keepalive和Nginx

  1. # systemctl start keepalived
  2. # ip add
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. inet 127.0.0.1/8 scope host lo
  6. valid_lft forever preferred_lft forever
  7. inet6 ::1/128 scope host
  8. valid_lft forever preferred_lft forever
  9. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  10. link/ether 00:0c:29:f8:e3:b9 brd ff:ff:ff:ff:ff:ff
  11. inet 192.168.200.30/24 brd 192.168.200.255 scope global noprefixroute ens33
  12. valid_lft forever preferred_lft forever
  13. inet 192.168.200.100/32 scope global ens33
  14. valid_lft forever preferred_lft forever
  15. inet6 fe80::a709:f89:6e2d:666a/64 scope link noprefixroute
  16. valid_lft forever preferred_lft forever
  17. inet6 fe80::f47a:43ff:375e:c80/64 scope link tentative noprefixroute dadfailed
  18. valid_lft forever preferred_lft forever

8.模拟主节点宕机查看VIP是否在backup上

  1. # iptables -I OUTPUT -p vrrp -j DROP
  2. [root@backup ~]# ip add
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. inet 127.0.0.1/8 scope host lo
  6. valid_lft forever preferred_lft forever
  7. inet6 ::1/128 scope host
  8. valid_lft forever preferred_lft forever
  9. 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  10. link/ether 00:0c:29:1a:0f:c6 brd ff:ff:ff:ff:ff:ff
  11. inet 192.168.200.162/24 brd 192.168.200.255 scope global noprefixroute ens33
  12. valid_lft forever preferred_lft forever
  13. inet 192.168.200.100/32 scope global ens33
  14. valid_lft forever preferred_lft forever
  15. inet6 fe80::f47a:43ff:375e:c80/64 scope link noprefixroute
  16. valid_lft forever preferred_lft forever