1.Nginx架构和安装
概述
功能
nginx 的功能主要有两个:web 服务器和反向代理
- html、图片、js、css 等静态资源的服务器
- http/https 协议的反向代理
- 结合 FastCGI/uWSGI/SCGI 等协议反向代理动态资源请求
- tcp/udp 协议的请求转发(反向代理)
- imap4/pop3 协议的反向代理
基础特性
- 模块化设计,较好的扩展性
- 高可靠性
- 支持热部署:不停机的更新配置文件,升级版本,更换日志文件
- 低内存消耗:1000 个 keep-alive 连接模式下的非活动连接,仅需 2.5m 内存
- event-driven、aio、mmap、sendfile
web 相关的功能
- 虚拟主机(server)
- 支持 keep-alive 和管道连接(利用一个连接做多次请求)
- 访问日志(支持基于日志缓冲提高性能)
- url rewrite
- 路径别名
- 基于 ip 及用户的访问控制
- 支持速率限制及并发数限制
- 重新配置和在线升级而无须终端客户的工作进程
架构
nginx 是多进程,一个 master 主进程和若干 worker 工作进程组成
master 进程的功能:
- 对外接口,接收外部的操作(信号)
- 对内转发,根据外部的操作的不同,通过信号管理 worker
- 监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
- 读取 nginx 配置文件,并验证其有效性和正确性
- 建立、绑定和关闭 socket 连接
- 按照配置生成、管理和结束工作进程
- 不中断服务,实现平滑升级(升级失败进行回滚处理)、重启服务并应用新的配置
- 开启日志文件,获取文件描述符
- 编译和处理 per 脚本
worker 进程的功能:
- 所有 worker 进程都是平等的
- 实际处理网络请求,将请求依次送入各个功能模块进行处理
- I/O 调用,获取响应数据
- 与后端服务器通信,接受后端处理器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
进程间通信
master 与 worker 通信:worker 进程是由 master 进程生成,主进程在启动之后,建立一个主进程指向工作进程的单向通道,master 进程通过信号机制和与外界通信,当接受到需要处理的信号时,就通过管道向相关的进程发送正确的指令,每个 worker 进程都有能力捕捉管道中的可读事件,当管道中有可读事件时,worker 进程就会从管道中读取并解析指令,然后才去相应的执行动作,这样就完成了主进程与子进程的交互
worker 进程之间通信:worker 进程之间只要能够取得彼此的信息,建立管道即可通信,但是由于 worker 进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息,就只能通过 master 进程来实现。
master 进程在生成 worker 进程之后,会把新进程的 ID 以及针对该进程建立的管道句柄传递给其他 worker 进程,这样能实现通过 master 进程进行通信
http 连接建立
- nginx 启动,master 进程加载配置文件
- master 进程初始化监听的 socket
- master 进程 fork 出多个 worker 进程
- worker 进程,竞争新的连接,获胜方通过三次握手,建立 socket 连接,开始处理请求
http 处理过程
模块
nginx 高度模块化
- 核心模块:正常运行必不可少,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能
- 标准 http 模块:提供 http 协议解析相关的功能,比如:端口配置、网页编码设置、http 响应头设置等
- 可选 http 模块:主要用于扩展标准的 http 功能,让 nginx 可以处理一些特殊的服务,比如:flash 多媒体传输、解析 GeoIP 请求、网络传输压缩、安全协议 SSL 支持等
- 邮件服务服务:主要用于支持 nginx 的邮件服务,包括对 pop3 协议、IMAP 协议和 SMTP 协议的支持
- stream 服务模块:实现反向代理功能,包括 TCP 协议代理
- 第三方面模块:为了扩展 nginx 服务器应用,完成开发者自定义功能,比如:json 支持、lua 支持等
安装
推荐编译安装,可以自定义功能
1 | # 查看编译参数 |
1 | # 启动前,可以检查配置文件nginx.conf的合法性 |