nginx+keepalived主备双机部署

1. 环境准备

两台服务器10.10.36.30和10.10.36.31
同一网段的虚拟IP:10.10.36.29

2. 安装nginx

  • 安装编译环境

    yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
    
  • 下载安装包并解压

    wget https://nginx.org/download/nginx-1.16.1.tar.gz
    tar -zxvf nginx-1.16.1.tar.gz
    
  • 配置编译和安装

    ./configure --prefix=/usr/local/nginx
    make && make install
    
  • 配置为系统服务

    vim /lib/systemd/system/nginx.service
    
    # nginx.service内容如下
    [Unit]
    Description=nginx service
    After=network.target
     
    [Service]
    Type=forking
    ExecStart=/usr/local/nginx/sbin/nginx
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    PrivateTmp=true
    [Install]
    WantedBy=multi-user.target
    
    # 编辑保存后需重新加载系统服务
    systemctl daemon-reload
    
  • 设置开机启动

    # 设置开机启动
    systemctl enable nginx.service
    
  • 服务的常用命令

    #启动nginx服务
    systemctl start nginx.service  
     
    #停止服务
    systemctl stop nginx.service       
        
    #重新启动服务
    systemctl restart nginx.service      
     
    #查看服务当前状态
    systemctl status nginx.service         
     
    #设置开机自启动
    systemctl enable nginx.service     
    
    # 停止开机自启动
    systemctl disable nginx.service
    

3. 安装keepalived

  • 用yum命令进行安装

    yum install keepalived
    
    #查看是否已经安装上
    rpm -q -a keepalived   
    
  • 修改配置文件

    # /etc/keepalived目录里面有配置文件keepalived.conf
    vim /etc/keepalived/keepalived.conf
    
    # 赋权
    chmod 644 /etc/keepalived/keepalived.conf
    
    # keepalived.conf的内容如下
    global_defs {
    	router_id keep_30	# 唯一标识
    }
    
    # 执行nginx是否启动的脚本,未启动则启动nginx,启动失败则杀死keepalived进程
    vrrp_script chk_http_port {
    	script "/usr/local/src/nginx_check.sh"
    	interval 5   # 检测脚本执行的间隔:5s
    	weight 5  # 权重,如果这个脚本检测为真,服务器权重+5
    }
    
    vrrp_instance VI_1 {
    	state MASTER   # 主服务器为MASTER,备份服务器为BACKUP
    	interface ens33 # 网卡名称
    	virtual_router_id 51 # 主、备机的virtual_router_id必须相同
    	priority 100   # 主、备机取不同的优先级,主机值较大,备份机值较小
    	advert_int 1   # 每隔1s发送一次心跳
    	authentication {	# 校验方式,类型是密码,密码1111
            auth type PASS
            auth pass 1111
        }
    	virtual_ipaddress { # 虛拟ip
    		10.10.36.29 # 需要与当前服务器属于同一网段
    	}
    }
    
  • 创建nginx检测脚本

    vim /usr/local/src/nginx_check.sh
    chmod 755 /usr/local/src/nginx_check.sh
    

    nginx_check.sh内容如下

    #!bin/bash
    A=`ps -C nginx --no-header |wc -l`
    if [ $A -eq 0 ];then  #如果nginx没在运行
       systemctl start nginx.service  #启动nginx
       sleep 2
       if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then  #如果无法启动
    	killall keepalived  #杀死keepalived进程
       fi
    fi
    
  • 设置开机启动

    systemctl enable keepalived.service
    
  • 常用命令

    #启动nginx服务
    systemctl start keepalived.service
     
    #停止服务
    systemctl stop keepalived.service  
        
    #重新启动服务
    systemctl restart keepalived.service
     
    #查看服务当前状态
    systemctl status keepalived.service
     
    #设置开机自启动
    systemctl enable keepalived.service
        
    # 停止开机自启动
    systemctl disable keepalived.service
    

4. 定时清理nginx日志

  • 添加系统定时任务

    crontab -e
    
    #每天0时1分进行日志分割
    01 00 * * * /usr/share/nginx/logs/cut_nginx_log.sh
    
  • 新建cut_nginx_log.sh脚本

    vim /usr/share/nginx/logs/cut_nginx_log.sh
    chmod 755 /usr/share/nginx/logs/cut_nginx_log.sh
    

    cut_nginx_log.sh内容如下

    #!/bin/bash
    #每天00:00执行此脚本 将前一天的access.log重命名为access-xxxx-xx-xx.log格式,并重新打开日志文件
    #Nginx日志文件所在目录
    LOG_PATH=/usr/local/nginx/logs/
    #获取昨天的日期
    YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
    #删除文件的日期
    SEVENDAY=$(date --date="30 days ago" +%Y-%m-%d)
    #获取pid文件路径
    PID=/usr/local/nginx/logs/nginx.pid
    #分割日志
    mv ${LOG_PATH}access.log ${LOG_PATH}access-${YESTERDAY}.log
    mv ${LOG_PATH}error.log ${LOG_PATH}error-${YESTERDAY}.log
    rm ${LOG_PATH}access-${SEVENDAY}.log
    rm ${LOG_PATH}error-${SEVENDAY}.log
    #向Nginx主进程发送USR1信号,重新打开日志文件
    kill -USR1 `cat ${PID}`
    

5. 验证

  • 启动两台服务器上的nginx和keepalived

    systemctl start nginx.service
    
    systemctl start keepalived.service
    
  • 在浏览器地址栏输入虚拟ip地址10.10.36.29

  • 把主服务器(10.10.36.30) nginx和keealived停止,再输入虚拟ip地址10.10.36.29

    systemctl stop keepalived.service
    
    systemctl stop nginx.service
    
  • 以上访问都成功则配置成功