Nginx + Keepalive生产环境搭建

Nginx的主要用途有反向代理,负载均衡等,无论它作为哪种用途,Nginx本身也需要高可用来预防单点故障,Nginx的高可用可以通过搭配Keepalive来实现。主要思路即配置主备Nginx服务,通过Keepalive来进行检测,当主Nginx挂掉时,能够通过转移VIP的方式自动切换到备Nginx,进而实现Nginx的高可用。

1 部署架构

Nginx+Keepalive部署架构

2 Nginx部署

对于很多公司可能生产环境机器都是无法联网的,所以我们这里通过源码来安装Nginx。

1) 下载源码包:nginx: download,解压缩后文件目录如下(这里我们使用了最新稳定版nginx-1.20.1):

image.png

2) 安装gcc等编译依赖环境:

yum -y install gcc pcre-devel zlib-devel

3) 进入安装包目录,执行以下命令配置安装路径:

./configure --prefix=/home/nginx

默认情况下安装路径是/usr/local/nginx,因为生产环境机器都会单独挂载磁盘,而且Nginx的访问日志会随着时间变大,为了不影响操作系统所在磁盘,这里我们配置成单独挂载的磁盘目录。

4) 执行完配置命令后,当前目录下会生成Makefile文件,继续执行以下命令安装:

make && make install

5) 因为配置了安装目录,所以Nginx会安装在/home/nginx目录下,启动Nignx:

cd /home/nginx/sbin
./nginx

主从机器都按照上述步骤安装Nginx。

3 Keepalive部署

1) yum安装keepalive:

yum -y install keepalived

2) 修改配置文件:

vi /etc/keepalived/keepalived.conf

主机keepalived.conf:

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/home/shell/check_nginx_pid.sh" #nginx进程检测脚本
    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_nginx
    }
    virtual_ipaddress {
        192.168.1.200 #虚拟ip设置
    }
}

因为Keepalived转移虚ip是根据Keepalived进程是否存活来进行的,所以如果Nginx挂了,但Keepalived进程还在的话,是不会转移ip的,所以如果Nginx挂掉并且无法重启,则需要在检查脚本中关闭Keepalived进程:

check_nginx_pid.sh:

#!/bin/bash
A=`ps -C nginx --no-header |wc -l`
if [ $A -eq 0 ];then    #如果nginx没有启动就启动nginx
      /home/nginx/sbin/nginx                #重启nginx
      if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then    #nginx重启失败,则停掉keepalived服务,进行VIP转移
              systemctl stop keepalived
      fi
fi

需要给check_nginx_pid.sh脚本权限:

chmod 777 check_nginx_pid.sh

备机keepalive.conf:

global_defs {
   router_id LVS_DEVEL
}

vrrp_script chk_nginx {
    script "/home/shell/check_nginx_pid.sh" #nginx进程检测脚本
    interval 2
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP   
    interface ens33  #网卡设备
    virtual_router_id 51  #虚拟路由编号,主从要一致
    priority 90 #这里的priority小于MASTER
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_nginx
    }
    virtual_ipaddress {
        192.168.1.200 #虚拟ip设置
    }
}

3) 主从keepalived配置好后,可以通过命令启动:

systemctl start keepalived

4) 查看是否启动成功,以及当前机器是MASTER还是SLAVE可以查看日志:

tail -f /var/log/message

5) 通过如下命令查看虚ip是否配置成功:

ip addr

4 主从切换测试

停掉主机上的Keepalived来查看虚ip是否转移到SLAVE主机上,如果转移成功则说明后续的请求都是通过备机上的Nginx来处理的,即实现了Nginx的高可用。

MASTER主机执行:

systemctl stop keepalived

从机上查看虚ip是否转移:

ip addr

查看切换过程中的日志:

tail -f /var/log/message

成功转移,则说明环境搭建完成。

5 其他说明

5.1 keepalive.conf weight参数说明

细心的同学可能会发现vrrp_script中有个weight参数,这个参数是什么意思呢?

官网中的解释如下Keepalived for Linux

# adjust priority by this weight, (default: 0)
# For description of reverse, see track_script.
# 'weight 0 reverse' will cause the vrrp instance to be down when the
# script is up, and vice versa.
weight <INTEGER:-253..253> [reverse]

第一句话的意思是该参数会调整priority参数,而priority是用来选举MASTER的。所以该参数会影响到keepalived MASTER选举:

for electing MASTER, highest priority wins.
to be MASTER, make this 50 more than on other machines.
priority 100

后面的意思应该是如果weight设置为 weight 0 reverse的话,如果检测脚本返回失败,则keepalived会down掉,进而完成切换。

那weight是如何调整priority的呢,继续看官网说明:

vrrp tracking scripts that will cause vrrp instances to go down it
they exit a non-zero exist status, or if a weight is specified will add
or subtract the weight to/from the priority of that vrrp instance.

也就是说Keepalived会根据脚本检测结果,然后根据配置的weight对priority进行相应的增加或减少,进而影响MASTER选举。

实际测试当weight大于0时,脚本检测成功时,priority会增加weight,脚本检测失败时,priority会减少weight。

当weight < 0时,当脚本检测成功时,priority保持不变,而脚本检测失败时,priority会减少weight。

实际测试这里的priority不会一直改变,也就是说一直检测成功或者失败,也不会对priority一直增加或减少,这里应该是Keepalive内部的优化了。

5.2 主从切换失败的常见问题解决

1) 确认防火墙及selinux是否关闭
2) 转移过程中的具体日志可以查看/var/log/message文件

5.3 一个Nginx反向代理及负载均衡的生产环境配置

nginx.conf

user  root;
worker_processes  8; #工作线程,配置成cpu核心数

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  65; #与客户端连接的keepalive_timeout参数

    #gzip  on;

    upstream api_server {
        server 192.168.1.106:8848;
        server 192.168.1.107:8848;
        server 192.168.1.108:8848;
        keepalive 15;  #与后台服务器保持的空闲连接数
    }

    server {
        listen       8848;
        server_name  192.168.1.200; # 这里配置成虚ip的地址,因为客户端都是通过虚ip来访问Nginx的

        location / {
           proxy_pass http://api_server;
           proxy_http_version 1.1;  #设置http 1.1协议,可以与后端http服务保持长连接,防止出现过多time_wait
           proxy_set_header Connection "";
        }
    }
}

上述是nginx-1.20.1的生产环境配置,有很多参数未涉及,实际上保持系统默认即可。

写在最后

希望今天的内容能对大家有所帮助,更多精彩内容欢迎关注微信公众号:WU双

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 77,383评论 1 169
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 25,958评论 1 141
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 28,731评论 0 100
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 16,068评论 0 86
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 21,280评论 0 144
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 17,523评论 0 87
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 10,350评论 2 161
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 9,746评论 0 76
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 8,245评论 5 109
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 11,526评论 0 127
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 10,297评论 1 123
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 11,100评论 0 127
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 5,962评论 0 17
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 8,760评论 2 114
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 11,824评论 3 121
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 7,613评论 0 3
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 7,815评论 0 75
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 12,263评论 2 132
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 12,946评论 2 130