【问题标题】:Loading Perl modules into memory for Nginx, to make faster?将 Perl 模块加载到 Nginx 的内存中,以提高速度?
【发布时间】:2016-01-23 19:58:39
【问题描述】:

我正在尝试在 nginx 服务器上加速我的 Perl 脚本。在测试脚本中,如果我注释掉对 3 个 .pm 文件的“使用”请求(所有这些文件都做自己的事情)......脚本会损失大约 600 毫秒的加载时间!现在我的猜测是,这是因为它必须从请求的子模块中加载子模块。例如:

use WebService::Solr;
use WebService::Solr::Query;
use Want::View;
use JSON;
use POSIX;

在带有 mod_perlApache 上,您可以设置启动脚本,以便将模块“导入”到内存中(以使其更快)。 nginx 和 Perl 有类似的可能吗?我的实时脚本目前需要 1.1 秒来处理(其中 800-900 毫秒是“等待”它响应!!!),所以我真的需要加快速度。

更新:我找到了这个,但它似乎不起作用:

http://search.cpan.org/~zzz/Nginx-Perl-1.2.9.7/src/http/modules/perl/Nginx.pm#DESCRIPTION

location ~ \.cgi$ {

    perl_inc     /usr/local/share/perl/5.20.2/;
    # perl_require WebService/Solr;

    ... rest

}

我收到一个错误:

nginx:[emerg] 未知指令“perl_inc”在 /etc/nginx/sites-enabled/site.net:134

我想知道是不是因为我需要安装“Nginx”Perl 模块。当我尝试通过 MCPAN 安装它时,我得到了一个死:

-lpthread -lcrypt -lcrypto -lcrypto -lz \ -Wl,-E -fstack-protector -L/usr/local/lib -L/usr/lib/x86_64-linux-gnu/perl/5.20/CORE -lperl -ldl -lm -lpthread -lc -lcrypt /usr/ bin/ld: 找不到 -lperl collect2: 错误: ld 返回 1 退出状态 objs/Makefile:213: 目标配方 'objs/nginx-perl' 失败 make[1]: * [objs/nginx-perl] 错误 1 make[1]: 离开目录 '/root/.cpan/build/Nginx-Perl-1.2.9.7-dbUMQF' Makefile:9: 配方 目标“构建”失败:* [构建] 错误 2
ZZZ/Nginx-Perl-1.2.9.7.ta​​r.gz /usr/bin/make -- 不行

谢谢!

【问题讨论】:

  • 我对 nginx 的细节无能为力,但如果你没有找到更好的东西,你仍然可以设置 Apache 和 mod_perl 并在那里让 nginx 路由 Perl 请求。
  • @NickP - 谢谢。我试图避免将 Apache 作为代理,因为它是在服务器上运行的另一件事 :)
  • 如果我告诉你任何你认为明显流血的事情,请原谅我,但是“ld: cannot find -lperl”意味着你没有安装 libperl,所以你可以安装它吗?
  • @Michael 感谢您的回复。我只是尝试安装它,但似乎不是有效的安装? apt-get install libperl - 给出:E: Unable to locate package libperl。我的朋友建议它需要用一些新标志重新编译 nginx ......虽然我不太确定
  • 啊,你使用的是debian。尝试“apt-get install nginx-extras”。这应该取决于 libperl 的版本(可能没有 libperl,但有 libperl 的版本,例如 wheezy 上的“libperl5.14”)。无论如何,它可能会引入您想要的 perl 模块。

标签: perl nginx


【解决方案1】:

好的,所以我们终于开始了。我在这里找到了一部分:

https://serverfault.com/questions/247355/how-do-i-configure-nginxs-embedded-perl-to-use-perl-modules

在配置 nginx 时,我们必须使用 --with-http_perl_module--with-perl_modules_path 标志重新编译它。然后,另一件令人困惑的事情是您实际上如何称呼它。我找到的地方作为参考,谈谈:

perl_lib 
perl_require

我认为将其放入站点配置文件的location { } 部分是可以的 - 但事实证明这需要放入核心中的主 nginx.conf 文件:

http {
   perl_modules /usr/local/share/perl/5.20.2/;

   perl_require JSON.pm;
   perl_require POSIX.pm;

}

..阻止。

这样做,实际上似乎有效(重新启动 nginx 时没有编译错误)。我还有更多的测试要做,只是为了确保它确实在做某事——但据我所知,这现在是一个可行的解决方案。希望这对将来的其他人有所帮助!

更新:我真的没有看到加载时间有任何差异 :( 我的逻辑是 perl_require 将模块加载到内存中,然后通过脚本更快地访问它(正在加载的诗句进入脚本本身)。这种理解正确吗?

【讨论】:

    【解决方案2】:

    我认为您必须通过安装 perl-dev 或一些类似的软件包来解决 cpan 问题,其中包含 C 级 perl 绑定。将不是 nginx-extras,或者可能是从启用 perl 支持的源重建您的 nginx。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多