实现百万并发不仅靠 Nginx 本身性能,还要操作系统、网络、配置的全面协同@mikechen
连接配置优化
理论最大并发连接数 = worker_processes × worker_connections
。
worker_connections 65535;
每个 worker 进程可以独立处理多个连接,增加 worker 进程数可以提高并行处理能力。
除此之外,增加单个 worker 进程可以打开的最大文件描述符数,以支持更多的并发连接。
worker_rlimit_nofile 65535;
每个连接都需要一个文件描述符,增加限制可以支持更多连接。
连接处理优化
epoll
是 Linux 下性能最好的事件处理机制,适合高并发。
events { use epoll; multi_accept on; }
在 events
块中,使用 use epoll;
等高效的事件驱动模块,Nginx 通常会自动选择最佳的可用模块。
select
通常有文件描述符数量的硬性限制(通常是 1024),poll
虽然没有这个限制。
但在实现上仍然可能受限,这使得它们难以处理大规模并发连接,epoll
的出现彻底改变了 Linux 下高并发网络编程的方式。
epoll
不是每次都轮询所有的文件描述符,而是采用事件通知的方式。
当某个文件描述符上的事件(如可读、可写)发生时,内核才会主动通知应用程序。这避免了无谓的遍历和检查,效率大大提高。
缓存与压缩优化
启用 Gzip 压缩(减少带宽占用),如下所示:
gzip on; gzip_min_length 1k; gzip_types text/plain text/css application/json; gzip_comp_level 5;
Gzip 减小响应体大小,提高传输效率。
gzip_min_length 控制多小的文件值得压缩(避免浪费 CPU)。
文件传输优化
使用内核零拷贝机制直接将文件内容从磁盘发送到网络套接字,减少数据在用户空间和内核空间之间的拷贝次数,提高文件传输效率。
sendfile on;
使用内核零拷贝机制,直接将文件内容从磁盘发送到网络套接字。
减少数据在用户空间、和内核空间之间的拷贝次数,提高文件传输效率。
总之,避免用户态↔内核态拷贝,加快静态文件传输速度。
通过以上这些优化策略的组合应用,可以显著提升 Nginx 在高并发场景下的性能。