Web 服务器Event-driven
事件驱动模型 是什么?
少量 worker 用 epoll 处理海量连接,一个连接不占一个进程
类比:一个服务员照看 100 桌,谁举手就去谁那
和每连接一线程的差别
Apache prefork 每个连接占一个进程,1 万连接就要 1 万个进程,内存和上下文切换都撑不住。Nginx 一个 worker 用 epoll 同时监听上万个 socket,谁有数据就处理谁。
为什么能扛
Nginx 处理请求时不阻塞:读写磁盘、转发上游都是异步事件。所以 worker 数只需要等于 CPU 核数,每个 worker 就能吃满一个核。
- worker_processes auto; 按核数
- worker_connections 1024 起步,按并发调大
- worker_rlimit_nofile 要一起调,否则文件描述符不够
不是万能的
如果模块里做了阻塞操作(读大文件、同步查数据库),事件模型就退化成阻塞。Nginx 适合 IO 密集型,CPU 密集型任务要交给后端。