Nginx 高频面试题汇总

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;
#针对200304 状态码缓存过期时间为5小时
proxy_cache_valid 200 304 5h;
}
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值