阿帕奇vs Nginx


29

我最近一直在研究Apache和Nginx之间的差异,并且对应该选择哪个感到困惑。

我进行了一些搜索,但两者之间没有确定的比较,我想知道是否有人可以就两者之间的差异发表意见。

我目前的知识使我了解到mod_php比fastcgi更快,更安全,但是Apache在同时连接和内存消耗方面要差得多。

我的网站使用了很多长时间轮询,但是没有基于AJAX的网站(例如,Apache的顶部一直进行长时间轮询)。

我最初对Apache内存问题的解决方案是通过node.js发送长时间的轮询,然后每2秒让node.js访问Apache,在这种情况下,Apache没有打开的连接,而是由node.js进行。我意识到这可能不够好,并且正在寻找不同的解决方案。对于我最初的想法是否可行,我仍然很感兴趣。

那么,哪个对现代网络更好?Apache还是Nginx?

更新:给出的所有建议都是有效的。我已经放弃了最初的第二个想法,那就是使用完整的Nginx服务器。我很满意,作为专用服务器,我不会遭受fastcgi的安全问题,并且由于我的长轮询脚本需要用PHP编写,因此我需要一台能够处理高负载同时连接的服务器,而Apache却无法做到这一点我更改结构后,仍然会占用大量内存。

自从Martin F对我的问题点给出了如此清晰,完整的答案后,我就标记了他的答案,以至于我认为他应得的分数。但是,这三个答案都是有效的,并且一定会考虑将反向代理用于我拥有的其他网站因为我刚刚发现Nginx在代理方面可以做的非常非常有用的事情。

谢谢,

Answers:


28

您似乎有一些误解,我认为需要解决。

首先,mod_php只是稍微快一点,我所有的测试都表明,差异是如此之小,以至于不值得考虑。我还怀疑安全性方面与您相关,因为您似乎正在寻找专用服务器,并且mod_php实际上仅在共享环境中具有优势-实际上,在专用环境中php-fpm将具有优势,因为PHP和您的Web服务器现在可以在不同的进程中运行,而这甚至没有考虑到php- FPM,例如慢日志。

如果世界是黑白的,我会说使用纯nginx设置,并用php-fpm编译php。更现实的是,如果您已经可以使用Apache,则可以使nginx成为apache的反向代理,这样可以节省几个小时的设置时间,并且性能差异很小。

但是让我们假设世界是黑白的,因为这样可以进行更出色的设置。您为您的Web服务器执行nginx + php-fpm。要解决上传问题,请使用nginx的上传模块和上传进度模块。这意味着您的Web服务器将接受上传并将完成后的文件路径传递到PHP,从而无需通过fastcgi协议sweet来在nginx和PHP之间流传输该文件。(我在实时设置中拥有此功能,效果很好,顺便说一句!)

对于用户下载,您使用称为x-accel-redirect的nginxs类似x-send-file的功能,从本质上讲,您在PHP中进行身份验证,并设置了一个标头,nginx会选择该标头并开始传输该文件。PHP结束执行,您的Web服务器正在处理转移,非常棒!(再次,我在现场设置中使用了它,效果很好)

为了在服务器或其他长时间运行的操作之间分发文件,我们意识到PHP并不是最适合此操作,因此我们安装了gearman,这是一个可以在不同服务器上的工作程序之间分发工作的工作服务器,这些工作程序可以用任何形式编写语言。因此,您可以创建一个分发工作器,并使用总共200 KB的内存而不是使用100 MB的PHP来生成其中的5个。甜。(我也有此实时运行,所以实际上是有可能的)

万一您还没有开始使用它,我想您的许多问题根本都与您的Web服务器无关,您只是这样想,因为Apache由于其结构而将其强制与您的Web服务器相关联,通常,有比PHP更好的工作工具,而PHP是一种了解这一点的语言,它为卸载工作提供了极好的选择,而无需离开PHP。

我强烈推荐nginx,但我也认为您应该针对其他问题考虑其他选择,如果您遇到缩放或性能问题,请随时给我写信。我不知道您是否可以通过此处发送消息,但不然可以写信给martin@bbtn.us,因为我不会跟踪未使用nginx标记的服务器故障。:)


