Apache 与 Nginx 的性能比较是针对线程的,因为 Apache 基于线程(每个新连接都有一个新线程),而 nginx 基于进程(每个新连接到服务器都有一个新进程)。因此,由于基于进程,Nginx 的性能更好。但如果它们部署在 Linux 上,这有关系吗?因为 Linux 上没有线程的直接概念,并且在内核级别,线程被映射到进程。因此,Apache 和 Nginx 在 Linux 上的性能应该相同,但 Nginx 比 Apache 更好,为什么呢?
答案1
首先,进程分叉通常比线程更高效的说法并不正确。这很大程度上取决于操作系统内核如何处理线程/进程。
众所周知,在 Unix 系统上,分叉进程是一项简单、高效的任务,但在 Windows 上却很糟糕。这意味着在 Windows 上,使用线程可能更好,而在 Unix 上,这并不一定意味着线程比进程更高效或更不高效。
Apache 2.X 允许以多种模式运行,包括生成进程或使用线程池。
网络上有许多资源将 nginx 与 apache 进行比较。由于测试场景不同,每个基准测试的使用受到限制:
- 服务器配置,特别是 apache 服务器
- 要涵盖的工作量、静态与动态内容等。
- 基准测试兴趣:总体吞吐量、响应时间、响应时间变化
剩下的最佳选择是根据您的场景在您的服务器上设计自己的基准。另请参阅此问题:https://stackoverflow.com/questions/2528266/how-to-benchmark-apache-nginx-setup
答案2
nginx 基于进程(每个新的服务器连接都会创建一个新进程)
这是不正确的。Nginx 确实会生成许多工作进程来处理请求,但由于它是事件驱动的,因此每个进程都可以同时处理多个请求。这是它相对于 Apache 的很多优势的来源,因为它可以用相对适中的进程数量处理大量并发请求。
至于性能,这完全取决于具体情况;在任何情况下,没有哪种工具是更好的。
答案3
你可能不太在意。
有传闻称,当有大量连接的客户端执行的操作不多(例如保持活动状态、慢速请求等)时,Nginx 的内存效率更高。这意味着它可以在同一台机器上处理更多空闲连接,这在某些类型的 Web 服务器中很有用。
因此,如果您的所有客户端都速度超快、非常繁忙且处于低延迟链接状态(想象一下高度人工化的负载测试系统),那么 Apache 可能表现相当不错。但是,如果将真实的互联网和真实的客户端组合在一起,您就会看到 Nginx 的优势。
Nginx 没有预留线程或者为每个连接的客户端创建一个进程——它异步处理它们,这大大减少了空闲客户端产生的开销。