2015-03-05 5 views
0

Это мой простой привет-мир FastCGI скрипт, написанный на языке C.FastCGI скрипт не может найти libfcgi.so.0 в Apache 2.4.6 и 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")); 
} 

Он отлично работает, если я скомпилирован с использованием статического сшивание.

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

Но при использовании динамического связывания ...

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

Это не может ти из-за ошибки в апача 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 

Так я говорю Apache и mod_fastcgi искать этот файл, в котором он находится установка переменной LD_LIBRARY_PATH в httpd.conf ...

SetEnv LD_LIBRARY_PATH /usr/local/lib 

... и fastcgi.conf.

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

Использование статического связанный скрипт, getenv("LD_LIBRARY_PATH") возвращает /usr/local/lib, но динамические-сшитый сценарии еще не бросали найденные ошибки для libfcgi.so.0.

Любые идеи, чтобы сделать эту работу?

Заранее спасибо.

ответ

1

У меня была аналогичная проблема с nginx, я исправил ее, используя опцию rpath.

Не уверен, что это поможет с Apache. Попробуйте создать свой бинарный файл, как это:

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

Убедитесь, что файл библиотеки libfcgi.so.0 присутствует в /usr/local/lib.

Если у вас нет доступа к /usr/local/lib, создайте папку lib в своем $HOME и скопируйте там файл библиотеки. И обновите rpath, чтобы указать туда. Например, если ваш $HOME является /home/xyz, то вы бы построить, как:

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

Иногда я использую этот трюк, чтобы загрузить новые библиотеки, чем то, что установлен в системе.

+0

Опция '-rpath' была трюком. Спасибо дружище! Через пару часов вы получите +50. – cdonts