Nginx (nginx+keepalived保证高可用)

nginx通过master来接收外界的信号,然后将任务分配给worker去做。比如接受一个nginxup -s reload信号后,交给worker去重启。

  • worker进程:主进程
  • master进程:工作进程

Nginx的事件处理

worker(用了linux的epoll模型)处理方式是异步非阻塞的,当他发现请求1阻塞后,他会去处理请求2;当请求2阻塞后,又会去处理请求3。【worker进程工作数设置,一般来说CPU有几个,就设置几个,或者设置为N-1也行】worker_processes

异步 的优势显而易见,大大优化用户体验, 非阻塞 使得系统资源开销远远小于 阻塞 模式,因为系统不需要创建新的进程(或线程),大大地节省了系统 多出来的系统资源可以给其他的中间件去服务了。


LVS Nginx实现高可用集群 - 图1

nginx.conf 配置

image.png

sendfile 使用高效文件传输,提升传输性能。启用后才能使用 tcp_nopush ,是指当数据表累积一定大小后才发送,提高了效率。
sendfile on; tcp_nopush on;
keepalive_timeout 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
#keepalive_timeout 0; keepalive_timeout 65;

event

  1. linux 下 默认使用epoll
  2. 可以配置worker允许连接的客户端的最大连接数

    http

  3. log_format 控制日志打印格式

  4. sendfile 使用高效文件传输,提升传输性能。启用后才能使用 tcp_nopush ,是指当数据表累积一定大小后才发送,提高了效率。
  5. keepalive_timeout 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。

    Server(虚拟主机)

  6. 监听的端口号

  7. location 有独特的匹配规则

