喂。我,使用 Gentoo linux。似乎我无法使用线程 apache2 出现/安装 mod_perl,所以我想知道将 apache2 的 worker 模块与 cgi-perl 一起使用以及将 apache2 的 prefork 模块与 mod_perl 一起使用的优缺点是什么
什么更快?什么需要更少的资源?安全方面,有什么区别吗?
谢谢!
喂。我,使用 Gentoo linux。似乎我无法使用线程 apache2 出现/安装 mod_perl,所以我想知道将 apache2 的 worker 模块与 cgi-perl 一起使用以及将 apache2 的 prefork 模块与 mod_perl 一起使用的优缺点是什么
什么更快?什么需要更少的资源?安全方面,有什么区别吗?
谢谢!
恕我直言,prefork+mod_per 会快得多,但在 mod_perl 邮件列表中询问会给你更准确的答案
在 Linux 上,使用带有 mod_perl 的 prefork apache。Threaded MPM 对 Win32 用户来说是一个巨大的胜利,因为在这些用户中进程创建成本很高。在 Linux 上 fork() 是一个非常便宜的调用。然而,Mod_perl2 的开发者付出了很大的努力使 mod_perl2 与 apache2 + 线程一起工作,但是 perl 中的线程模型有点占用内存。
我们开发了一个大型 mod_perl 应用程序,如果我们今天必须重新创建它,我可能会推荐各种框架之一并使用 FastCGI 或PSGI。使用 FCGI 或具有本机 PSGI/FCGI 功能的框架让您可以选择前端(nginx、lighttpd、apache2)。您可以对您的应用程序进行 chroot 并降低它的权限(它只需要一个套接字即可与您的前端对话)。如果你让你的应用程序使用 mod_perl2,那么你几乎已经嫁给了 Apache2。
Modperl 是 Catalyst 的完美适配器,就像 Modpython 和 Modwsgi 都适用于 Django,而 modphp 适用于 Cakephp,而 Modruby 的争论是比 cgi、fcgi 更好或更差,并且 (Modrails/Modpassenger/Modlocomotive) 是适用于 Rails特别是在使用线程模式时(但有 Modrake 和代理 Mongrel 应用服务器作为替代方案)。为了避免缺点并只获得优点,请始终使用分叉模式。我使用的仅指受 Rails 启发的其他编程语言的 mvc:即 Catalyst、Django、Cakephp 和 Rails。
在我看来,多分支的 mpm-itk-mode 是最好的,其次是多线程的 mpm-event-mode,然后是单分支的 mpm-prefork-mode,最后是单线程的 mpm-worker-mode。
我发现对于某些编程语言,它们各自的 apache2 适配器(例如 mod-php 和 mod-tcl)仅在 prefork 模式下运行,甚至在 itk 模式下运行,而 mod-ruby 仍然仅在 linux-apache2 中运行,尚未把它变成windows-apache2。
但是,幸运的是 mode-perl、mod-python 和 mod-ruby 更加通用,可以在所有四种模式下运行——libapache-mpm-worker 模式、libapache-mpm-prefork 模式、libapache-mpm-event模式和 libapache-mpm-itk 模式。这对 perl、python 和 ruby 用户来说是个好消息,但当然,即使在所有三个适配器的情况下,分叉模式也比线程模式更快、更通用且无冲突。有一件事是肯定的:所有这些适配器都设计为比 cgi 运行得更快,并且可以说与 fcgi (fastcgi) 一样快。
我使用 itk(多叉)模式,即使这意味着我会错过一些需要 prefork(单叉)模式的软件。
我一直更喜欢 Ubuntu 中的 itk 模式,并且从未选择安装需要 prefork 模式作为先决条件的应用程序。一些发行版,例如 Gentoo 风格的 Sabayon,默认在工作模式下安装 apache2。但是我们总是可以通过编辑 apache 系统配置文件并取消注释包含itk的行(并注释worker的行)然后重新编译并重新启动 apache2 来更改这一点。所以,任何适用于 Sabyon 的东西都应该适用于 Gentoo。Sabayon 和 Gentoo 安装所有依赖于 prefork 或 worker 的软件,但在配置它们时,只有那些依赖于系统满足的软件才能运行。
受到重创的是一些无法运行的基于 php 的框架(内容管理系统所必需的)。唯一可以在 itk、事件(也可能是 worker)模式下运行的 php 框架是 cake-php,遗憾的是很少有人使用。我认为即使是更知名的 horde (php) 框架也应该可以工作。
另一个证明线程比分叉更糟糕的证据是查看两个或多个网络服务器适配器彼此之间以及系统之间存在的冲突数量或冲突,正如我们在 Windows 中看到的那样。
在 windows 的情况下,apache2 配置了 worker-mode,因为 prefork 和 itk 模式是不可能的,但是 event-mode 应该是非常可能的。因此,切换到 apache2 事件(多线程)模式应该可以解决大部分问题。但是 apache2 对于 modperl(以及因此 perl-catalyst mvc)、modpython(以及因此 django mvc)非常灵活和可定制,但是 windows-modruby 尚未稳定,它的等价物称为 modpassenger(modpassenger -- linux,modrails -- windows, locomotive -- macosx) 存在于 abyss-webserver 或 lighttpd-webserver (以及因此 rails mvc) 中。
预防措施是:如果系统是 windows,那么在安装 Perl/Python/Ruby/PHP/Tcl 的 MVC 之前,请确保一切都只配置了一个 web 服务器——apache2 或 lighttpd 或者可能是 cherokee。如果您打算将 rails 与 abyss、modrails 一起使用,请确保不应该存在带有 wamp、modphp 的 drupal/jhoomla 配置 - 否则有时 windowsxp 的默认 windows-shell 可能会崩溃(您仍然可以通过使用 windowsxp 来恢复外壳,如 reactos-shell、emerge-desktop、sharp-enviro、bblean-blackbox 等,以及备用文件管理器,如 ros-explorer、cubic-explorer、ultra-explorer 等——前提是任何用户不介意适应并使用具有不同外观的桌面外壳和文件管理器的相同操作系统)。
在 windows 中,modrails 与 modphp 冲突(直到稳定的 modruby 可用),并且基于 asp 的 windows-desktop-shell(windows 网络对象模型环境)一次只能保存一个,而用代码块编写的备用 shell (reactos 和emerge-desktop) 不会崩溃,而用delphi (sharp-enviro) 编写的那些会部分崩溃,但是Sharp-enviro 的lazarus remake 不应该崩溃。
因此,Linux Web 技术种类繁多而成功的原因之一是分叉模式相对于线程模式的优势。经过大量的努力,windows web 技术在很大程度上仍然围绕着较少的玩家和一些开源技术。
只是一些额外的信息,我们只是在 Win32 上转储 mod_perl 并使用 Plack 切换到 PSGI。CGI::Application 有一个兼容层,对我们来说非常好用。Catalyst 也正在切换/已切换到 PSGI。