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

Nginx vs Apache

393次阅读
没有评论

共计 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、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19351
评论数
4
阅读量
7997224
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

300元就能买到的”小钢炮”?惠普7L四盘位小主机解析

  300 元就能买到的 ” 小钢炮 ”?惠普 7L 四盘位小主机解析 最近...
把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地

把小米云笔记搬回家:飞牛 NAS 一键部署,小米云笔记自动同步到本地 大家好,我是星哥,今天教大家在飞牛 NA...
星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛NAS-2:飞牛配置RAID磁盘阵列

星哥带你玩飞牛 NAS-2:飞牛配置 RAID 磁盘阵列 前言 大家好,我是星哥之前星哥写了《星哥带你玩飞牛 ...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...
如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的Nano Banana Pro?附赠邪修的用法

如何免费使用强大的 Nano Banana Pro?附赠邪修的用法 前言 大家好,我是星哥,今天来介绍谷歌的 ...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手!

星哥带你玩飞牛 NAS-13:自动追番、订阅下载 + 刮削,动漫党彻底解放双手! 作为动漫爱好者,你是否还在为...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸

一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸 前言 作为天天跟架构图、拓扑图死磕的...