nginx介绍,在centos7安装配置以及通过keepalived配置高可用

Nginx介绍

nginx 是一个HTTP和反向代理服务器、一个邮件代理服务器和一个通用的 TCP/UDP 代理服务。

nginx 支持四种负载均衡算法(nginx plus会多支持2种),和容灾策略。工作模式是一个master进程,多个work进程,master负责配置处理和分发任务给work,work负责实际的业务逻辑。每个server指令块支持多个location定义,并通过正则匹配URI。

作为代理服务器时,单台机器最高为6W连接,受限的原因主要是由系统TCP端口数量(1024~65535为公用端口)。单机最高并发可达10w,但要达到这个量级的负载,需要对nginx配置、服务器主机资源和系统配置的整合调优。以下nginx作为tcp代理服务器,有10个client连接的情况:

可见ESTABLISHED状态的有20条,其中10条是代理服务器与client的连接,另外10条是代理服务器和真正的业务服务器的连接。LISTEN状态的有两个,其中8080是tcp代理服务器监听端口(由master进程监听),分发给worker进程建立连接和业务处理。

Nginx负载均衡算法:

1.Round Robin(轮询):请求在服务器之间均匀分布,并考虑服务器权重。默认情况下使用此算法

2.Least Connections(最少连接):请求被发送到活动连接数最少的服务器,也会考虑服务器权重:

3.IP Hash:请求发送到的服务器由客户端 IP 地址确定。在这种情况下,要么使用 IPv4 地址的前三个八位字节,要么使用整个 IPv6 地址来计算哈希值。该方法保证来自同一地址的请求到达同一服务器,除非它不可用。

如果其中一台服务器需要暂时从负载平衡轮换中移除,则可以使用down参数对其进行标记,以保留客户端 IP 地址的当前散列。由该服务器处理的请求会自动发送到组中的下一个服务器;

4.Generic Hash:请求发送到的服务器由用户定义的键确定,该键可以是文本字符串、变量或组合。例如,密钥可以是成对的源 IP 地址和端口,或 URI,如本例所示:

例子中,该指令的可选参数一致hash启用ketama一致性哈希负载平衡。请求根据用户定义的散列键值均匀分布在所有上游服务器上。如果将上游服务器添加到上游组或从上游组中删除,则在负载平衡缓存服务器或其他累积状态的应用程序的情况下,只会重新映射少数键,从而最大限度地减少缓存未命中。

Keepalived介绍

Keepalived是一个用C编写的路由软件,为基于linux设施的负载平衡应用(如LVS)和高可用性(如nginx)提供简单而健壮的功能。Keepalived高可用服务对之间的故障切换转移,是通过VRRP来实现的。备用结点通过心跳感知主Master结点(Master结点主动ping备用结点)存活状态,若主结点停止(如当机器发生故障),备用结点会接管主结点IP资源和服务,当主结点复活,备用结点会返回IP资源和服务。IP资源可以转移,是因为Keepalived可虚拟ip地址,主备机器都配置了相同的ip地址(但备用结点的并没有激活)。当主结点挂掉时将放弃此ip,备用结点将此ip激活。由此,对于client来说,ip依然不变,服务依然正常。

一、Nginx安装和配置

1.安装:

#检查是否有gcc
gcc -v

#若没有此命令请安装
yum -y install gcc

#安装依赖库
yum install -y pcre pcre-devel zlib zlib-devel openssl openssl-devel

#linux下直接下载,也可以通过游览器下载再上传
#目前最新版是2021.4.13发布的 nginx-1.19.10.tar.gz,搭建和配置方式与nginx-1.9.9相同
#linux下直接下载命令
wget http://nginx.org/download/nginx-1.9.9.tar.gz  --2015.12.9发布的版本

#解压并cd进入
tar -zxvf  nginx-1.9.9.tar.gz
cd nginx-1.9.9

#执行configure设置环境并生成Makefile
#指定安装路径,如:--prefix=/usr/local/nginx
#如果需要能够代理https协议,需要增加选项,命令改为:./configure --with-http_ssl_module
#如果需要能够代理tcp协议,需要增加选项,命令改为:./configure --with-stream
./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-stream

#编译和安装,默认安装到/usr/local/nginx
make && make install

#建立软链接,方便使用nginx快捷命令
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx 

#开启nginx, -c后接配置文件(需要绝对路径),如果不设置则使用默认路径的配置
nginx [-c config_path]

#检测是否正常开启
netstat -antp | grep nginx
或
ps aux | grep nginx | grep -v grep

更多安装包资源下载:Index of /download/

2.在游览器输入ip可直接访问,有如下界面即搭建成功:

3.基本命令:

启动nginx:执行nginx;如果没有做软链接到搜索路径,执行/usr/local/nginx/sbin/nginx

其余常用命令:

4.配置举例:

主要配置是nginx.conf(默认的配置是nginx.conf.default,可通过它回滚到原始配置)

实例1,反向代理百度一下:

如果有这种提示nginx: [emerg] https protocol requires SSL support in /usr/local/nginx/conf/nginx.conf:50 ,需要回去看第5步,需要添加https选项并重新编译。
如果proxy_pass字段配置的URL绑定多个ip,将对这些ip使用Round Robin负载均衡方法

实例2,轮询(权重默认都为1):

实例3,加权轮询,且混合使用侦听TCP与UNIX-domain套接字文件:

实例4,代理tcp协议(新增stream配置,stream与http配置同层级):

http--server块下server_name字段说明:ip或域名,如果配置了域名,需要经过DNS注册,或客户端hosts文件设置ip映射

PS:
安装目录nginx/conf/下的nginx.conf.default文件,有较为通用的http配置示例

二、Nginx+keepalived双机热备的集群

