阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Nginx vs Apache

120次阅读
没有评论

共计 4344 个字符,预计需要花费 11 分钟才能阅读完成。

什么是 Nginx 代理代理服务器,它和 Apache 相比又有什么区别呢?你又该如何选择使用呢,用其中一个还是两者都用?我们将会在这里探索一下这些问题的答案。

CentOS 6.2 实战部署 Nginx+MySQL+PHP http://www.linuxidc.com/Linux/2013-09/90020.htm

使用 Nginx 搭建 WEB 服务器 http://www.linuxidc.com/Linux/2013-09/89768.htm

搭建基于 Linux6.3+Nginx1.2+PHP5+MySQL5.5 的 Web 服务器全过程 http://www.linuxidc.com/Linux/2013-09/89692.htm

CentOS 6.3 下 Nginx 性能调优 http://www.linuxidc.com/Linux/2013-09/89656.htm

CentOS 6.3 下配置 Nginx 加载 ngx_pagespeed 模块 http://www.linuxidc.com/Linux/2013-09/89657.htm

CentOS 6.4 安装配置 Nginx+Pcre+php-fpm http://www.linuxidc.com/Linux/2013-08/88984.htm

Nginx 搭建视频点播服务器(仿真专业流媒体软件)http://www.linuxidc.com/Linux/2012-08/69151.htm

Apache 服务器从 1995 年就开始使用了。相比其他产品,Apache 服务器是使用最多的,其次是微软的 IIS 服务器。

由于开源的 Apache 服务器已经被使用多年,并且有众多的用户,人们开发出了很多的模块来扩展它的功能,其中的大多数模块也是开源的。举例来说,一个比较常见的配置是使用 Apache 来为静态页面提供服务,并使用 mod_jk 模块来运行 Tomcat 上的 Java 和 JSP 代码,以便使程序具有交互功能。另一个例子是使用 mod_php 模块来执行 php 代码,而不用去使用 cgi。

但是,Apache 在高负载的情况下表现的差强人意,原因是它需要去运行新的进程,因此要消耗更多的内存。同时,他还要产生新的线程来与其他的线程竞争内存和 CPU。当进程的流量达到了管理员设置的上限时,Apache 会拒绝新的连接。

Nginx 是一个开源的服务器,用来解决一些 Apache 在性能和扩展性方面的问题的。Nginx 是开源并且免费的,但是如果你购买了它的 Nginx Plus 版本的话是可以享受到服务支持的。

Nginx 声称它的服务器是用来解决 C10K 问题(出自 Daniel Kegel 发表的一篇关于如何使一个服务器处理 10000 个连接——假设的操作系统的上限的论文)的。在他的论文中,他引用了另一篇由 Dean Gaudet 写的论文,其中写到“你们为什么不使用一个像 Zeus 那样的选择 / 事件 (select/event) 为基础的模型呢?很明显那是最快的”。

Nginx 确实是以事件为基础的(event-based)。他们把他们的架构称为“事件驱动且异步”(event-driven and asynchronous)。Apache 依赖于进程和线程。那么,区别是什么呢?

Apache 是如何工作的,为什么会有极限

Apache 通过创建进程和线程来处理其他的连接。管理员可以通过设置来控制服务器所能允许的最大进程数量。这个配置因机器的可用内存而异。过多的进程会耗尽内存从而使得机器使用磁盘上的交换内存,这严重的降低了性能。而且,当达到进程的上限之后,Apache 会拒绝新的连接。

Apache 可以通过设置来运行在 pre-forked 模式或 worker multi-process 模式(MPM)。当其他的用户连接时,两种方式都会创建新的进程。区别在于,pre-forked 模式为每一个进程创建一个线程,用来处理一个用户的请求。worker 模式也创建新的进程,但是每一个进程至少有一个线程,每一个线程用来处理单个用户的单个请求。所以,一个 worker mode 的进程处理至少一个连接,而一个 per-fork 模式的进程只处理一个连接。

相比于 forked 模式,worker 模式使用更少的内存,原因是进程比线程消耗更多的内存,线程只是运行在进程中的代码。

此外,worker 模式不是线程安全的。这意味着如果你使用像 mod_php 这样的非线程安全的模块来服务 php 页面时,你需要使用 pre-forked 模式,因此要消耗更多的内存。所以,当选择模块和配置服务器时,你必须要面对是线程还是进程更优的问题以及一些约束的问题。

在调整 Apache 时的一个限制因素是内存以及当争夺同一个 CPU 和内存时潜在的线程死锁问题。如果一个线程停止了,用户会一直处于等待页面出现的状态,直到进程将该线程回收,以便可以发回页面。如果一个线程发生了死锁,它不知道如何重启,因此会一直处于卡住状态。

Nginx

和 Apache 相比,Nginx 的工作方式有很大不同,主要是在于它如何处理线程。

Nginx 并不会为每一个的 web 请求创建新的进程,相反,管理员可以配置 Nginx 主进程的工作进程的数量(一个常见的做法是为每一个 CPU 配置一个工作进程)。所有这些进程都是单线程的。每一个工作进程可以处理数千个并发的请求。它通过一个线程来异步的完成了这些工作,而没有使用多线程的编程模型。

