1

我正在尝试使用Hypertable在 Perl 中开发 Web 应用程序。示例代码:

#!/usr/bin/perl -w
use strict;
use warnings;
use CGI;
use CGI::Carp qw/fatalsToBrowser warningsToBrowser/;
use CGI::Session ('-ip_match');
use Hypertable::ThriftClient;
use Data::Dumper;

my $q = new CGI;
print $q->header(-cache_control => "no-cache, no-store, must-revalidate");

eval {
    my $client    = new Hypertable::ThriftClient("localhost", 38080);
    my $namespace = $client->open_namespace("glinpe");
    my $result    = $client->hql_exec($namespace, "select * from words where row=\"maths\" keys_only");
};

if ($@) {
    if ($@->isa('Thrift::TException')) {
        print Dumper($@);
    } else {
        print Dumper($@);
    }
}
print "<h1>works</h1>";

问题是尝试从 Web 浏览器执行时出现错误:

$VAR1 = bless( { 'code' => 0, 'message' => 'TSocket: Could not connect to localhost:38080 (Permission denied)' }, 'Thrift::TException' );

当从终端(在 apache 用户下)运行时,脚本可以正常工作,如果删除所有 Hypertable 代码,也可以在浏览器中正常工作。

我在 iptables 中打开了 38080 端口:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 38080 -j ACCEPT

操作系统:Centos 5.6。

4

2 回答 2

0

错误消息说您缺少权限,所以这就是答案(用户 apache,无权创建到 localhost:38080 的套接字)

更新:详细一点,当你从终端运行它时,它是以普通用户身份运行的,但是当 apache 运行它时,它通常是在 apache 用户帐户下运行的,它可能没有打开套接字的权限

在这种情况下,您可能正在使用 SELinux,请参阅“man chcon”或搜索“SELinux 教程:配置 RHEL 5 和 Web 服务器”

于 2011-06-12T22:23:24.990 回答
0

好的,所以对于这个特定问题有两种解决方案: 1. 禁用 selinux - 更改 /etc/selinux/config 中的配置 2. 运行命令:

setsebool -P httpd_can_network_connect 1

感谢之前的回答让我重回正轨。

于 2011-06-13T04:42:24.603 回答