文档章节

关于Apache与Nginx的优势比较

daniel-john
 daniel-john
发布于 2014/10/13 10:10
字数 766
阅读 260
收藏 12

不断有人跟我说Nginx比Apache好、比Apache快之类。Nginx更主要是作为反向代理,而非Web服务器使用。我翻译过一本关于反向代理的技术书籍,同时精通Apache API开发,对Nginx和Apache的工作原理都略有了解,粗谈一下看法。

  不管是Nginx还是Squid这种反向代理,其网络模式都是事件驱动。事件驱动其实是很老的技术,早期的select、poll都是如此。后来基于内核通知的更高级事件机制出现,如libevent里的epoll,使事件驱动性能得以提高。事件驱动的本质还是IO事件,应用程序在多个IO句柄间快速切换,实现所谓的异步IO。事件驱动服务器,最适合做的就是这种IO密集型工作,如反向代理,它在客户端与WEB服务器之间起一个数据中转作用,纯粹是IO操作(io操作不会阻塞进程),自身并不涉及到复杂计算。反向代理用事件驱动来做,显然更好,一个工作进程就可以run了,没有进程、线程管理的开销,CPU、内存消耗都小。

  所以Nginx、Squid都是这样做的。当然,Nginx也可以是多进程 + 事件驱动的模式,几个进程跑libevent,不需要Apache那样动辄数百的进程数。Nginx处理静态文件效果也很好,那是因为静态文件本身也是磁盘IO操作,处理过程一样。至于说多少万的并发连接,这个毫无意义。我随手写个网络程序都能处理几万的并发,但如果大部分客户端阻塞在那里,就没什么价值。

  再看看Apache或者Resin这类应用服务器,之所以称他们为应用服务器,是因为他们真的要跑具体的业务应用,如科学计算、图形图像、数据库读写等。它们很可能是CPU密集型的服务,事件驱动并不合适。例如一个计算耗时2秒,那么这2秒就是完全阻塞的,什么event都没用。想想MySQL如果改成事件驱动会怎么样,一个大型的join或sort就会阻塞住所有客户端。这个时候多进程或线程就体现出优势,每个进程各干各的事,互不阻塞和干扰。当然,现代CPU越来越快,单个计算阻塞的时间可能很小,但只要有阻塞,事件编程就毫无优势。所以进程、线程这类技术,并不会消失,而是与事件机制相辅相成,长期存在。

  总结之,事件驱动适合于IO密集型服务,多进程或线程适合于CPU密集型服务,它们各有各的优势,并不存在谁取代谁的倾向。再盲目的言之Nginx可以取代Apache的,该好好反思了。


本文转载自:http://www.php100.com/html/itnews/PHPxinwen/2012/0103/9606.html

共有 人打赏支持
daniel-john
粉丝 17
博文 132
码字总数 56017
作品 0
其他
程序员
私信 提问
加载中

评论(2)

daniel-john
daniel-john

引用来自“梦函”的评论

通常将apache+php不如nginx+php,因为应用服务器由php去了嘛
应用服务器由php去了是什么意思?
梦函
梦函
通常将apache+php不如nginx+php,因为应用服务器由php去了嘛
Magento 主机web server 的选择

我们安装Magento时, 都希望自己的Magento网站能运行飞快的, 在这就有着一个linux web程序的选择,下面是一些关于web server 的比较 server Apache Nginx Lighttpd Proxy代理 非常好 非常好...

rio
2010/05/07
895
0
Nginx中log变量及Tengine的log_unescape

Nginx变量 Nginx的log模块是很多人做日志输出的首选切入点。 Nginx默认语法写入服务器本地路径或NFS,用于以后的汇总分析;在此基础上,Tengine增强了日志目标,可以通过组合管道功能或syslo...

Lax
2013/12/27
0
0
Apache 与 Nginx 比较

Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apac...

pcdog
08/13
0
0
Apache vs Nginx:基于实践经验的比较(外文翻译)

原文地址:Apache vs Nginx: Practical Considerations 简介 Apache和Nginx是世界上两个最流行的开源web服务器,他们一起支撑了互联网上超过50%流量。他们两个都支持多种负载模式并且可以和其...

我在睡觉
2016/11/10
0
0
网络编程的演进——从 Apache 到 Nginx

Apache Apache HTTP 服务器是 Robert McCool 在 1995 年写成,并在 1999 年开始在 Apache 软件基金会的 框架下进行开发。由于 Apache HTTP 服务器是基金会最开始的一个项目也是最为有名的一个...

xjtuhit
01/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在Python中调用Java扩展包HanLP测试记录

最近在研究中文分词及自然语言相关的内容,关注到JAVA环境下的HanLP,HanLP是一个致力于向生产环境普及NLP技术的开源Java工具包,支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义...

左手的倒影
4分钟前
0
0
使用python读取mysql数据库并进行数据的操作

(一)环境的配置 使用python调用mysql数据库要引进一些库。 目前我使用的python版本是python3.6。引进库为pymysql 其他对应的库可以有以下选择: mysqldb,oursql, PyMySQL, myconnpy 等,参...

dragon_tech
9分钟前
0
0
基于阿里云物联网平台实现的简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入...

阿里云官方博客
17分钟前
1
0
基于阿里云物联网平台,我们这样实现简易出入监控

本文通过一个简单实例,主要介绍了如何使用树莓派快速接入阿里云iot platform,并实现了一个简易的监控人员出入并拍照上送钉钉群的场景 场景 在公司大门入口处布点树莓派和红外感应,实现出入...

阿里云云栖社区
21分钟前
2
0
fedora linux for 龙芯查看实时输出的tomcat日志

软件源带的tomcat版本较低,所以建议从官网下载最新版本。 解压后,执行./startup.sh文件。 查看实时输出的tomcat日志,请使用命令tail -f /usr/share/tomcat/logs/catalina.out。 “/usr/sh...

gugudu
23分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部