Question

Je suis en train de développer une application Web en Perl utilisant Hypertable . Exemple de code:

#!/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>";

Le problème est lorsque vous essayez d'exécuter à partir d'un navigateur Web, je reçois une erreur:

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

Les scripts fonctionne correctement lors de l'exécution d'un terminal (sous apache utilisateur), et aussi bien dans un navigateur si supprimer tout le code Hypertable.

J'ai 38080 le port ouvert en iptables:

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

OS. Centos 5.6

Était-ce utile?

La solution 2

OK, donc il y a deux solutions à ce problème particulier: 1. désactiver SELinux - configuration de changement dans / etc / selinux / config 2. commande d'exécution:

setsebool -P httpd_can_network_connect 1

Merci à la réponse précédente pour me mettre sur la bonne voie.

Autres conseils

Le message d'erreur indique que vous manquez la permission, alors ce serait la réponse (utilisateur apache, n'a pas l'autorisation de créer socket localhost: 38080)

Mise à jour: d'élaborer, lorsque vous l'exécutez à partir d'un terminal, il est en cours d'exécution en tant qu'utilisateur normal, mais quand apache l'exécute, le plus souvent il est en cours d'exécution sous apache compte utilisateur, qui peut ne pas avoir la permission de sockets ouvertes

Il pourrait être que vous utilisez SELinux dans ce cas, voir « l'homme chcon » ou rechercher "tutoriel SELinux: Configuration RHEL 5 et les serveurs Web"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top