1 Nginx架构基础

Nginx运行在企业内网的最外层,处理的流量最多,任何一种问题在不同数量级下解决方案是完全不同的,在处理Nginx场景中所有的问题都会被放大,所以要深入理解Nginx。

为什么采用Master-Worker模型

为什么Worker数量要与CPU核数相匹配

为什么在多个Worker进程间共享数据时TLS限流限速

1.1 Nginx的请求处理流程

WechatIMG1193

1.2 Nginx的进程结构

WechatIMG1195

单进程结构,只适用于开发调试,生产使用多进程结构

为什么不使用多线程结构?

Nginx保持高可用性高可靠性,多线程共享地址空间当某第三方模块引发了一个地址空间导致的段错误时,在地址越界出现时会导致整个Nginx进程挂掉

1.3 演示

nginx是一个多进程的程序,多进程间通讯可以使用共享内存、信号等,进程间的管理通常只使用信号

配置nginx进程数

# 将worker进程数改为2
worker_processes   2;
# 重启nginx
sbin/nginx -s reload

操作

# 一个master进程,是用root启动的,进程ID是4322,两个worker子进程
ps -ef | grep nginx
# 下面两个命令等效,两个worker进程退出master进程再创建两个新的worker进程
sbin/nginx -s reload
kill -SIGHUP 4322
# 关闭一个worker进程
kill -SIGTERM 11735,master进程会再次创建一个新的worker进程

Jietu20191004-125302

1.4 使用信号管理Nginx的父子进程

WechatIMG1196

  • TERM,INT 表示立刻停止nginx进程
  • QUIT 表示优雅地停止nginx进程
  • HUP 表示重启nginx进程
  • USR1 重新打开日志文件,进行日志文件的切割
  • USR2 只能通过kill,重启nginx用新的二进制nginx文件
  • WINCH 只能通过kill,此命令只会关闭work进制,master进程保留,可用于版本回退(执行nginx -s reload)

1.5 重载配置文件流程

WechatIMG1197

WechatIMG1198

1.6 热升级的完整流程

WechatIMG1199

WechatIMG1200

1.7 优雅地关闭worker进程流程

WechatIMG1201

1.8 网络收发与Nginx事件间的对应关系

1.8.1 网络传输

WechatIMG1202

1.8.2 TCP流与报文

WechatIMG1204

1.8.2 TCP协议与非阻塞接口

WechatIMG1206

读事件与写事件主体是Nginx

事件是生产者

事件分发消费器

1.9 演示:网络事件

Wireshark抓包

TCP层:进程间的通讯

IP层:机器间相互找到

1.10 Nginx的事件驱动模型

WechatIMG1209

1.11 epoll的优劣及原理

epoll:网络事件收集器模型

WechatIMG1212

1.12 Nginx请求切换

WechatIMG1214

1.13 同步&异步、阻塞&非阻塞之间的区别

1.13.1 阻塞调用

WechatIMG1216

1.13.2 非阻塞调用

WechatIMG1218

1.13.3 非阻塞调用下的同步与异步

WechatIMG1220