核心是编译启用线程池与aio能力:必须添加--with-threads、--with-file-aio、--with-http_ssl_module和--with-http_v2_module,再配合nginx.conf中定义thread_pool、配置aio threads及directio等运行时指令协同生效。

源码编译时启用 Nginx 的多线程与异步优化,核心不是“开启多线程模式”,而是通过编译参数激活底层异步能力(如线程池、AIO),再配合运行时配置协同生效。Nginx 本身仍是多进程模型,worker 进程内不默认用多线程处理请求,但可将阻塞操作(如大文件读取、SSL 握手)卸载到线程池执行,避免阻塞事件循环。
编译阶段必须启用的关键参数
以下参数需在 ./configure 时显式添加,缺一不可:
-
--with-threads:启用线程池支持(基础前提)。没有它,aio threads和thread_pool指令会报错。 -
--with-file-aio:启用 Linux 原生异步文件 I/O(仅 kernel ≥ 2.6.22 有效)。搭配directio使用,对视频、大附件等场景效果明显。 -
--with-http_ssl_module:HTTPS 场景下 SSL 握手和加解密是典型阻塞点,线程池优化依赖此模块。 -
--with-http_v2_module:HTTP/2 多路复用会放大单 worker 处理压力,配合线程池更稳。
编译后必须配置的运行时项
光编译不够,还需在 nginx.conf 中配齐三要素:
-
定义线程池:
thread_pool default threads=16 max_queue=65536;
建议 threads 数 ≈ CPU 核心数 × 2~4,max_queue 避免任务堆积超时。 -
在 location 中启用 AIO + 线程池:
location /video/ {<br> aio threads=default;<br> directio 4m;<br> output_buffers 1 1m;<br>}
注意:directio值需 ≥ 文件系统块大小(通常 4K 或 4M),且文件需对齐,否则末尾仍会阻塞。 -
SSL 操作也走线程池(高 HTTPS QPS 必开):
ssl_session_cache shared:SSL:10m;<br>ssl_buffer_size 4k;<br># 若使用 OpenSSL 1.1.1+,可启用:<br>ssl_early_data on;
虽不直接调线程池,但结合--with-threads后,OpenSSL 的部分耗时操作会被自动调度到线程池。
配套的 events 和 worker 调优
异步能力要发挥出来,底层事件模型和进程调度也得匹配:
-
events { use epoll; multi_accept on; worker_connections 65535; }multi_accept on让单次系统调用 accept 尽可能多连接,减少唤醒次数;worker_connections需配合worker_rlimit_nofile提升系统级文件描述符限制。 -
worker_processes auto;+worker_cpu_affinity auto;
自动绑定 CPU 核心,减少跨核缓存失效,让每个 worker 稳定跑满一个核心,线程池任务才能高效分发。 - 避免盲目增大
worker_processes:超过物理核心数(尤其 >8)反而因调度开销导致性能下降,实测 8 核服务器设为 8 最均衡。
验证是否生效的简单方法
启动后检查日志和行为:
- 启动时无
unknown directive "aio"或unknown directive "thread_pool"报错,说明编译成功。 - 访问配置了
aio threads的路径(如大视频文件),用strace -p $(pgrep nginx) -e trace=io_submit,io_getevents观察能否捕获异步 I/O 系统调用。 - 压测对比:相同并发下,开启线程池 + AIO 后,
top中 worker 进程的 %CPU 更平稳,sys时间占比下降,idle波动减小。











