我正在尝试使用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。
答案 0 :(得分:0)
错误消息显示您缺少权限,因此这将是答案(用户apache,无权创建到localhost的套接字:38080)
更新:详细说明,当你从终端运行它时,它作为普通用户运行,但是当apache运行它时,大多数情况下它运行在apache用户帐户下,可能没有打开套接字的权限
可能是你正在使用SELinux,在这种情况下看'man chcon' 或搜索“SELinux教程:配置RHEL 5和Web服务器”
答案 1 :(得分:0)
好的,所以这个特定问题有两个解决方案: 1.禁用selinux - 更改/ etc / selinux / config中的配置 2.运行命令:
setsebool -P httpd_can_network_connect 1
感谢之前的回答,让我重回正轨。