1
该死的真的清除了一切:)谢谢,这就是我想要的解释。我想我现在在学习Nginx上已经很卖了,因为Apache会因使用我的网站而窒息而死。幸运的是,将其移动看起来确实非常容易。我的意思是,node.js上的人说过要在其中编写大部分内容,并且仅在确实需要时才轮询php会话类(除非有一种检测用户何时关闭其窗口的方法,否则我会这样做:P)。是的,我正在一个大型服务器场上运行,因此知道没有安全威胁可以帮助吨,谢谢您的出色解释:)
Sammaye 2010年

我一直在看这个:joeandmotorboat.com/2008/02/28/…和这个:blog.webfaction.com/a-little-holiday-present,这让我很开玩笑,因为我想真正使我心满意足。不像Apache那样,不是一个内存问题:)
Sammaye 2010年

等一下,这样您就可以在Java和php中使多线程工作程序完美解决了吗?我的意思是我看到的最大问题是服务器,因为使用长轮询在Apache上遇到大量内存问题,这很常见... ofc由Nginx修复。
Sammaye'7

1
本质上是的,我使用C语言编写了文件分发工作程序,使用PHP的gearman扩展名将分发作业发送到gearman作业服务器,然后将其发送给工作程序,该工作程序可以使用任何语言编写。PHP,Java,C等。然后,该工作人员完成工作并将状态报告给Gearman,齿轮工再报告给PHP。(除非选择了后台作业,否则PHP会在不等待的情况下结束)
Martin Fjordvald 2010年

2
我知道这是一个过时的帖子,但是我不得不说,这是我发现的有关nginx vs apache的最有用的帖子之一。坦·马丁(+1)。
Akoi Meexx 2012年

5

我建议运行nginx作为反向代理。它会处理您所有的静态和缓存文件(比Apache快很多/内存开销少),然后将所有对动态内容的请求转发给Apache。


是的,这就是大多数人似乎正在做的atm,我肯定要研究一下:)
Sammaye 2010年

1
记住要为Apache安装mod_rpaf,以便您可以通过客户端IP地址进行日志记录(否则Apache日志将显示来自127.0.0.1的所有请求),将以下内容添加到nginx配置中:proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
格雷格·安南代尔

在今晚尝试之前,我确实想知道一件事。如果我要通过Nginx路由到为我的PHP服务的Apache,这是否意味着长轮询仍将与Apache存在相同的问题,或者在反向代理中调用它会使Apache在某种程度上有所不同吗?
Sammaye,2010年

1

我不确定mod_php是否比其替代版本更快,您在哪里读到的?我已经使用nginx + php-fpm做了一些实验室测试,从我的测量来看,它胜过其他所有设置。

看一下此设置:http : //interfacelab.com/nginx-php-fpm-apc-awesome/

除了使用http://www.dotdeb.org/上的 PHP软件包外,我几乎进行了设置-其中包括一个php-fpm软件包和一个随时可以使用的初始化脚本。我不使用memecache或syck。


stackoverflow.com/questions/78108/…从这里得到它,我已经检查了php手册,它确实说php_mod比cgi版本具有明显的优势。您的设置看起来不错。看起来也很容易。我会调查一下的:)
Sammaye 2010年

2
它指出CGI比内置模块慢得多-不是FastCGI :)
pauska 2010年

1
好吧-如果您担心PHP进程快要死了(或超时),那么FastCGI(或PHP-FPM)是您的理想之选。它可以杀死死掉的子进程,而不会中断其他活动。
pauska,2010年

1
是。或者,这取决于。您将同时处理多少个(最大)慢请求?将最大的PHP FPM线程设置为该值,再加上您希望可用的“快速” cgi的数量。我听说有人在具有4GB RAM的服务器上运行200个PHP-FPM子代,因此如果您是我,我不会对此太担心。下一版本的PHP(5.3.3)将按标准包括PHP-FPM,其中还包含一个自适应引擎-它将根据您有多少未决请求进行扩展。
pauska,2010年

1
我很容易在多台服务器上运行(可能多达10台),但是如果我可以容纳200个可以在4GB服务器上长期轮询的请求,那么这应该几乎是我需要运行Apache的20台服务器的一半。嗯...今晚我需要测试一下
Sammaye 2010年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.