Página 1 de 1

500 Internal Server Error. ¿Módulo no instalado?

NotaPublicado: 2009-05-05 07:04 @336
por apardo
Hola a todos,

tengo un cgi que al ser ejecutado desde un formulario me devuelve error. En local (Win XP) me funciona correctamente.
Al darme error pensé que puede ser porque el servidor no tiene instalados unos módulos.

He creado un directorio lib/ en el servidor y he subido los .pm de mi directorio C:/perl/site/lib/Geo, pero me sigue dando error.

¿Hay que hacer algo más aparte de subirlos al servidor?

Gracias anticipadas / saludos / apardo

Muestro el código:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;
use lib '/home/www/miproveedordeinternet.net/lib';

use Geo::Distance;
use Geo::Forward;
use Getopt::Long;

my $gf  = Geo::Forward->new();
my $geo = new Geo::Distance;

&Lee_Form;
&Bucle_Coordenadas;

exit (0);
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

NotaPublicado: 2009-05-05 07:14 @343
por explorer
Pero, ¿qué error sale?

Copiar los módulos es una cosa, pero si los módulos no están escritos en "puro" Perl, entonces la instalación no es así de sencilla.

NotaPublicado: 2009-05-05 07:16 @344
por monoswim
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use strict;
use lib '/home/www/miproveedordeinternet.net/lib';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿ Eso te funciona en win XP ? Seguramente cambiando la dirección del lib/...

Al subirlo, ¿ la dirección /usr/bin/perl es correcta ? ¿ Y le das permisos chmod 755 al script ?

:adios:

NotaPublicado: 2009-05-05 11:17 @512
por apardo
Hola, explorer y monoswim,

Gracias por responder tan rápido.

monoswim: en XP me funciona cambiando la 1ª línea por #!C:\perl\bin\perl.exe -w y quitando la línea use lib...

Permisos y /usr/bin/perl revisados y correctos (ya tengo otros script funcionando).

Con el perl package manager me instalé los módulos Geo:: en mi XP. Cuando ya tenía el script a mi gusto y funcionando, cambié la 1ª línea por #!/usr/bin/perl -w

y subí el script al hosting. Al ejecutar me da un error. La faq del servidor dice que el 500 Internal server error puede ser porque algún módulo usado en el script no está cargado en el servidor.

Busqué info en este foro (ya no busco fuera) y encontré este tutorial:

http://perlenespanol.com/tutoriales/modulos/usar_modulos_sin_instalar.html

He creado un directorio lib/ en el hosting y he subido los .pm que creo que no están instalados. He incluido la línea
use lib 'caminocompleto/lib'
en mi script, y me sigue dando el mismo error.

explorer: los módulos son los instalados con el PPM
Código: Seleccionar todo
Geo-Distance
Calculate Distances and Closest Locations
   Version:   0.11
   Released:   2005-09-01
   Author:   Aran Clary Deltac <[email protected]>
   CPAN:   http://search.cpan.org/dist/Geo-Distance-0.11/

Installed files:
   C:/Perl/html/site/lib/Geo/Distance.html
   C:/Perl/site/lib/Geo/Distance.pm
   C:/Perl/site/lib/auto/Geo/Distance/.packlist

He subido
Código: Seleccionar todo
    C:/Perl/site/lib/Geo/Distance.pm  al servidor. ¿vale así?


Gracias anticipadas / saludos / apardo

NotaPublicado: 2009-05-05 12:15 @552
por explorer
A ver... no me pega meter módulos para Windows en un servidor UNIX...

NotaPublicado: 2009-05-05 13:43 @613
por apardo
Hola de nuevo,

Me parece que no me he sabido explicar...

Quiero hacer uso de este package: http://search.cpan.org/dist/Geo-Distance-0.11/
y de este: http://search.cpan.org/dist/Geo-Forward-0.11/
De estos package, utilizo esto:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Geo::Distance;
use Geo::Forward;
my $gf  = Geo::Forward->new();
my $geo = new Geo::Distance;
...
 ( $lat_inf, $lon_dcha ) = $gf->forward( $lat_sup, $lon_izda, 90.0,  $este_km * 1000 );
 ( $lat_inf, $lon_dcha ) = $gf->forward( $lat_inf, $lon_dcha, 180.0, $sur_km * 1000 );

 $dist_este = $geo->distance( 'meter', $lon_izda, $lat_sup, $lon_izda, $lat_inf );

 $dist_sur = $geo->distance( 'meter', $lon_izda, $lat_sup, $lon_dcha, $lat_sup );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como en casa uso XP, con el perl package manager los he instalado en mi PC; he hecho el script, lo he probado y funciona.

Ahora lo subo al hosting, lo ejecuto y me da el error 500 internal server.
Mi duda viene porque estoy suponiendo que el servidor no tiene instalados esos packages Geo::Distance y Geo::Forward.

