---
title: 面试题
taxonomy:
    category: docs
---

#### No.11：Nginx 为什么比 Apache 性能强？

Nginx 比 Apache 性能强的原因主要有以下几点：

1. Nginx 利用了 Linux Kernel 新引入的名为 epoll 的 I/O 多路复用 API。epoll 是一种高效的 I/O 事件通知机制，它可以同时监听多个文件描述符，当其中任何一个文件描述符就绪时，就会触发相应的事件。这样，Nginx 可以在一个线程中处理多个连接，提高了并发处理能力。

2. Nginx 以流量转发作为设计目标。它采用了事件驱动的异步非阻塞模型，可以高效地处理大量的并发连接。而 Apache 是从标准的磁盘文件和 CGI 协议出发的一个 Web 容器，内部的很多设计都是基于进程和阻塞的，所以在处理大量并发连接时性能较差。

3. Nginx 使用了一些优化策略来提高性能，例如：
   - 使用了轻量级的 HTTP 协议解析器，减少了内存消耗。
   - 使用了共享内存的方式存储会话信息，避免了频繁的磁盘 I/O。
   - 使用了缓存技术，减少了对后端服务器的请求压力。

#### No.12：epoll 为什么能够处理海量的 TCP 连接？

epoll 能够处理海量 TCP 连接的原因是它采用了事件驱动的方法来优化 TCP 连接和线程的匹配过程。

在传统的 select 方法中，每当收到一个数据包时，都需要遍历现存的所有连接。当连接数达到数千个时，寻找匹配关系的操作就会变得非常慢，甚至需要占据一整个 CPU 核心，导致性能无法继续提升，其他客户端也无法与服务器建立新的 TCP 连接。

而 epoll 通过将正向匹配流程反过来，基于事件驱动实现了高效的 TCP 连接与线程的匹配。具体来说，当接收到数据后，epoll 会通过二叉树快速找到所属的文件，并主动执行该文件对应的回调函数。这个操作大幅提高了处理海量 TCP 连接数时的效率。
