Nginx 思维导图

Nginx(发音同“engine X”)是异步框架的网页服务器,也可以用作反向代理、负载平衡器和 HTTP 缓存。该软件由伊戈尔·赛索耶夫创建并于 2004年 首次公开发布。2011年 成立同名公司以提供支持。

2019年3月11日,Nginx 公司被 F5 Networks(英语:F5 Networks)以6.7亿美元收购。

Nginx 是免费的开源软件,根据类 BSD 许可证的条款发布。一大部分 Web 服务器使用 Nginx,通常作为负载均衡器。1

Nginx 思维导图 2

编译

选择官方模块

  • with

  • without

指定运行时路径、参数

添加第三方模块

  • 下载第三方模块

    • config指定模块位置

    • C源码定义模块

添加动态模块

指定编译连接参数

命令行

参数

  • -s发送信号

    • stop

    • quit

    • reload

    • reopen

  • 测试配置

    • -t,-T,-q
  • 帮助信息

    • -h,-?
  • 版本信息

    • -v,-V
  • 指定运行参数

    • -g

    • -c

    • -p

运维监控

日志

  • 类型

    • error日志

      • debug_connection对指定连接记日志
    • access日志

      • 压缩

      • 缓存

  • 记录日志方式

    • 直写文件

    • syslog

    • 循环写内存

stub_status

  • accepted

  • handled

  • requests

  • active

  • reading

  • writing

  • waiting

进程模型

通讯方式

  • 信号

    • TERM, INT

    • QUIT

    • HUP

    • USR1

    • USR2

    • WINCH

  • 共享内存

    • slab内存管理

    • 互斥锁

进程

  • master

  • worker

  • cache manager

  • cache loader

对象容器

数组

链表

队列

红黑树

基数树

哈希表

  • 桶大小向上对齐cpu cache line

内存池

request

  • 随请求结束释放

connection

  • 随连接断开释放

连接池

事件池

上下游共享

keepalive长连接池

模块设计

模块类型

  • core模块

  • event模块

  • http模块

  • conf模块

  • stream模块

  • mail模块

模块通用接口

  • init_master

  • init_module

  • init_process

  • init_thread

  • exit_thread

  • exit_process

  • exit_master

请求的处理阶段

http

  • POST_READ阶段

  • SERVER_REWRITE阶段

  • FIND_CONFIG阶段

  • REWRITE阶段

  • POST_REWRITE阶段

  • PREACCESS阶段

  • ACCESS阶段

  • POST_ACCESS阶段

  • PRECONTENT阶段

  • CONTENT阶段

  • LOG阶段

stream

  • POST_ACCEPT阶段

  • PREACCESS阶段

  • ACCESS阶段

  • SSL阶段

  • PREREAD阶段

  • CONTENT阶段

  • LOG阶段

变量

按应用场景

  • http模块

  • stream模块

按功能

  • 框架变量

    • upstream变量
  • 模块变量

按使用方式

  • 提供方

  • 使用方

反向代理

http

  • 上游

    • 协议

      • http/https

      • fastcgi

      • scgi

      • uwsgi

      • websocket

      • spdy

      • grpc

      • memcached

      • redis

    • 限速

  • 缓存

    • 缓存类型

      • 响应内容缓存

        • 分片
      • openfile缓存

      • 浏览器缓存

    • 缓存大小

    • 更新淘汰方式

  • 下游

    • http/https

    • 限速

  • 平衡上下游网速

    • 接收请求包体

    • 接收响应包体

stream

  • tcp

  • udp

  • 透传客户端地址

    • proxy_protocol

    • IP地址透传

    • 上游服务直接返回报文

mail

负载均衡

  • 策略

    • 轮询

    • 哈希

      • 一致性哈希
    • 基于第三方服务

  • 健康检查

  • 连接池

  • 配置DNS服务

nginx.conf指令

类型

  • 块指令

    • main

    • http

      • server

      • upstream

      • location

      • if

      • limit_except

      • map

      • geo

    • event

    • stream

      • server

      • upstream

      • map

      • geo

  • 普通指令

    • 脚本类

    • 设置动作

    • 存储值

父子指令块配置合并规则

server匹配规则

  • 精确匹配

  • 泛域名

  • 正则表达式

  • 默认server

location匹配规则

  • 前缀字符串匹配

  • 正则表达式匹配

参数单位

  • 时间

  • 空间

性能优化

内存效率

  • tcp

    • linux pressure模式
  • http

CPU效率

  • 绑定CPU

  • 静态优先级

  • 谨慎使用消耗CPU过大的模块

  • 线程池

  • worker间负载均衡

    • 建连接

    • 多网卡队列

网络效率

  • tcp

    • 建立连接

      • FastOpen

      • backlog

      • 超时时间

    • 传输

      • 缓冲区大小

        • BGP
      • 拥塞控制

        • 初始拥塞窗口
      • 延迟批量发送

        • tcp_nodelay

        • tcp_nopush

    • 关闭连接

      • keepalive释放资源

      • 减少time_wait

      • 超时时间

  • http

    • keepalive长连接

    • 应用层缓冲区大小

      • header

      • body

    • lingering_close

    • 超时时间

  • TLS/SSL

    • session缓存

    • OCSP

    • 会话票据

    • 算法选择

      • 对称加密算法

        • 分组模式
      • 非对称加密算法

  • 网卡

磁盘IO

  • AIO

  • directio

  • 零拷贝

    • sendfile
  • 日志文件

    • 写入缓存

    • 压缩后写入

    • syslog

  • 减少读取次数

    • empty_gif模块
  • 磁盘

openresty

指令

  • http

    • 处理阶段

    • 响应过滤

    • 进程启动

    • upstream连接上游

    • ssl

    • 共享内存

  • stream

    • 处理阶段

    • 进程启动

    • upstream连接上游

    • 共享内存

    • ssl

lua模块

SDK

  • 正则表达式

  • 流程控制类

  • 版本与配置

  • 进程信息

  • 定时器

  • 子请求

  • 用户请求

  • 时间类API

  • 多线程

    • coroutine

    • thread

  • shared_dict

  • socket

    • tcp

    • udp

  • response header

  • 内容输出

  • 常量

  • 其他

    • var变量

    • arg参数

    • 日志

      • log
    • get_phase

    • sleep


  1. https://zh.wikipedia.org/zh-cn/Nginx↩︎

  2. https://github.com/russelltao/geektime-nginx↩︎