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
异步 的优势显而易见,大大优化用户体验, 非阻塞 使得系统资源开销远远小于 阻塞 模式,因为系统不需要创建新的进程(或线程),大大地节省了系统 多出来的系统资源可以给其他的中间件去服务了。
nginx.conf 配置
sendfile 使用高效文件传输,提升传输性能。启用后才能使用 tcp_nopush ,是指当数据表累积一定大小后才发送,提高了效率。
sendfile on; tcp_nopush on;
keepalive_timeout 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
#keepalive_timeout 0; keepalive_timeout 65;
event
- linux 下 默认使用epoll
-
http
log_format 控制日志打印格式
- sendfile 使用高效文件传输,提升传输性能。启用后才能使用 tcp_nopush ,是指当数据表累积一定大小后才发送,提高了效率。
keepalive_timeout 设置客户端与服务端请求的超时时间,保证客户端多次请求的时候不会重复建立新的连接,节约资源损耗。
Server(虚拟主机)
监听的端口号
- location 有独特的匹配规则
- 这里也可以配置跨域处理。
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 防盗链验证
Nginx 模块化设计
UPSTREAM 参数设置
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 信息
Nginx负载均衡算法
- 轮询
- 权重
- IP_hash 保证来自同一ip的请求被打到固定的机器上 【注意:不能把后台服务器直接移除,只能标记 down 】
- fair(第三方) 响应时间方式
一致性hash算法
一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。
一致性哈希算法引入了虚拟节点机制,即对每个节点计算多个哈希值,每个计算结果位置都放置在对应节点中,这些节点称为虚拟节点。在实际应用中,通常将虚拟节点数设置为32甚至更大,因此即使很少的服务节点也能做到相对均匀的数据分布。
来访请求根据它的特征量(header/body里的值都可以),根据特定的算法md5变成摘要,通过hashCode值得到int(hashId)放到环上。 Java中的TreeMap(排序,tailMap方法能找到最近的节点)可以存放这种结构。
url_hash(第三方) 依据URL分配方式
least_conn 最少连接方式
缓存
浏览器会有自己的缓存,Nginx可以控制浏览器的缓存时间expires。
- 浏览器缓存:
加速用户访问,提升单个用户(浏览器访问者)体验,缓存在本地 - 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协议来实现的。
KeepAlive需要注册为系统服务
(init.d 和 sysconfig 拷贝到系统里面就好了 systemctl start Keepalived.service )
Keepalived配置Nginx自动重启。
Keepalived双机主备-存在资源浪费
Keepalived双主热备
LVS 负载均衡
为什么需要 LVS+NGINX
LVS 模式 DR
LVS的负载均衡算法
静态算法
静态:根据LVS本身自由的固定的算法分发用户请求。
- 轮询(Round Robin 简写’rr’):轮询算法假设所有的服务器处理请求的能力都一样的,调度器会把所有的请求平均分配给每个真实服务器。(同Nginx的轮
- 加权轮询【常用】(Weight Round Robin 简写’wrr’):安装权重比例分配用户请求。权重越高,被分配到处理的请求越多。(同Nginx的权重)
- 源地址散列(Source Hash 简写’sh’):同一个用户ip的请求,会由同一个RS来处理。(同Nginx的ip_hash) 4. 目标地址散列(Destination Hash 简写’dh’):根据url的不同,请求到不同的RS。(同Nginx的url_hash)
动态算法
动态:会根据流量的不同,或者服务器的压力不同来分配用户请求,这是动态计算的。
- 最小连接数(Least Connections 简写’lc’):把新的连接请求分配到当前连接数最小的服务器。
- 加权最少连接数【常用】(Weight Least Connections 简写’wlc’):服务器的处理性能用数值来代表,权重越大处理的请求越多。Real Server 有可能会存在性能上
动态获取不同服务器的负载状况,把请求分发到性能好并且比较空闲的服务器。 - 最短期望延迟(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
最终结果,会把这个请求交给得出运算结果最小的服务器。 - 最少队列调度(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机上。实现了分布式系统高可用。