El tutorial del foro indica que si el servidor no tiene los módulos instalados, cree un directorio, meta en él los módulos e incluya una línea, apuntando al camino absoluto donde he dejado los módulos; en mi caso, he creado el directorio lib, he copiado los pm y he incluido esta línea en el script:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use lib '/home/www/miquegordis.100webspace.net/lib';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


He comprobado que el pm que descarga el PPM de Windows es idéntico al que he descargado directamente desde http://search.cpan.org/dist/Geo-Forward-0.11/

Hago la pregunta de otra forma:
¿Hay manera de saber qué módulos tiene instalados el servidor hosting?

Gracias anticipadas / saludos / apardo

NotaPublicado: 2009-05-05 14:50 @660
por explorer
Disculpas, también, porque no me expresé bien. Quería decir que algunos módulos para Windows traen partes compiladas para esa arquitectura, por lo que no funcionarán en otra.

¿No tienes acceso a los registros de actividad del servidor web? Deberías intentar ver el contenido del fichero error.log para saber qué significa ese error 500.

Prueba a instalar mi CGI mínimo. Comprueba que funciona. Con la ayuda del módulo CGI::Carp verás los errores en el propio navegador. y además, viene de base con Perl, así que no tendrás que instalarlo. Cuando te funcione, prueba a poner los 'use' y ver si fallan y qué error te dan.

Como parece que estás en un sistema UNIX, comprueba que las carpetas donde has dejado el cgi como la de lib/, dejan pasar al usuario que ejecuta el servidor web. Con permisos 755 para carpetas y programas debería ser suficiente.

NotaPublicado: 2009-05-06 04:03 @210
por apardo
Hola, explorer, de nuevo tus indicaciones me han ayudado.

Bueno, un par de cosas:
1º- El CGI mínimo me da error al ejecutarlo. Aunque ya tengo otros scripts funcionando en el hosting, lo he creado y ejecutado para ver cómo funcionaba CGI::Carp.

He comprobado el camino del perl con los scripts que me funcionan y he visto que la única diferencia es que
Código: Seleccionar todo
#!/usr/bin/perl     NO funciona
#!/usr/bin/perl -w  SI funciona


2º- He incluido el CGI::Carp en mi script y me confirma lo que sospechaba:

Código: Seleccionar todo
Software error:

Can't locate Geo/Distance.pm in @INC (@INC contains: /home/www/miquegordis.100webspace.net/lib /etc/perl /usr/local/lib/perl/5.8.4 /usr/local/share/perl/5.8.4 /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_perl /usr/local/lib/perl/5.8.3 /usr/local/share/perl/5.8.3 /usr/local/lib/perl/5.8.2 /usr/local/share/perl/5.8.2 /usr/local/lib/perl/5.8.1 /usr/local/share/perl/5.8.1 /usr/local/lib/perl/5.8.0 /usr/local/share/perl/5.8.0 .) at /home/www/miquegordis.100webspace.net/cgi-bin/nuevo_kml_csupizda.cgi line 11.
BEGIN failed--compilation aborted at /home/www/miquegordis.100webspace.net/cgi-bin/nuevo_kml_csupizda.cgi line 11.
For help, please send mail to the webmaster ([email protected]), giving this error message and the time and date of the error.


Después de volverme loco cambiando el path del directorio lib/ con todas las combinaciones posibles, tanto path absoluto como relativo, el problema estaba en que:
NO vale colgar los módulos .pm a lo bruto en el directorio lib/ como hice, hay que colocarlos dentro de lib/ en el directorio correspondiente, esto es:
Código: Seleccionar todo
lib/Geo/*.pm
lib/XX/*.pm


¡¡Ya lo tengo funcionando!!
Muchas gracias / saludos / apardo

PD: eso del Carp ¡¡es la caña!! ¿por qué no lo conocería antes...?

NotaPublicado: 2009-05-06 06:59 @333
por explorer
Con respecto al primer problema, quizás sea porque la línea contenga algún carácter de fin de línea que no le guste al UNIX en donde lo estás ejecutando.

Borra la línea, completamente, escríbela de nuevo, y asegúrate que lo guardas con finales de línea estilo UNIX/Linux (solo un carácter de avance de línea).

Con respecto al segundo problema, pues eso de guardar los módulos de forma jerárquica, sí que es una forma peculiar de guardar los módulos en Perl, pero es algo de lo que te das cuenta viendo el árbol de módulos que toda distribución Perl instala. O en alguna parte recóndita de la documentación, como en perldoc perlmod (sí, ya sé que es espesa. Para eso estamos los monjes del Perl, para facilitar las cosas).

NotaPublicado: 2009-05-08 16:32 @730
por Jenda
Si los .pm estaban en C:/perl/site/lib/Geo, deberías ponerlos en .../lib/Geo.

Pero especialmente si hay otro OS debes instalar los módulos correctamente, ¡no copiarlos manualmente!