Nginx
Nginx是什么?
Nginx 是一款轻量级的 HTTP 服务器
,用于服务端的 反向代理
和 负载均衡
正向代理:代理浏览器访问服务器
反向代理:代理服务器处理浏览器的请求
反向代理的好处:
浏览器只知道反向代理服务器的ip地址,不知道真实的服务器的ip地址,可以起到保护服务器不被攻击的作用。
除此之外,Nginx还带有健康检查
功能,会定期向集群里的所有服务器发送健康检查请求,来检查集群中是否有服务器处于异常状态。异常机器就不会得到请求转发。
好处是:保证客户端访问的稳定性。
Nginx还有动静分离
的功能,将接收到的请求分为动态请求和静态请求
。
只有动态请求才转发给服务器。而静态请求直接从 nginx 服务器所设定的路径去取对应的资源
好处是:可以减轻后端服务器压力,提高静态资源访问速度
负载均衡策略
轮询
默认的负载均衡策略。每个请求会按时间顺序逐一分配到不同的后端服务器。
特点
在轮询中,如果服务器down掉了,会自动剔除该服务器。
此策略适合多台服务器配置相当时使用。
参数
参数 | 含义 |
---|---|
fail_timeout和max_fails | 在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,针对该服务器的请求都失败了max_fails 次,那么认为该服务器会被认为是停机了 |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里 |
down | 标记服务器永久停机了 |
weight
权重方式,在轮询策略的基础上指定轮询的几率
例子如下:
#动态服务器组
upstream dynamic_zuoyu {
server localhost:8080 weight=2; #tomcat 7.0
server localhost:8081; #tomcat 8.0
server localhost:8082 backup; #tomcat 8.5
server localhost:8083 max_fails=3 fail_timeout=20s; #tomcat 9.0
}
在该例子中,weight参数用于指定轮询几率,weight的默认值为1
weight的数值与访问比率成正比,比如Tomcat 7.0被访问的几率为其他服务器的两倍。
注意
权重越高分配到需要处理的请求越多。
此策略可以与least_conn和ip_hash结合使用。
此策略比较适合服务器的硬件配置差别比较大的情况。
ip_hash
指定负载均衡器按照基于客户端IP的分配方式,这个方法确保了相同的客户端的请求一直发送到相同的服务器,可以解决session不能跨服务器的问题。
注意:
此策略适合有状态服务,比如session。
当有服务器需要剔除,必须手动down掉。
least_conn
把请求转发给连接数较少
的后端服务器。
此负载均衡策略适合请求处理时间长短不一
造成服务器过载
的情况。
Nginx底层原理:IO多路复用
IO多路复用是一种同步
IO模型,实现一个线程
监视多个文件描述符fd
;一旦某个文件描述符fd就绪
,就能够通知应用程序进行相应的读写操作;没有fd就绪时会阻塞应用程序,交出cpu
。
通过这种方式,Nginx 就完全消除了 I/O 阻塞,把 CPU 利用得“满满当当”,又因为网络收发并不会消耗太多 CPU 计算能力,也不需要切换进程、线程,所以整体的 CPU 负载是相当低的。
epoll 还有一个特点,大量的连接管理工作都是在操作系统内核里做的,这就减轻了应用程序的负担,所以 Nginx 可以为每个连接只分配很小的内存维护状态,即使有几十万的并发连接
也只会消耗几百 M 内存。