在mod_perl处理程序中使用Inline :: Python

时间:2014-05-31 10:39:02

标签: python apache perl segmentation-fault mod-perl

是否有一个已知的技巧可以创建一个mod_perl处理程序,该处理程序使用一些稍微涉及的Inline::Python

我创建了以下处理程序:

package ApacheHandler::Test;

use 5.010;
use autodie;
use open qw( :std :utf8 );
use strict;
use utf8;
use warnings;

use Inline Config => DIRECTORY => '/tmp/inline';

use Apache2::Const;
use Apache2::Request    ();
use Apache2::RequestRec ();
use Apache2::RequestIO  ();

use Inline Python => <<EOF;

#import numpy

def hello():
    return "Hello!"

EOF

sub handler {
  my $r = Apache2::Request->new(shift);
  $r->content_type("text/plain");
  $r->print( hello() );
  return Apache2::Const::OK;
}

1;

只要import numpy仍然被注释掉,它就可以正常工作。如果我取消注释这一行,Apache会在重新启动时立即断言,我在dmesg中看到类似的内容:

  

[9136481.110798] / usr / sbin / apach [10933]:segfault at 7f83df8e6749 ip 00007f83df2aa470 sp 00007fffa1ebe818 libpython2.7.so.1.0中的错误4 [7f83df1c5000 + 281000]

请注意numpy是通过pip安装的。我已尝试导入通过pip安装的其他一些软件包,这些软件包位于同一位置(/usr/local/lib/python2.7/dist-packages),并遇到了同样的问题。

我尝试过这些方法:

import sys
sys.path.append('/usr/local/lib/python2.7/dist-packages')

没有改变。我没有想象力尝试尝试启用和禁用mod_python,但没有任何变化。

此外,我尝试运行相同的脚本,改编为CGI,它可以工作。

我试过完全无法在gdb内启动Apache,所以我没有更准确的错误消息,但我希望我已经为那些了解{{1}的人准确地指出了这个问题。或者Python或mod_perl能够看到发生了什么。

更新:其他但不是非常有用的调试信息

我刚才有一个好主意:加载Apache2::Reload,用“正确”处理程序重启Apache(即Inline注释掉),将import附加到Apache的一个孩子身上,删除处理程序Python中的gdb并加载页面。

它没有段错误,但我 在错误日志中收到了有用的消息:

  

[Sun Jun 01 11:24:46 2014] [错误] [客户端152.81.2.175]无法在/处创建目录路径'/tmp/inline/lib/auto/ApacheHandler/Test_771f'.nnn usr / local / share / perl / 5.14.2 / ApacheHandler / Test.pm第16行。\ n \ nBEGIN失败 - 编译在/usr/local/share/perl/5.14.2/ApacheHandler/Test.pm第23行中止。\ nCompilation在/usr/share/perl5/Apache2/Reload.pm第181行的require中失败。\ n

这指出了一个非常现实的问题:#中的许多路径都是由root创建的。所以我做了/tmp/inline,其中使chown -R www-data /tmp/inline工作(!)成为处理程序,但是当我重新启动Apache时,它再次发生了分段,尽管{{1 仍然可以通过root和www-data写入。

所以,除非我误解了这里发生的事情,否则我仍然没有找到如何让Apache和import一起工作。

0 个答案:

没有答案