image.png

  1. 这里也可以配置跨域处理。

    Nginx日志切割

    access.log 一般会很大,对其可以按天切割。

    !/bin/bash

    LOG_PATH=”/var/log/nginx/“ RECORD_TIME=$(date -d “yesterday” +%Y-%m-%d+%H:%M) PID=/var/run/nginx/nginx.pid mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log

    向Nginx主进程发送信号,用于重新打开日志文件

    kill -USR1 `cat $PID

Nginx 开启gzip压缩

开启gzip压缩功能,可以提高传输效率,节约带宽。
gzip on

Nginx 防盗链验证

image.png

Nginx 模块化设计

image.png

UPSTREAM 参数设置

image.png

upstream 指令参数 max_conns

限制每台server的连接数,用于保护避免过载,可起到限流作用。

upstream 指令参数 down、backup

down 用于标记服务节点不可用。
backup 表示当前服务器节点是备用机,只有在其他的服务器都宕机以后,自己才会加入到集群中,被用户访问到。

backup 参数不能使用在 hash 和 random load balancing 中。

upstream 指令参数 max_fails、fail_timeout

max_fails :表示失败几次,则标记server已宕机,剔出上游服务。
fail_timeout :表示失败的重试时间。

Keepalived 提高吞吐量

keepalived : 设置长连接处理的数量
proxy_http_version :设置长连接http版本为1.1
proxy_set_header :清除connection header 信息
image.png

Nginx负载均衡算法

  1. 轮询
  2. 权重
  3. IP_hash 保证来自同一ip的请求被打到固定的机器上 【注意:不能把后台服务器直接移除,只能标记 down 】
  4. fair(第三方) 响应时间方式

    一致性hash算法

    一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

image.png
一致性哈希算法引入了虚拟节点机制,即对每个节点计算多个哈希值,每个计算结果位置都放置在对应节点中,这些节点称为虚拟节点。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布

来访请求根据它的特征量(header/body里的值都可以),根据特定的算法md5变成摘要,通过hashCode值得到int(hashId)放到环上。 Java中的TreeMap(排序,tailMap方法能找到最近的节点)可以存放这种结构。

url_hash(第三方) 依据URL分配方式

image.png

least_conn 最少连接方式

缓存

浏览器会有自己的缓存,Nginx可以控制浏览器的缓存时间expires。

  1. 浏览器缓存:
    加速用户访问,提升单个用户(浏览器访问者)体验,缓存在本地
  2. Nginx缓存
    缓存在nginx端,提升所有访问到nginx这一端的用户
    提升访问上游(upstream)服务器的速度
    用户访问仍然会产生请求流量

    Nginx的反向代理缓存

    proxy_cache_path 设置缓存目录
    # keys_zone 设置共享内存以及占用空间大小
    # max_size 设置缓存大小
    # inactive 超过此时间则被清理
    # use_temp_path 临时目录,使用后会影响nginx性能

    location / { proxy_pass http://tomcats;

    启用缓存,和keys_zone一致

    proxy_cache mycache;

    针对200和304状态码缓存时间为8小时

    proxy_cache_valid 200 304 8h; }

高可用集群架构 Keepalived

一般解决负载均衡器的高可用性问题,提供了负载均衡、健康检查和高可用的功能,高可用功能是由VRRP协议来实现的。
image.png

KeepAlive需要注册为系统服务

(init.d 和 sysconfig 拷贝到系统里面就好了 systemctl start Keepalived.service
Keepalived配置Nginx自动重启。

Keepalived双机主备-存在资源浪费

image.png

Keepalived双主热备

image.png

LVS 负载均衡

image.png

为什么需要 LVS+NGINX

image.png

LVS 模式 DR

image.png
vip就是虚拟ip返回。

LVS的负载均衡算法

静态算法

静态:根据LVS本身自由的固定的算法分发用户请求。

  1. 轮询(Round Robin 简写’rr’):轮询算法假设所有的服务器处理请求的能力都一样的,调度器会把所有的请求平均分配给每个真实服务器。(同Nginx的轮
  2. 加权轮询【常用】(Weight Round Robin 简写’wrr’):安装权重比例分配用户请求。权重越高,被分配到处理的请求越多。(同Nginx的权重)
  3. 源地址散列(Source Hash 简写’sh’):同一个用户ip的请求,会由同一个RS来处理。(同Nginx的ip_hash) 4. 目标地址散列(Destination Hash 简写’dh’):根据url的不同,请求到不同的RS。(同Nginx的url_hash)

动态算法
动态:会根据流量的不同,或者服务器的压力不同来分配用户请求,这是动态计算的。

  1. 最小连接数(Least Connections 简写’lc’):把新的连接请求分配到当前连接数最小的服务器。
  2. 加权最少连接数【常用】(Weight Least Connections 简写’wlc’):服务器的处理性能用数值来代表,权重越大处理的请求越多。Real Server 有可能会存在性能上
    动态获取不同服务器的负载状况,把请求分发到性能好并且比较空闲的服务器。
  3. 最短期望延迟(Shortest Expected Delay 简写’sed’):特殊的wlc算法。举例阐述,假设有ABC三台服务器,权重分别为1、2、3 。如果使用wlc算法的话
    求进来,它可能会分给ABC中的任意一个。使用sed算法后会进行如下运算:
    A:(1+1)/1=2
    B:(1+2)/2=3/2
    C:(1+3)/3=4/3
    最终结果,会把这个请求交给得出运算结果最小的服务器。
  4. 最少队列调度(Never Queue 简写’nq’):永不使用队列。如果有Real Server的连接数等于0,则直接把这个请求分配过去,不需要在排队等待运算了

总结

Nginx入门基础

日志是一种生产服务器上调试的手段,可以通过日志来排查问题,但是日志需要切割,否则就是一份大文件,所以我们讲解了如何定时的自动进行日志切割,可以按照时间日期进行切分。
随后我们讲解了如何通过nginx的虚拟主机功能映射。这种场景就是当有多个域名但是只有一个服务器的时候,可以用nginx来构建虚拟主机
当网站里有css、js、html、图片等文件,可以通过gzip来压缩内容,这样可以节省网络带宽,提高用户的访问效率,减少交互时间。
location匹配规则也是用的比较多,其实也就是路由功能,根据不同的请求url来分配不同的访问。
除了JSONP和SpringBoot解决跨域问题外,也能通过Nginx来解决,所以我们也讲解了如何进行配置,虽然是在nginx.conf中配置,但是原理和springboot配置都一样。
对于静态资源,尤其是图片,往往我们可以设置防盗链,避免被其他网站的引用,这也是平日里用的比较多的。

Nginx进阶

这一部分主要涉及到Nginx构建集群与负载均衡,首先讲了模块化设计,因为反向代理是属于其中的一个模块的。
随后就简介了集群与负载均衡的原理,并且构建了tomcat集群。集群涉及到相应的负载均衡算法,默认为轮询,当然我们也讲了其他的算法,包括加权轮询、ip_hash等。
此外upstream还提供了一些额外的指令,比如有:max_conns、slow_start、down、backup、max_fails、fail_timeout。当然还能通过keepalive来提升系统的吞吐量。
在讲到ip_hash、url_hash的时候,我们讲了一致性哈希算法的原理,这个在面试过程中可能会被问到,所以需要理解。
在使用nginx的时候,我们往往会设置缓存,一个是浏览器缓存,通过nginx可以控制,另外一个则是反向代理缓存,可以把其他节点的内容缓存到Nginx这一点,提高用户请求效率。

高可用集群 LVS + Keepalived

为了解决nginx的高可用,我们结合了keepalived来配置双机主备或者双主热备,要理解这两者区别,核心是VIP,用户通过VIP来访问。
为了保证nginx自动重启,提供7x24的不间断服务,需要自行添加脚本使得keepalived对nginx进行检测。
当然,单个nginx往往是不够的,因为他的并发量还是有限,所以很多企业会采用LVS,LVS是四层负载,LVS涉及到NAT|TUN|DR这三种模式,当然,为了保证LVS的高可用,咱们也配合使用了Keepalived,因为Keepalived可以说就是为lvs量身打造的。

Lvs负责将外网请求交由集群中的Nginx进行处理;keepalived则监控lvs群组,根据监控情况,若lvs群组中的master出现宕机情况,则将宕机服务器从ipvsadm移除掉,即将VIP漂移到backup机上。实现了分布式系统高可用。