2015-03-05 1 views
0

Ceci est mon simple script FastCGI bonjour monde écrit en C.script FastCGI ne peut pas trouver libfcgi.so.0 dans Apache 2.4.6 et mod_fastcgi

#include "fcgi_stdio.h" 
#include <stdlib.h> 

void main(void) 
{ 
int count = 0; 
while(FCGI_Accept() >= 0) 
    printf("Content-type: text/html\r\n" 
      "\r\n" 
      "<title>FastCGI Hello!</title>" 
      "<h1>FastCGI Hello!</h1>" 
      "Request number %d running on host <i>%s</i>\n", 
      ++count, getenv("SERVER_NAME")); 
} 

Il fonctionne très bien si je compilé à l'aide statique mise en relation.

gcc -o "test.fcg" "test.c" /usr/local/lib/libfcgi.a 

Mais lors de l'utilisation ... liaison dynamique

gcc -o "test.fcg" -lfcgi "test.c" 

Il échoue cinque l'erreur suivante dans Apache error_log.

/var/www/fcgi-bin/test.fcg: error while loading shared libraries: libfcgi.so.0: cannot open shared object file: No such file or directory 
[Thu Mar 05 14:04:22.707096 2015] [:warn] [pid 6544] FastCGI: (dynamic) server "/var/www/fcgi-bin/test.fcg" (pid 6967) terminated by calling exit with status '127' 
[Thu Mar 05 14:04:22.707527 2015] [:warn] [pid 6544] FastCGI: (dynamic) server "/var/www/fcgi-bin/test.fcg" has failed to remain running for 30 seconds given 3 attempts, its restart interval has been backed off to 600 seconds 

Je dis Apache et mod_fastcgi chercher ce fichier dans lequel il est situé définissant la variable LD_LIBRARY_PATH dans httpd.conf ...

SetEnv LD_LIBRARY_PATH /usr/local/lib 

... et fastcgi.conf.

FastCgiConfig -initial-env LD_LIBRARY_PATH=/usr/local/lib -idle-timeout 20 -maxClassProcesses 1 

Utilisation d'un script statique lié, getenv("LD_LIBRARY_PATH") retours /usr/local/lib, mais les scripts dynamiques liés jettent encore des erreurs non trouvées pour libfcgi.so.0.

Des idées pour que cela fonctionne?

Merci d'avance.

Répondre

1

J'ai eu un problème similaire avec nginx, je l'ai corrigé en utilisant l'option rpath.

Vous ne savez pas si cela peut vous aider avec Apache. Essayez de construire votre binaire comme ceci:

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg 

Assurez-vous que le fichier de bibliothèque libfcgi.so.0 est présent à /usr/local/lib.

Si vous n'avez pas accès à /usr/local/lib, créez le dossier lib dans votre $HOME et copiez-y le fichier de bibliothèque. Et mettre à jour le rpath pour pointer vers là. Par exemple, si votre $HOME est /home/xyz, alors vous construire comme:

gcc test.c -Wl,-rpath /home/xyz/lib -lfcgi -o test.fcg 

Parfois j'utiliser cette astuce pour charger les bibliothèques plus récentes que ce qui est installé sur le système.

+0

L'option '-rpath' était l'astuce. Merci mon pote! Vous recevrez votre +50 en quelques heures. – cdonts