1. 什么是Nginx ?
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。
2. 什么是正向代理?
客户端请求目标服务之间的一个代理服务器。
请求会先经过这个代理服务器,然后在转发请求到目标服务器。获得内容后在响应给客户端。
3. 什么是反向代理?
用户请求目标服务器,由代理服务器决定访问哪个ip。
类比:你去学校报名上学,由教务指派你去哪个班级读书。
4. 反向代理路由图
5. Nginx 进程模型
当Nginx 启动后,默认会启动两个进程。
1.Master 进程
2.Work 进程
5.1 如何修改worker 进程数?
在 conf/nginx.conf 文件中修改 worker_processes 数字即可。
5.2 Nginx 基本命令有哪些?
./nginx -s stop
./nginx -s quit
./nginx -s reload
./nginx
./nginx -t
5.3 Nginx进程模型图
6. Nginx 抢占机制
6.1 传统服务器事件处理
同步阻塞请求方式,当一个client 阻塞后,后续其他client无法进行处理。
解决方式:重新fork 一个新的worker进程。使得阻塞client走新的worker 进程处理。
弊端:资源开销大,成本高!
6.2 Nginx事件处理
使用异步非阻塞模式(类似多路复用器)。
在Linux 环境中使用 epoll 模型,来处理工作进程。能处理6-8万个请求。
6.3 Nginx.conf 配置结构
main #全局配置
event #配置工作模式以及连接数
http #http模块相关配置
server #虚拟主机配置,可以有多个
location #路由规则,表达式
upstream #集群,内网服务器
6.4 同步与异步,阻塞与非阻塞
6.4.1 同步(客户端)阻塞(服务器)
客户端发送请求给服务端,此时服务端处理任务时间久,则客户端被服务端阻塞,所以客户端会一直等待服务端的响应,此时客户端不能做其他任何事,服务端也不会接受其他客户端的请求,这种通信机制比较简单粗暴,但是效率不高。
6.4.2 同步(客户端)非阻塞(服务器)
客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候虽然客户端会一直等待响应,但是服务端可以处理其他的请求,过一会回来处理原先的。这种方式很高效,一个服务端可以处理很多请求,不会在因为任务没有处理完而堵着,所以这是非阻塞的。
6.4.3 异步(客户端)阻塞(服务器)
客户端发送请求给服务端,此时服务端处理任务的时间很久,但是客户端不会等待服务器响应,它可以做其他的任务,等服务器处理完毕后再把响应结果返回客户端,客户端得到回调后在处理服务端的响应,这种方式可以避免客户端一直处于等待状态,优化了用户体验,其实就是类似于网页里面的ajax异步请求。
6.4.4 异步(客户端)非阻塞(服务器)
客户端发送请求给服务端,此时服务端处理任务时间很久,这个时候的任务虽然处理时间会很久,但是客户端可以做其他的任务,因为他是异步的,可以在回调函数里处理响应,同时服务端是非阻塞的,所以服务端可以去处理其他的任务,此时,这个模式就显得非常的高效
6.5 使用Gzip压缩提升请求效率
6.6 Nginx的模块化设计解析
6.7 Nginx的集群负载均衡解析
7.Nginx 中 uptream 指令参数
max_conns:最大连接数。
举例:当前有10个请求数
server1 :192.168.117.129:8080 max_conns=2;
server2 :192.168.117.130:8080 max_conns=3;
server3 :192.168.117.131:8080 max_conns=4;
结果:
server1最多处理2个,
server2最多处理3个,
server3最多处理4个,
还有剩余的一个请求将会报错,502 。
只有当server处理完成当前的请求,才会重新处理新的请求。
slow_start:慢增长。必须使用于集群,不能单独使用。
举例:
server1 :192.168.117.129:8080 weight=6 slow_start=60s;
server2 :192.168.117.130:8080 weight=2;
server3 :192.168.117.131:8080 weight=2;
说明:server1的权重,将会从在60s的时间内从0-6;
down:不会被访问到。
server1 :192.168.117.129:8080 down;
说明:server1 是不会访问到。
backup:备用机。
举例:
server1 :192.168.117.129:8080 backup;
server2 :192.168.117.130:8080 weight=2;
server3 :192.168.117.131:8080 weight=2;
说明:正常情况下不会被访问到,当其他机器挂掉后,方可访问。
max_fails:最大失败次数,到达失败次数,则认为该服务器宕机。请求将不会访问到这台机器上。默认为1
fails_timeout:失败时间段,默认10s
举例:
server1 :192.168.117.129:8080 max_fails=2 fails_timeout=15s;
server2 :192.168.117.130:8080 weight=2;
server3 :192.168.117.131:8080 weight=2;
说明:15s内请求server1失败达到2次,认为server1已经宕机,再过15s,这15s内,不会有请求到这台机器上,而是会请求到其他正常的机器上,15s后,在请求到server1上,如果还是失败,则继续重复上述过程,直到恢复。
8.upstream 中设置keepalive 的作用?
提高系统的吞吐量
9. ip_hash 负载均衡
根据用户的请求的IP ,经过hash算法,得到一个特定的值,根据这个值判断该请求落在那个server 服务器下,相同的IP请求的会话,只会打在同一台服务器上。
公式 hash%node_counts(服务器结点数) = index
举例:
PS: 如果通过IP地址使用这个Hash 算法,它只会hash ip 地址的前三段 例如192.168.1。
重点:如果想要移除集群里的一台机器,就需要在节点后面加上down,而不是直接注释或者删除掉,因为直接删除的话,之前ip_hash 中的算法就需要重新计算,会话,缓存都会失效
9.1hash 算法带来的问题
如果有服务器减少或者增加,所有请求的hash都需要重新计算。导致请求的时间增加。
解决方式:采用一致性hash算法。
10 Nginx 浏览器缓存
10.1 expires 指令
expires [time] :设置过期时间
举例:expires 10s 每当请求后10s 缓存过期
expires @[time] : 设置具体缓存过期时间
举例:expires @22h40m 每天 22点40分,缓存失效
expires -[time] :设置已经过期时间
举例:expires -2h 缓存已经过期两小时
expires epoch 不使用缓存
expires off 默认关闭缓存。
expires max 最大时间缓存
11 Nginx反向代理缓存
proxy_cache_path 设置缓存保存目录
keys_zone 设置共享内存以及占用的空间
max_size 设置缓存大小
inactive 超过此时间,则缓存自动清理。
use_temp_path 关闭临时目录
proxy_cache_path /usr/local/nginx/upstream_cache
keys_zone=mycache:5m (mycache为名字,随意设置)
max_size=5g
inactive=30s 当我们的缓存超过30秒,就自动清理
use_temp_path off ;
继续配置,在server{
#开启缓存
proxy_cache mycache;
#针对200 和 304 状态码缓存过期时间为5小时
proxy_cache_valid 200 304 5h;
}