最适合我的服务器?Nginx/Apache/LightHttpd

最适合我的服务器?Nginx/Apache/LightHttpd

我需要设置我的新专用服务器(Intel Atom E220 1.6 Ghz ONE CORE,2 GB RAM)

而且我的网站不是普通网站。它有许多并发进程(php),这是因为某些 php 请求需要超过 1 秒。该脚本经过优化,但它会执行 cURL 请求和套接字连接,并且它必须等待约 1 秒才能收到每个响应。

所以,我有~100 个并发、1 秒长的 php 请求。

哪种配置最适合我?

安德鲁

编辑-附加信息

我家里有一台服务器,这是“检测服务器”。我在数据中心有专用的服务器,这是“网站服务器”。

检测服务器是用 Linux 下 Mono 编译的 C# 编写的。检测服务器基本上是一个异步套接字服务器。此检测服务器中的每个线程需要 0.5 到 1.0 秒。

网站服务器有一个简单的脚本,名为 check.php。这个脚本非常简单:它连接到检测服务器,发送一个字符串。检测完成后(约 1 秒),它会读取检测服务器的响应。

答案1

除了最极端的情况外,服务器的选择与性能无关。

解决问题的方法是消除请求-响应周期中的延迟。换句话说:使用队列

答案2

这取决于您需要哪些其他功能,因此为简单起见,我假设除了提供 PHP 脚本和静态文件之外不需要其他任何功能。我怀疑您描述的应用程序即使在 Atom 上也不会受到 CPU 限制,因此我猜 RAM 将成为瓶颈的主要原因。

如果这些请求真的需要并发而不是排队,那么您将需要足够的 RAM 来同时运行至少 100 个 PHP 实例和相关的 Web 服务器工作程序。如果您的 PHP 是完全线程安全的编译(libcurl 模块是线程安全的,您需要检查您使用的任何其他模块,但我相信现在大多数都是线程安全的),您可以使用基于线程的 MPM 的 Apache 来减少这一点,因为我相信这将允许通过 apache/mod_php/php 更有效地共享代码页。如果无法实现线程安全运行,那么您可能需要考虑比 Apache 更轻量级的东西,然后您至少可以减少那部分占用空间,因此 lighttp 或 nginx 通过 fCGI 运行 PHP(这往往比 Apache+mod_php 更容易设置,因为大多数发行版基本上都会为您开箱即用地执行 apache+mod_php,节省一些调整,但比 Apache 更节省 RAM)。

如果使用 Apache,您可以通过将 nginx(或 lighttp)放在 Apache 前面作为反向代理来减少加载 PHP 的 worker 被“浪费”来提供静态文件的机会(这意味着您需要允许比 PHP 代码实际需要的请求更多的 worker) - 低 RAM 事件驱动服务器处理所有静态请求并仅将需要 PHP 的请求发送到 Apache。

你的应用程序有多复杂,你对 PHP 的依赖有多大?你问题中的描述(许多工作者大部分只是坐着等待某事发生)建议使用完全事件驱动的解决方案,而不是基于进程/线程的解决方案,但这意味着要放弃 PHP。目前有许多基于事件的 Web 架构,其中一些显然相当稳定。仅举一个例子,节点.js是当今最流行的风格之一。通过完全事件驱动的安排,每个并发请求将使用很少的额外 RAM。您可以混合搭配技术 - 使用 RAM 高效的事件驱动 Web 服务器来处理静态文件和代理,用于 node.js 实例(运行您的代码,它将花费所有时间等待向外部发出的请求返回)和 Apache 实例(运行您剩余的 PHP 代码),尽管这种混合搭配可能对您没有吸引力,这取决于您的技术知识水平和信心,因为它的设置比 apahe+mod_php 更复杂。

编辑

根据您对 PHP 脚本所做操作的新描述,您应该能够使用 php 的 curl 模块curl_multi_*函数执行异步 HTTP 请求。这意味着所有检查都可以通过一个 PHP 进程完成,这意味着内存使用问题已不重要,切换 Web 服务器几乎不会产生任何影响。请参阅PHP 手册参考这些功能和类似这样的例子如果参考资料没有清楚地说明整个过程,则可以获取更多类似教程的示例。

如果这是一个自动化过程,并且您不需要来自它的 HTTP 响应(即,您只是将响应记录在数据库中以供进一步分析),您甚至可以直接从 cron 作业运行 php 脚本,而根本不需要 Web 服务器。

相关内容