你好。我使用的是 Gentoo Linux。似乎我无法使用线程 apache2 来安装 mod_perl,所以我想知道使用 apache2 的 worker 模块和 cgi-perl 以及使用 apache2 的 prefork 模块和 mod_perl 的优缺点是什么
哪个更快?哪个占用更少的资源?从安全角度来看,有什么区别吗?
谢谢!
答案1
在 Linux 上,使用 prefork apache 和 mod_perl。Threaded MPM 对 Win32 用户来说是一个巨大的优势,因为创建进程的成本很高。在 Linux 上,fork() 的调用成本很低。然而,Mod_perl2 开发人员已经付出了巨大的努力,使 mod_perl2 能够与 apache2 + 线程配合使用,但 perl 中的线程模型有点占用大量内存。
我们开发了一个大型的 mod_perl 应用程序,如果今天必须重新创建它,我可能会推荐使用各种框架之一并使用 FastCGI 或前列腺增生症。使用 FCGI 或具有本机 PSGI/FCGI 功能的框架可让您选择前端(nginx、lighttpd、apache2)。您可以 chroot 您的应用程序并降低其权限(它只需要一个套接字即可与您的前端通信)。如果您让您的应用程序使用 mod_perl2,那么您几乎就与 Apache2 结合了。
答案2
在我看来,prefork+mod_per 会快得多,但在 mod_perl 邮件列表中询问会给你更准确的答案
答案3
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 用户来说是个好消息,但当然,即使在所有这三种适配器的情况下,forked 模式也比线程模式更快、更灵活、无冲突。有一点是肯定的:所有这些适配器都设计为比 cgi 运行得更快,甚至可以说与 fcgi (fastcgi) 一样快。
我使用 itk(多分叉)模式,即使这意味着我将错过一些需要 prefork(单分叉)模式的软件。
我一直更喜欢 Ubuntu 中的 itk 模式,从未选择安装需要 prefork 模式作为先决条件的应用程序。某些发行版(例如 Gentoo 风格的 Sabayon)默认以工作模式安装 apache2。但我们始终可以通过编辑 apache 系统配置文件并取消注释包含以下内容的行来更改此设置伊特克(并注释掉工人),然后重新编译并重新启动 apache2。因此,适用于 Sabayon 的任何内容也应该适用于 Gentoo。Sabayon 和 Gentoo 会安装所有依赖于 prefork 或依赖于 worker 的软件,但在配置它们时,只有那些依赖关系由系统满足的软件才应该运行。
受到严重影响的是一些基于 php 的框架(内容管理系统所需)无法运行。唯一可以在 itk、事件(可能还有 worker)模式下运行的 php 框架是 cake-php,但不幸的是很少有人使用它。我认为更知名的 horde (php) 框架也应该可以运行。
线程比分叉更糟糕的另一个证据是通过查看两个或多个 Web 服务器适配器彼此之间以及与系统之间的冲突数量,就像我们在 Windows 中看到的那样。
在 Windows 中,apache2 使用 worker 模式进行配置,因为 prefork 和 itk 模式无法使用,但事件模式应该非常可行。因此,切换到 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 一起使用,则请确保 drupal/jhoomla 配置与 wamp、modphp 不存在 - 否则有时 windowsxp 的默认 windows-shell 可能会崩溃(您仍然可以通过使用 windowsxp 和备用 shell(如 reactos-shell、emerge-desktop、sharp-enviro、bblean-blackbox 等)以及备用文件管理器(如 ros-explorer、cubic-explorer、ultra-explorer 等)进行恢复 - 前提是任何用户不介意适应并使用具有不同外观的桌面 shell 和文件管理器的相同操作系统)。
因此在 Windows 中,modrails 与 modphp 冲突(直到稳定的 modruby 可用),并且基于 asp 的 windows-desktop-shell(windows 网络对象模型环境)一次只能容纳一个,而用 codeblocks(reactos 和 emerge-desktop)编写的替代 shell 不会崩溃,而用 delphi(sharp-enviro)编写的替代 shell 会部分崩溃,但 sharp-enviro 的 lazarus 重制版不会崩溃。
因此,Linux Web 技术种类繁多且成功的原因之一就是分叉模式比线程模式具有优势。Windows Web 技术在经过大量努力后仍然在少数参与者和少数开源技术中占据主导地位。
答案4
只是一些额外的信息,我们刚刚在 Win32 上转储了 mod_perl,并使用 Plack 切换到了 PSGI。CGI::Application 有一个兼容层,对我们来说运行得很好。Catalyst 也正在切换/已经切换到了 PSGI。