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

OS:Centos5.6。

4

2 に答える 2

0

エラーメッセージには、アクセス許可がないことが示されているため、それが答えになります(ユーザーapacheには、localhost:38080へのソケットを作成するアクセス許可がありません)

更新:詳しく説明すると、ターミナルから実行すると、通常のユーザーとして実行されますが、apacheを実行すると、ほとんどの場合、ソケットを開く権限がないapacheユーザーアカウントで実行されます。

SELinuxを使用している可能性があります。その場合は、「man chcon」を参照するか、「SELinuxチュートリアル:RHEL5およびWebサーバーの構成」を検索してください。

于 2011-06-12T22:23:24.990 に答える
0

OK、この特定の問題には2つの解決策があります:1。selinuxを無効にします-/ etc / selinux /configの設定を変更します2.コマンドを実行します:

setsebool -P httpd_can_network_connect 1

私を軌道に戻すための以前の回答に感謝します。

于 2011-06-13T04:42:24.603 に答える