Apache 与 Nginx

Sam*_*aye 30 nginx fastcgi mod-php apache-2.2

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

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

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

我的网站使用了大量的长轮询,但有一个非 AJAX 网络基础(即 Apache 的顶部有长轮询)。

我对 Apache 内存问题的原始解决方案是通过 node.js 发送长轮询,然后让 node.js 每 2 秒访问一次 Apache,在这种情况下,Apache 不会有一个开放的连接,而是 node.js 会。我已经意识到这可能还不够好,正在寻找不同的解决方案。我仍然对我最初的想法是否可行很感兴趣。

那么哪个更适合现代网络?Apache 还是 Nginx?

更新:给出的所有建议都是好的和有效的。我已经采用了最初的第二个想法,即使用完整的 Nginx 服务器。我很满意作为专用服务器,我不会受到 fastcgi 的安全问题的困扰,并且由于我的长轮询脚本需要用 PHP 编写,我需要一个可以处理高负载同时连接的服务器,而 Apache 无论如何都无法做到这一点我改变了结构,它仍然会占用大量内存。

我已经标记了 Martin F 的答案,因为他对我的问题给出了如此清晰和完整的答案,我觉得他应该得到这个分数,但是,所有三个答案都很好且有效,并且肯定会考虑为我拥有的另一个网站使用反向代理因为我刚刚发现了 Nginx 可以在代理中做的非常非常酷的事情。

谢谢,

Mar*_*ald 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 协议在 nginx 和 PHP 之间进行流式传输,太好了。(我在实时设置中使用了它,并且效果很好,顺便说一句!)

对于用户下载,您使用名为 x-accel-redirect 的 nginx x-send-file-like 功能,本质上您在 PHP 中进行身份验证并设置一个头,nginx 接收并开始传输该文件。PHP 结束执行,您的 Web 服务器正在处理传输,太棒了!(同样,我在实时设置中使用了它,并且效果很好)

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

如果您还没有了解它,我认为您的许多问题根本与您的 Web 服务器无关,您只是这样想,因为 Apache 由于其结构而强制它与您的 Web 服务器相关,通常有比 PHP 更好的工具来完成这项工作,而 PHP 是一种知道这一点的语言,并且提供了出色的选择来卸载工作而无需离开 PHP。

我强烈推荐 nginx,但我也认为您应该针对其他问题查看其他选项,如果您有扩展或性能问题,请随时给我写信。我不知道您是否可以通过这里发送消息,否则请在 martin@bbtn.us 写信给我,因为我不会跟踪任何未标记 nginx 的服务器故障。:)

  • 我知道这是一个旧帖子,但我不得不说,这是我发现的有关 nginx 与 apache 主题的信息最丰富的帖子之一。比马丁,+1。 (2认同)

小智 5

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