聊Web服务器软件,很多人第一反应对比Apache和Nginx,但核心差异不在好坏,而在于底层处理请求的机制。收到访问请求,服务器接收、处理、返回内容,不同软件采用完全不同的实现思路。主流两种模型,一种是一个连接分配独立处理单元,另一种是单个主调度单元统筹多组工作单元。
先说基于进程或者线程的模型。Apache prefork模式就是典型,主进程持续监听,新连接进来就fork一个子进程,这个子进程从头到尾处理这一次连接。后续推出worker模式改用线程,单个进程内创建多个线程,每条线程对应一个连接。这套逻辑写起来简单,开发扩展模块不用处理异步回调,代码按顺序编写即可。缺点很突出,每个进程、线程都会占用内存,哪怕连接只是空闲等待数据,内存占用不会释放。并发规模上来,几百个连接对应几百个进程线程,内存消耗巨大,CPU大量开销浪费在上下文切换。这种模型更适合并发量不大,但单次请求逻辑复杂的场景,比如搭配mod_php跑PHP,或是需要.htaccess目录动态配置的虚拟主机环境。

另一种是事件驱动、异步非阻塞模型,Nginx属于这类。启动后生成若干worker进程,每个worker依靠事件循环同时监听大量连接。哪个连接产生可读数据,就处理对应任务,完成立刻切换下一个,不会阻塞等待单条连接传输完成。单个worker承载几千并发连接属于常态,内存占用偏低。这套架构天生适合两类场景:快速分发静态文件,充当反向代理做负载均衡,转发请求给后端应用服务。短板在于,如果某个请求需要长时间运算,比如复杂数据库查询,事件循环会被卡住,后续所有连接都要排队等待。所以Nginx一般搭配PHP-FPM、Tomcat或者Gunicorn处理动态业务逻辑,自身只负责接入和转发。
两类模型不存在谁淘汰谁。现在线上常见架构,反而是两者配合工作。Nginx放在前端,处理静态资源、TLS握手、限流、请求转发;后端部署Apache或者Tomcat执行业务代码。Nginx利用低内存高并发扛住流量,Apache、Tomcat负责处理复杂业务逻辑,各司其职。
除这两类之外,Windows平台IIS也是一大分支,底层模型思路更接近Apache进程/线程方案,只是深度绑定Windows内核,跨平台对比意义不大。Tomcat、Jetty严格来说属于Servlet容器,归类为应用服务器,不是纯粹Web服务器。实际部署时经常搭配Nginx使用,边界划分并不绝对。
所以Web服务器软件按请求处理机制划分,就同步多进程/多线程、异步事件驱动两类。选型看请求特征,是多而轻量,还是少但处理繁重;看服务器内存资源,还有团队更熟悉哪套调试方式。没有绝对最优选项,只有适配场景的选择。