Nginx 还拆分了缓存加载器 (cache loader) 和缓存管理器 (cache manager) 进程用来从磁盘中读取数据并将其加载到缓存中,当缓存直接读取的时候缓存过期。

Nginx 有一系列的模块组成,这些模块在编译的时候就被包含进去了。这意味着,用户下载源码并选择他们要编译的模块。这些模块中包括连接后端应用服务器,负载均衡,代理服务器以及其他。并没有 PHP 的模块,因为 Nginx 可以自己编译 PHP 代码。

这里有一张图描述了 Nginx 的架构,该图来自 Andrew Alexeev 的深入分析 Nginx 及其工作方式。

Nginx vs Apache从这个图表中我们可以看出,Nginx 使用 FastCGI 进程来执行 Python,Ruby 以及其他代码,使用 Memcached 对象缓存系统。工作进程为 HTTP 请求加载 ht_core Nginx 进程。我们还可以看到,Nginx 和 Windows 以及 Linux 内核的功能紧密的集成在了一起,以便提升性能。这些内核功能已经经过长时间的改良,而 Nginx 正是利用了这一点。

Nginx 声称是事件驱动,异步且无阻塞的。“事件(Event)”指的是一个用户的连接。“异步(Asynchronous)”指的是它一次处理多个用户连接的用户交互。“无阻塞(Non-blocking)”指的是它不会由于 CPU 处于忙状态而停止磁盘的 I /O,在这种情况下,它会处理其他事件,直到 I / O 资源得到释放。

Nginx 与 Apache 2.4 MPM

Apache 2.4 包含多路处理事件模块(MPM event module)。它能处理在异步方式下的连接类型,Niginx 同样也能做,但是在方式上是不一样的。目的是在负载增长的时候,压缩对内存的需求。

在早期的版本中,Apache 2.4 包含工作者(worker)和前复制叉(pre-forked)模式,除了我们之前提到那些,还包括已经被添加的 mpm_event_module(Apache MPM event module),它被用来解决为了保活而等待这个连接的线程问题(等待是因为这个连接是用户额外的请求)。MPM 致力于一个线程能处理套接字(sockets)中监听(listening)和保活(keep-alive)这两者的状态。这个关于地址的内存问题与旧版本的 Apache 相关,通过减少线程数量以及进程的创建次数。正是这一点,管理员可能要下载 Apache 的源代码并且包括 mem_event_module,还要编译 Apache,用以代替正在使用的二进制发行版。

Apache 的 MPM 事件模型与 Nginx 的并不完全相同,这是因为当 Apache 接收到新的请求(请求的数量受到管理员所设置的限制)时,它就会产生新的进程。Nginx 不会为每个用户创建多个进程。在 Apache 4.2 上做了如下改进:与 Apache 通常的工作者模式相比,这个版本里所创建的服务进程将会生成更少的线程。这是因为一个线程可以处理多个连接,而不是每个连接需要一个进程为其提供服务。

既使用 Nginx,又使用 Apache

Apache 是因为其功能强大而出名的,而 Nginx 是因为其响应速度快而著称的。这就意味着 Nginx 在静态内容的服务上要相对快些,不过,Apache 可以使用模块来运行后台应用服务器,而且还可以运行脚本语言。

Apache 和 Nginx 都可以用作代理服务器,不过通常我们会把 Nginx 用作代理服务器,而把 Apache 用作后台服务器。Nginx 包含了 先进的负载均衡和内容缓冲功能。当然,Apache 服务器的部署数量巨大。为了充分发挥 Apache 服务器的效能,就需要有负载均衡器。Apache 可以使用自身所包含负载均衡模块,另外,还可以使用基于硬件的负载均衡器。

另一种使用方法是给 Nginx 配置独立的 php-fpm 应用,我们认为 php-fpm 是一个应用,这是因为它不是执行期间可以装载的.dll 或者.so,而是与 Apache 的模块使用方法相同。Ngnix 使用 php-fpm(FastCGI 进程管理器)来处理 php 脚本,这就使得 Nginx 具有生成非静态内容的功能。

什么时候更适合用 Apache?

Apache 具有内建支持 PHP,Python,Perl 等语言的能力。例如,mod_perl 和 mod_php 模块可以用来在 Apache 的进程中处理 PHP 和 Perl 的代码。mod_python 比使用 CGI 或 FastCGI 更高效,因为它不需要为每一个请求加载 Python 的解释器。对 mod_rails 和 mod_rack 模块来说也是一样,这些模块使得 Apache 可以运行 Ruby on Rails。这些进程在 Apache 的进程中运行的更快一些。

所以,如果你的网站主要是用 Python 或 Ruby 开发的,你最好使用 Apache,因为 Apache 不需要使用 CGI。对于 PHP 来说,用谁就无所谓了,因为 Nginx 也支持内建的 PHP 了。

我们在这里给出了 Nginx 和 Apache 之间的一些差异,以及我们该如何去考虑使用其中的一个或者两者都用,以及哪一个更加适合你的需求。另外,我们也讨论了 Apache2.4 已经把 Nginx 在线程和进程管理方面的一些提升加入到了 Apache 的服务器中。所以,你可以为你的需求找到最好的解决方案的。

Nginx 的详细介绍:请点这里
Nginx 的下载地址:请点这里

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计4344字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中