Code前端首页关于Code前端联系我们

Nginx 和 Apache 有什么区别?

terry 2年前 (2023-09-28) 阅读数 65 #未命名

Nginx 和 Apache有什么差别 ?

Nginx 在几年内征服了大多数 Web 服务器。众所周知,Nginx 在处理大并发静态请求时效率明显高于 Httpd,甚至可以轻松解决 C10K 问题。

在高并发连接的情况下,Nginx 是 Apache 服务器的一个很好的替代方案。 Nginx 还可以用作第 7 层负载均衡服务器。根据我的测试结果,Nginx + PHP(FastCGI)可以承受3万以上的并发连接,相当于相同环境下Apache的10倍。

一般来说,4GB内存的服务器+Apache(prefork模式)一般只能处理3000个并发连接,因为它们会占用3GB以上的内存,必须为系统预留1GB的内存。我曾经有两台 Apache 服务器。由于配置文件中设置的MaxClients为4000,当Apache并发连接数达到3800时,服务器内存和Swap空间就满了,崩溃了。

而这个 Nginx + PHP (FastCGI) 服务器有 30,000 个并发连接。打开的10个Nginx进程使用150M内存(15M*10=150M),打开64个php-cgi。该进程使用1280M内存(20M*64=1280M),加上系统本身消耗的内存,总共消耗不到2GB内存。如果服务器内存较小,只能开启25个php-cgi进程,所以php-cgi消耗的总内存只有500M。

在3万并发连接下,PHP程序访问Nginx+PHP服务器(FastCGI)的速度还是很快的。

为什么 Nginx 处理高并发比 httpd 更好?我们先来了解一下这两种Web服务器的工作原理和工作模式。

1。 Apache的三种工作模式

我们都知道Apache有三种工作模式:prefork、worker、event。

  • prefork: 多进程,每个请求由一个进程响应。这个过程会使用选择机制来通知。
  • 工作原理:多线程,一个进程可以产生多个线程,每个线程响应一个请求,但通知机制仍然是选择性的,但可以接受多个请求。
  • 事件:基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(即epoll机制)实现的。

1。 prefork 的工作原理

如果您没有使用“-with-mpm”明确指定特定的 MPM,则 prefork 是 Unix 平台上的默认 MPM。它采用的预伪装子进程的方式也是Apache1.3中采用的模式。 Prefork 本身不使用线程。 2.0 版本使用它来保持与 1.3 版本的兼容性。另一方面,prefork 使用单独的子进程来处理不同的请求。这些进程相互独立,这也使其成为最稳定的 MPM 之一。

2。 Worker原理

相比于prefork,worker是2.0版本中全新的MPM,支持多线程、多进程混合模型。由于使用线程进行处理,因此可以处理比较大量的请求,并且系统资源的开销比基于进程的服务器要少。但worker也使用多个进程,每个进程产生多个线程,以实现基于进程的服务器的稳定性。这种MPM工作方式将是Apache 2.0的发展趋势。

3。事件机制的基于事件的特性

一个进程响应多个用户请求,并使用回调机制重用套接字。请求到达后,进程并不处理该请求,而是直接交给其他机制。处理,通过epoll机制通知请求是否已经完成;在此过程中进程本身一直处于非活动状态,并且始终可以接收用户请求。可以实现一个流程来响应多个用户请求。支持大量并发连接并使用更少的资源。

2。如何提高Web服务器处理同时连接的能力

有几个基本条件:

1。基于线程,即一个进程派生多个线程,每个线程响应用户的每个请求。

2。基于事件的模型,一个进程处理多个请求,并通过epoll机制通知用户请求已完成。

3。基于磁盘的 AIO(异步 I/O)

4。支持mmap内存映射。当传统的 mmap Web 服务器提交页面时,它们首先将磁盘页面提交到核心缓存,然后从核心缓存复制一份副本到 Web 服务器。 Mmap机制允许内核缓存映射到磁盘。 Web服务器可以直接复制页面的内容。没有必要先进入磁盘上的内核缓存页。

