Nginx+Keepalived高可用负载均衡服务器搭建

来源:互联网 发布:excel调查问卷数据录入 编辑:程序博客网 时间:2024/06/07 16:07

一、服务器规划
两台服务器一个主机一个备机。
主机ip:192.168.40.130
备机ip:192.168.40.131
虚拟ip:192.168.40.200
二、安装
两台接入服务器分别安装Nginx和keepalived
1、安装依赖包

yum -y install gcc pcre-devel zlib-devel openssl-devel

2、从Nginx官网(http://nginx.org/)下载最新稳定版本nginx-1.10.2.tar.gz
从Keepalived官网(http://www.keepalived.org)下载版本keepalived-1.2.23.tar.gz
CenOS 6.4以下要下载1.2.23及以下版本,不然会编译不通过,切记。CenOS7可以下载任意高版本
3、安装Nginx
将上述文件上传至/home目录下

tar -zxvf nginx-1.10.2.tar.gzcd nginx-1.10.2./configure --with-http_stub_status_modulemake make install

出现下图表示安装成功!
这里写图片描述
检查Nginx安装在哪:

whereis nginx

这里写图片描述
发现Nginx会安装在/usr/local/nginx 下面。

启动Nginx:/usr/local/nginx/sbin/nginx
检查是否有Nginx进程:ps -ef | grep nginx
如图
这里写图片描述
有Nginx进程,输入网址测试:http://192.168.40.132/
这里写图片描述
4、Nginx命令
启动:/usr/local/nginx/sbin/nginx
停止/重新加载:/usr/local/nginx/sbin/nginx -s stop(quit、reload)
验证配置文件是否合法:/usr/local/nginx/sbin/nginx -t
命令帮助:/usr/local/nginx/sbin/nginx -h
文档最后又Nginx配置,可以等Keepalived安装完成之后再配置。
5、安装keepalived-1.2.23(注意在CentOS6.4上安装高于此版本会有问题)
把 keepalived-1.2.23.tar.gz拷贝到 /usr/local/src目录下

cd /usr/local/srctar -zxvf keepalived-1.2.23.tar.gzcd keepalived-1.2.23 ./configure --prefix /usr/local/keepalived

出现下图则configure成功。
这里写图片描述

make make install

如果没有出现[ERR],则表示安装成功,成功会出现下图
这里写图片描述
安装成功后可以查看安装在哪

whereis keepalived

这里写图片描述
做成服务模式,方便启动和关闭。

cp /usr/local/keepalived/sbin/keepalived  /usr/sbin/cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/

这里写图片描述
修改/usr/local/keepalived/etc/keepalived/keepalived.conf

cd /usr/local/keepalived/etc/keepalivedvim keepalived.conf

keepalived.conf配置如下,主机和备机稍有不同。

! Configuration File for keepalivedglobal_defs {   notification_email {        630319550@qq.com   }   notification_email_from 630319550@qq.com   smtp_server smtp.qq.com   smtp_connect_timeout 30   router_id keepalived_master   #主备机标识,备机为keepalived_backup   vrrp_skip_check_adv_addr   vrrp_strict   vrrp_garp_interval 0   vrrp_gna_interval 0}vrrp_instance VI_1 {    state MASTER    #备机为  BACKUP    interface eth1    #网卡名称,有的是eth0    virtual_router_id 51   #主备机必须一致    priority 101      #备机要比主机数值低,此处备机为99    advert_int 1    authentication {        auth_type PASS   #主备机必须一致        auth_pass 1111   #主备机必须一致    }    virtual_ipaddress {        192.168.40.200   #虚拟ip地址,主备机一致    }}

修改完成之后复制到etc

cp -r  /usr/local/keepalived/etc/keepalived /etc

先在主机启动Keepalived

service keepalived start

查看启动日志

tail /var/log/messages

这里写图片描述
说明虚拟ip已经切换到192.168.40.200
查看ip配置

ip addr

这里写图片描述
在备机上启动Keepalived,并关掉主机Keepalived,查看备机是否接管虚拟ip,如果成功接管则代表安装成功。
我们需要的是当NginX停止服务的时候能够自动切换。
keepalived支持配置监控脚本,我们可以通过脚本监控NginX的状态,如果状态不正常则进行一系列的操作,最终仍不能恢复NginX则杀掉keepalived,使得从服务器能够接管服务。
在/usr/local/keepalived 文件夹下编写脚本。

cd /usr/local/keepalivedvim check_nginx_pid.sh

脚本如下:

#!/bin/bashA=`ps -C nginx --no-header |wc -l`if [ $A -eq 0 ];then      /usr/local/nginx/sbin/nginx      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then              killall keepalived      fifi

把如上脚本拷贝到备机

scp check_nginx_pid.sh root@192.168.40.131:/usr/local/keepalived

设置脚本执行权限

chmod 777 check_nginx_pid.sh

在keepalived.conf中添加如下配置

vrrp_script chk_http_port {    script "/usr/local/keepalived/check_nginx_pid.sh"   #脚本interval 2     #执行脚本时间间隔    weight 2     # 权重}track_script {    chk_http_port}

到此已经全部配置完成!
测试:
分别启动nginx

./usr/local/nginx/sbin/nginx

在浏览器分别输入主备机真实网址查看
先启动主机Keepalived,再启动备机Keepalived

service keepalived start

在浏览器输入http://192.168.40.200/ 上面配置的虚拟ip成功进入nginx界面则说明Keepalived已经接管虚拟ip并能访问nginx。
在主机停掉nginx服务

killall nginx

基于刚才的脚本nginx会自动重启,为了测试可以先把主机nginx卸载掉,此时刚才的脚本检测到nginx已经没有进程且重启不了,则会把Keepalived杀死,此时备机会接管虚拟ip,此时访问http://192.168.40.200/照样能访问到nginx。
这样就实现了nginx的高可用,这样做虽然能实现nginx高可用但是nginx备机长期处于备份状态所以我们想将二台Nginx负载均衡器都处于工作状态,在keepalived的配置文件添加另一个VIP实例就可以,这样就能实现两个nginx互为主备!

附Nginx配置:
此配置已通过复合项目简单测试

vim nginx.conf

配置如下:

#user  nobody;worker_processes  1;#error_log  logs/error.log;#error_log  logs/error.log  notice;#error_log  logs/error.log  info;#pid        logs/nginx.pid;events {    worker_connections  1024;}http {    include       mime.types;    default_type  application/octet-stream;    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '    #                  '$status $body_bytes_sent "$http_referer" '    #                  '"$http_user_agent" "$http_x_forwarded_for"';    #access_log  logs/access.log  main;    sendfile        on;    #tcp_nopush     on;    #keepalive_timeout  0;    keepalive_timeout  65;    #gzip  on;    upstream  pizirui {           server   localhost:8081 weight=10;         server   localhost:8082 weight=10;    }     server {        listen       80;        server_name  localhost;        #charset koi8-r;        #access_log  logs/host.access.log  main;        location / {                    proxy_pass http://pizirui;                    proxy_connect_timeout       1;                    proxy_read_timeout          1;                    proxy_send_timeout          1;                }     }}
0 0