1.同样的方式在另一台机器搭建相同配置的nginx;

2.两台机器都安装keepalived

yum -y install keepalived

二进制可执行文件路径:/usr/sbin/keepalived

PS:此步可能报错:如卸载了mariadb,安装了其他版本的mysql;楼主使用全新的虚拟机,规避了这种报错。

3.默认配置在/etc/keepalived/keepalived.conf,下面是经过测试的配置参考:

主Master结点的配置:

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1 ## 本机ip或域名
   smtp_connect_timeout 30
   router_id 192.168.1.15
}

vrrp_script chk_http_port {
    script "/etc/keepalived/nginx_check.sh" ## 检测nginx状态的脚本路径。注意,路径不要在用户目录下(如root或者home等)
    interval 3  ## 如果脚本中有sleep,尽量小于此值
    weight -20  ## 对应vrrp_instance的priority,执行脚本返回非0则减少priority的值
    user root   ## 运行脚本的用户名
}

vrrp_instance VI_1 {
    state MASTER ## 主节点为 MASTER, 对应的备份节点为 BACKUP
    interface ens33 ## 绑定虚拟IP的网络接口
    virtual_router_id 51 ## 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.1.15 ## 本机 IP 地址
    priority 100 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
    advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
		chk_http_port
	}
    virtual_ipaddress {
        192.168.1.100 ## 虚拟 ip,可以定义多个
    }
}

备结点配置:

global_defs {
   notification_email {
     acassen@firewall.loc
     failover@firewall.loc
     sysadmin@firewall.loc
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 192.168.200.1 
   smtp_connect_timeout 30
   router_id 192.168.1.16  ## 本机ip或域名
}

vrrp_script chk_http_port {
    script "/etc/keepalived/nginx_check.sh" ## 检测nginx状态的脚本路径。注意,路径不要在用户目录下(如root或者home等)
    interval 3  ## 如果脚本中有sleep,尽量小于此值
    weight -20  ## 对应vrrp_instance的priority,执行脚本返回非0则减少priority的值
    user root   ## 运行脚本的用户名
}

vrrp_instance VI_1 {
    state BACKUP ## 主节点为 MASTER, 对应的备份节点为 BACKUP
    interface ens33 ## 绑定虚拟IP的网络接口
    virtual_router_id 51 ## 虚拟路由的 ID 号, 两个节点设置必须一样
    mcast_src_ip 192.168.1.16 ## 本机 IP 地址
    priority 99 ## 节点优先级, 值范围 0-254, MASTER 要比 BACKUP 高
    advert_int 1 ## 组播信息发送间隔,两个节点设置必须一样, 默认 1s
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
		chk_http_port
	}
    virtual_ipaddress {
        192.168.1.100 ## 虚拟 ip,可以定义多个
    }
}

nginx_check.sh脚本内容有两个方案(二选一):

方案一(具备重启nginx功能,如果重启失败也关掉keepalived):

#!/bin/bash
A=`netstat -antp | grep nginx | grep -v grep | wc -l`
if [ $A -eq 0 ]; then
    /usr/local/nginx/sbin/nginx
    sleep 2
    if [ `netstat -antp | grep nginx | grep -v grep | wc -l` -eq 0 ]; then
        #exit 1
        systemctl stop keepalived
    fi
fi
exit 0

方案二(只返回错误码,错误码为1时由keepalived通过权重改变priority进行故障转移):

#!/bin/bash
A=`netstat -antp | grep nginx | grep -v grep | wc -l`
if [ $A -eq 0 ]; then
    exit 1
fi
exit 0

然后,两台机器都开启nginx和keepalived,keepalived控制命令如下:
systemctl start keepalived  --开启keepalived
systemctl stop keepalived  --关闭keepalived
systemctl restart keepalived  --重启keepalived
systemctl status keepalived  --查看keepalived服务状态

priority优先级更新策略:
keepalived会定时执行脚本并对脚本执行的结果进行分析,动态调整vrrp_instance的优先级。
如果脚本执行结果为0,并且weight配置的值大于0,则优先级相应的增加
如果脚本执行结果非0,并且weight配置的值小于0,则优先级相应的减少
其他情况,维持原本配置的优先级,即配置文件中priority对应的值

报错: 
vrrp_script运行脚本不成功。通过tail -f /var/log/messages实时查看日志,另外登录一个session用于重启keepalived,然后观察messages日志。一般问题可能是编码(windows上编辑)、脚本权限等。以下是楼主遇到的错误日志(没有指定脚本执行用户,以及脚本防止在home目录导致的):

4.测试方式

把keepalived主Master结点所在机器上的keepalived和nginx都关闭,如果还能连接证明故障转移成功了。重新开启主结点所在机器上的keepalived和nginx,负载将回到此机器。为了测试效果明显,两台机器的nginx可以放置不同的内容。

5.结论

1)keepalived主Master结点关闭,将由备用结点接管。如果主Master结点再次上线,将再次由主结点接管;
2)通过监控脚本感知nginx,主Master结点降低优先级后,将由备用结点接管。以当前的配置,就算nginx再次上线,主Master结点提高了优先级,也不会抢占备用结点的工作。但此时若备用结点下线,主Master结点将再次接管;

PS:想了解keepalived更加详细的参数请到官网查看(文章最后参考文献有列出)

参考文献:

nginx documentation

Keepalived for Linux

搭建 Nginx 高可用集群 (Keepalived+Nginx)_方亚军的博客-CSDN博客_nginx集群

架构篇:Nginx 高可用集群解决方案 Nginx + Keepalived_qq_41490913的博客-CSDN博客_nginx 高可用架构
keepalived之vrrp_script详解 - 木子木泗 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值