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;
}

Nginx 高频面试题汇总相关推荐

  1. 超经典,阿里巴巴历年高频面试题汇总:前端岗

    这个系列计划收集几百份朋友和读者的面经,作者合集方便查看,各位有面经屯着可以联系我哦 本系列历史文章: 阿里巴巴历年经典面试题汇总:Java岗 学姐百度实习面经 学姐,来挑战字节最牛部门 最强阿里巴巴 ...

  2. Redis高频面试题汇总(2021最新版)

        本文已收录于专栏 ⭐️<Redis面试题汇总--2021最新版本>⭐️ 上千人点赞收藏,全套Redis高频面试题,大厂必备技能! 面试官心理分析 从面试官的角度分析,出这道题的目的 ...

  3. 【网络协议】专题总结以及网络协议高频面试题汇总(8篇)

    这是一份超详细的HTTP协议攻略,内容大纲如下: 内容如下(点击即可跳转): 一篇文章带你详解 HTTP 协议(上) 一篇文章带你详解 HTTP 协议之报文首部及字段详解(中) 一篇文章带你详解 HT ...

  4. Java高频面试题汇总(2022)

    Java 1. ArrayList和LinkedList的区别 Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的. Array获取数据的时间复杂度是O(1 ...

  5. 【运维面试】2020年9月最新运维高频面试题汇总

    前言 关于运维面试的高频问题,在后续还会继续补充,面试是一次综合能力的考察,不仅仅需要你的技术过关,还需要考察你的沟通能力,抗压能力,以及职场习惯. 职场习惯中又包括: 是否守规矩,是否合群,是否有担 ...

  6. 大数据技术高频面试题汇总

    一.Hadoop 1.Hadoop相关问题汇总 Hadoop默认不支持LZO压缩,如果需要支持LZO压缩,需要添加jar包,并在hadoop的cores-site.xml文件中添加相关压缩配置: Ha ...

  7. 【面试题】2021年PHP高频面试题汇总

    1.get,post 的区别 1.GET在浏览器回退时是无害的,而POST会再次提交请求. 2.GET产生的URL地址可以被Bookmark,而POST不可以. 3.GET请求会被浏览器主动cache ...

  8. java instanceof用法_Java基础高频面试题汇总(1.4W字详细解析)

    注:由于公众号文章推送规则的改变,所以为了大家能够准时收到我们的文章推送,请记得将公众号:JAVA编程语言 设为星标-这样就不会错过每一篇精彩的推送啦~ 1. Java语言有哪些特点 (1)简单易学. ...

  9. elasticsearch java对象 驼峰原则_2020年Java基础高频面试题汇总(1.4W字详细解析)...

    1. Java语言有哪些特点 (1)简单易学.有丰富的类库 (2)面向对象(Java最重要的特性,让程序耦合度更低,内聚性更高) (3)与平台无关性(JVM是Java跨平台使用的根本) (4)可靠安全 ...

最新文章

  1. SAP零售行业解决方案初阶 1
  2. 802.1AE保护局域网安全
  3. linux终端传文件,如何使用Linux FTP命令传输文件
  4. Python之——遇到的小知识点总结
  5. acdream 1023 xor按位思考
  6. FileInputStream
  7. Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)
  8. codevs3143 二叉树的序遍历
  9. Java数组--数组常用的办法;
  10. 设计模式 (十六) 命令模式
  11. pillow 保存图像路径_python利用pillow包处理图片
  12. ubuntu 安装 tree 命令
  13. Window10 ie自带浏览器下载乱码
  14. Android基础学习笔记14:安卓手势编程
  15. 计算机价格谈判议程,谈判议程
  16. 【Excel】之数据透视表及动态图表
  17. 楼氏电子推出Raspberry Pi 开发工具包,为新物联网应用和行业语音整合提供支持
  18. python实现AES对文件加解密(这里使用ECB密码本模式)
  19. 数据扩充与数据预处理
  20. GDAL ogr2ogr 转换mif 为sqlite

热门文章

  1. IU酒店逆势突围增长,9月酒店品牌影响力(MBI)提升至20位!
  2. QQ在线人数统计图数据解析
  3. THREE.JS镜头随鼠标晃动效果
  4. 【转】2018最新csdn修改博客皮肤模板教程
  5. SQL SERVER版本补丁体系及升级
  6. 计算机数据存储的变迁,【IT产业20年变迁】从0到1的二进制世界,存储设备20年发展历程...
  7. GIT新建分支后idea如何拉取新分支到本地
  8. Python 链表反转
  9. c语言程序二级模拟试卷,C语言程序设计二级考试模拟题集.doc
  10. 服务器能识别手机型号,iOS获取当前设备型号等信息(全)包含iPhone7和iPhone7P