恰好Nginx支持以上所有功能。所以Nginx官网说Nginx支持5万并发,是有道理的。

3。 Nginx 的优点

传统上,基于进程或线程模型架构的 Web 服务按每个处理并发连接请求过程或每线程,在网络和I/O操作期间必然会造成阻塞。另外,不可避免的结果是内存或CPU利用率低。

生成一个新的进程/线程需要提前准备其运行时环境,包括为其分配堆内存和堆栈内存,并为其创建新的执行上下文。这些操作需要占用CPU,过多的进程/线程也会导致线程抖动或频繁的上下文切换,进一步降低系统性能。

另一个高性能Web服务器/Web服务器反向代理:Nginx。 Nginx的主要关注点是其高性能和对物理计算资源的高密度利用,因此它采用了不同的架构模型。受到各种操作系统设计中先进的基于“事件”的处理机制的启发,Nginx采用了模块化、事件驱动、异步、单线程和非阻塞的架构,并使用了大量的复用和事件通知机制。

在Nginx中,连接请求由几个仅包含一个线程的进程worker处理,具有高效的运行循环机制,每个worker可以处理数千个并发和并行连接。问。

4。 Nginx工作原理

Nginx会根据需要同时运行多个进程:一个主进程(master)和多个工作进程(workers)。一旦配置了缓存,还会有一个缓存加载过程(cache loader)。 )和缓存管理器进程(cache-manager)等。所有进程都只包含一个线程,进程间的通信主要通过“共享内存”机制来实现。主进程以 root 用户身份运行,而工作进程、缓存加载器和缓存管理器都必须以非特权用户身份运行。

在连接重叠较多的情况下,Nginx 是 Apache 服务器的一个很好的替代方案。

Nginx安装非常简单,配置文件非常简洁(还可以支持perl语法),错误也很少。服务器:Nginx非常容易启动,即使运行几个月也可以几乎7*24不间断地运行。无需重新启动。您还可以在不中断服务的情况下升级软件版本。

5。 Nginx的诞生主要是解决C10K问题

最后我们从各自使用的复用IO模型来分析:

1。选择型号:(apache使用,由于模块等限制,使用不多);

单个进程可以监控的文件描述符数量有最大限制;

select()维护的数据结构用于存储大量文件描述符,随着文件描述符数量的增加,其复制用户态和内核地址空间带来的Overhead也会线性增加;

由于网络响应时间延迟,大量 TCP 连接处于空闲状态,但调用 select() 仍会对所有套接字执行线性操作。扫描会产生一些开销;

2。轮询:轮询是 Unix 使用 select 重新实现的。唯一已修复的问题是轮询对文件描述符的最大数量没有限制;

3。 epoll模型:(Nginx用户)

epoll提供了两个优点,大大提高了性能:

(1)基于事件的应急通知方法,select/poll只能调用特定的方法,核心会扫描所有监控的文件描述符,epoll事件通过epoll_ctl()注册一个文件描述符。当文件描述符准备好时,内核将使用回调之类的东西。回调机制快速激活这个文件描述符,epoll_wait()会收到通知

(2)调用一次

  • 当获得就绪文件描述符时返回。它不是一个实际的描述符,而是一个表示就绪描述符数量的值。获取这些值,就得到了epoll指定的数组中对应的文件描述符个数。这里使用内存映射(mmap)技术来避免避免复制大量文件描述符带来的开销

    (3) 当然,epoll 也有一定的局限性。 epoll仅在Linux 2.6中实现,其他平台上没有实现。这与apache这样优秀的跨平台服务器不同。很明显,事情正在朝着相反的方向发展。

    (4) 简而言之,epoll 是 select 的升级版本。单个进程管理的文件描述符没有最大限制。但epoll只能在Linux平台上使用。没有使用Apache作为跨平台。

  • 版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门