Nginx - 概述
Nginx的组成
- Nginx二进制可执行文件 (由各个模块编译出的一个文件)
- Nginx.conf (控制Nginx的行为)
- access.log (访问日志)
- error.log (定位问题)
Nginx的性能瓶颈
- 处理小文件时考虑握手性能RSA
- 处理大文件时考虑对称加密性能AES
Nginx进程结构
- 多进程而不是多线程?
因为Nginx为了保证高可用,如果使用多线程结构,线程之间共享地址空间,当某个第三方模块引发地址空间导致的错误时,在地址越界出现时,会导致整个nginx挂掉。 - 特点
进程间的通信使用共享内存,信号实现。worker进程和CPU绑定,数量和CPU核数一致,有效使用CPU缓存,减少缓存失效命中率。Master进程管理监控worker进程。
Nginx进程管理:信号
reload流程
- 不停机载入新配置
Nginx连接池
nginx的连接包括:对下游客户端的连接,对上游服务器的连接。
nginx每一个worker进程都有一个ngx_cycle_t
的数据结构,里面有三个数组:connections
, read_events
,write_events
。每个连接都对应一个读事件和一个写事件,所以它们的数组标号是对应的。nginx默认的worker connections
大小是512,这个一般会修改。
又见LRU
OpenResty Ngx_http_lua_api中使用lua_shared_dict分配共享内存,该内存使用一个红黑树结构来保存key-value。当lua_shared_dict预分配的内存使用完后,会用LRU淘汰里面的键值对。
Nginx最常用容器:红黑树
红黑树:自平衡二叉查找树
- 高度不会超过2 * log(n)
- 增删改查复杂度 O(log(n))