Nginx

type
Post
status
Published
date
Dec 25, 2025
slug
nginx
summary
category
技术分享
tags
nginx
icon
password
AI summary
Blocked by
Blocking
Category
Nginx 的设计哲学是事件驱动 + 异步非阻塞 + 模块化,这让它在单机上轻松处理数十万并发连接,内存占用极低,CPU 利用率极高。

进程模型(Master + Worker + 辅助进程)

Nginx 启动后会产生以下进程:
notion image
  • Master 进程(1 个,通常 root 启动)
    • 读取、解析、校验 nginx.conf
    • 根据配置 fork 出 Worker 进程
    • 绑定监听端口(listen)
    • 管理 Worker:监控存活、优雅 reload、平滑升级、接收信号(HUP、TERM 等)
    • 不处理任何客户端请求,只做“管理者”角色
    • reload 时:启动新 Worker 加载新配置 + 新 Lua 代码,旧 Worker 优雅退出(继续处理已有连接)
  • Worker 进程(默认等于 CPU 核数,可手动设置 worker_processes auto;
    • 每个 Worker 是单线程的事件循环(event loop)
    • 使用操作系统最高效的 I/O 多路复用机制:
      • Linux → epoll
      • BSD/macOS → kqueue
      • Windows → IOCP
    • 所有连接(监听 socket + 已建立连接)都在同一个线程里通过事件通知异步处理
    • 一个 Worker 可以同时持有几万到几十万连接(取决于 worker_connections
  • 辅助进程(可选,由 Master 启动)
    • Cache Loader:Nginx 启动时把磁盘上的缓存元数据加载到内存(只运行一次)
    • Cache Manager:定期清理过期缓存文件、检查磁盘空间
    • (OpenResty 中还可能有 Lua JIT 相关辅助进程)
 

事件驱动异步非阻塞机制(核心竞争力)

  • 每个 Worker 只用一个线程,通过 epoll 等监听成千上万的文件描述符(fd)。
  • 当某个连接有事件(可读、可写、超时、关闭)时,内核通知 Worker,Worker 立刻切换处理。
  • 网络 I/O、磁盘 I/O、后端代理等全部异步:不会阻塞 Worker 线程。
  • 这就是 Nginx 能同时服务百万连接的原因——没有上下文切换开销,没有线程争抢锁。

模块化架构

Nginx 几乎所有功能都由模块实现,编译时可静态/动态加载:
  • 核心模块:events、http、stream、mail 等
  • HTTP 模块:ngx_http_core_module、ngx_http_proxy_module、ngx_http_upstream_module、ngx_http_ssl_module、ngx_http_gzip_module…
  • 第三方模块:OpenResty 的 LuaJIT、lua-resty-*、ngx_lua 等
  • Lua 代码(content_by_lua_file、access_by_lua 等)其实是运行在 ngx_lua 模块的上下文里,reload 时新 Worker 会重新加载 Lua 脚本(结合你之前问的 Lua 热更新问题)。

配置加载与零宕机 reload(与 Lua 结合)

  • Master 读取 nginx.conf → 解析所有块 → fork 新 Worker
  • 新 Worker 加载新配置 + 重新编译缓存所有 Lua 代码
  • 旧 Worker 停止接受新连接,但处理完手中所有请求后才退出 → Lua 修改后 reload 完全零宕机,正在进行的连接不会断开(除非你设置了很短的 worker_shutdown_timeout)

Nginx 配置结构与主要常用字段参数

Nginx 配置是分层块结构,从外到内层层继承(内层可覆盖外层):

最常用参数分类

全局 / 进程相关(main 上下文)

参数
作用
推荐生产值
worker_processes
Worker 数量
auto(等于 CPU 核数)
worker_rlimit_nofile
每个 Worker 最大打开文件数
65535 或更高
worker_connections
每个 Worker 最大连接数
16384 ~ 65535
worker_shutdown_timeout
优雅退出超时(旧 Worker)
10s

events 块(事件机制)

http 块(HTTP 相关全局设置)

参数
作用
常用值
sendfile on
零拷贝发送静态文件
on
tcp_nopush on
结合 sendfile,减少小包
on
tcp_nodelay on
实时性要求高的场景
on
keepalive_timeout
客户端 keep-alive 超时
65s
client_max_body_size
最大上传大小
100m
proxy_cache_path
定义缓存目录(生产必配)
/var/cache/nginx levels=1:2 keys_zone=...

server 块(虚拟主机)

参数
作用
示例
listen
监听端口 + 协议
443 ssl http2; 80;
server_name
域名匹配
ssl_certificate / ssl_certificate_key
HTTPS 证书
/path/to/fullchain.pem;

location 块(最常用转发配置)

upstream 块(负载均衡)

Prev
2025年终总结
Next
MCP
Loading...
Article List
如果去做,还有一丝希望;但是不去做,就毫无希望
个人总结
技术分享
LLM
k8s
knative
agentic
istio
HAMI
Golang
转发
计算机网络
Redis
MySQL
Mysql