1.Nginx架构和安装

本文最后更新于:2023年12月5日 晚上

概述

功能

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 进程的功能:

  1. 对外接口,接收外部的操作(信号)
  2. 对内转发,根据外部的操作的不同,通过信号管理 worker
  3. 监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
  4. 读取 nginx 配置文件,并验证其有效性和正确性
  5. 建立、绑定和关闭 socket 连接
  6. 按照配置生成、管理和结束工作进程
  7. 不中断服务,实现平滑升级(升级失败进行回滚处理)、重启服务并应用新的配置
  8. 开启日志文件,获取文件描述符
  9. 编译和处理 per 脚本

worker 进程的功能:

  1. 所有 worker 进程都是平等的
  2. 实际处理网络请求,将请求依次送入各个功能模块进行处理
  3. I/O 调用,获取响应数据
  4. 与后端服务器通信,接受后端处理器的处理结果
  5. 缓存数据,访问缓存索引,查询和调用缓存数据
  6. 发送请求结果,响应客户的请求

进程间通信

master 与 worker 通信:worker 进程是由 master 进程生成,主进程在启动之后,建立一个主进程指向工作进程的单向通道,master 进程通过信号机制和与外界通信,当接受到需要处理的信号时,就通过管道向相关的进程发送正确的指令,每个 worker 进程都有能力捕捉管道中的可读事件,当管道中有可读事件时,worker 进程就会从管道中读取并解析指令,然后才去相应的执行动作,这样就完成了主进程与子进程的交互

worker 进程之间通信:worker 进程之间只要能够取得彼此的信息,建立管道即可通信,但是由于 worker 进程之间是完全隔离的,因此一个进程想要知道另外一个进程的状态信息,就只能通过 master 进程来实现。

master 进程在生成 worker 进程之后,会把新进程的 ID 以及针对该进程建立的管道句柄传递给其他 worker 进程,这样能实现通过 master 进程进行通信

http 连接建立

  1. nginx 启动,master 进程加载配置文件
  2. master 进程初始化监听的 socket
  3. master 进程 fork 出多个 worker 进程
  4. worker 进程,竞争新的连接,获胜方通过三次握手,建立 socket 连接,开始处理请求

http 处理过程

模块

nginx 高度模块化

  • 核心模块:正常运行必不可少,提供错误日志记录、配置文件解析、事件驱动机制、进程管理等核心功能
  • 标准 http 模块:提供 http 协议解析相关的功能,比如:端口配置、网页编码设置、http 响应头设置等
  • 可选 http 模块:主要用于扩展标准的 http 功能,让 nginx 可以处理一些特殊的服务,比如:flash 多媒体传输、解析 GeoIP 请求、网络传输压缩、安全协议 SSL 支持等
  • 邮件服务服务:主要用于支持 nginx 的邮件服务,包括对 pop3 协议、IMAP 协议和 SMTP 协议的支持
  • stream 服务模块:实现反向代理功能,包括 TCP 协议代理
  • 第三方面模块:为了扩展 nginx 服务器应用,完成开发者自定义功能,比如:json 支持、lua 支持等

安装

推荐编译安装,可以自定义功能

# 查看编译参数
[root@4710419222 ~]# nginx -V
nginx version: nginx/1.15.7
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2p  14 Aug 2018
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=../openssl-1.0.2p --with-pcre=../pcre-8.42 --with-pcre-jit --with-ld-opt=-ljemalloc
# 启动前,可以检查配置文件nginx.conf的合法性
[root@4710419222 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

1.Nginx架构和安装
http://blog.lujinkai.cn/运维/Nginx/1.Nginx架构和安装/
作者
像方便面一样的男子
发布于
2020年12月25日
更新于
2023年12月5日
许可协议