Почему мой простой Perl-скрипт fastCGI не работает? - PullRequest
4 голосов
/ 04 декабря 2008

Я не из мира Perl, поэтому кое-что из этого является новым для меня. Я использую Ubuntu Hardy LTS с установленными пакетами apache2 и mod_fcgid. Я бы хотел, чтобы MT4 работал под fcgid, а не под mod-cgi (похоже, он работает нормально с обычным CGI).

Я не могу заставить даже простой скрипт на Perl работать под fcgid. Я создал простое приложение «Hello World» и включил код из этого предыдущего вопроса , чтобы проверить, работает ли FCGI.

Я назвал свой скрипт HelloWorld.fcgi (в настоящее время fcgid настроен на обработку только файлов .fcgi). Код:

#!/usr/bin/perl

use FCGI;

print "Content-type: text/html\n\n";
print "Hello world.\n\n";
my $request = FCGI::Request();
if ( $request->IsFastCGI ) { 
    print "we're running under FastCGI!\n";
} else { 
    print "plain old boring CGI\n";
}

При запуске из командной строки он печатает «обычный старый скучный ...» При вызове через HTTP-запрос к apache я получаю 500 внутренних ошибок сервера и выходные данные сценария печатаются в журнал ошибок Apache:

Content-type: text/html

Hello world.

we're running under FastCGI!
[Wed Dec 03 22:26:19 2008] [warn] (104)Connection reset by peer: mod_fcgid: read data from fastcgi server error.
[Wed Dec 03 22:26:19 2008] [error] [client 70.23.221.171] Premature end of script headers: HelloWorld.fcgi
[Wed Dec 03 22:26:25 2008] [notice] mod_fcgid: process /www/mt/HelloWorld.fcgi(14189) exit(communication error), terminated by calling exit(), return code: 0

Когда я запускаю .cgi-версию того же кода, она работает нормально. Любая идея, почему вывод сценария идет в журнал ошибок? Конфигурация Apache является конфигурацией по умолчанию mod_fcgid plus, в директиве VirtualHost:

  ServerName test1.example.com
  DocumentRoot /www/example

  <Directory /www/example>
    AllowOverride None
    AddHandler cgi-script .cgi
    AddHandler fcgid-script .fcgi
    Options +ExecCGI +Includes +FollowSymLinks
  </Directory>

Ответы [ 4 ]

3 голосов
/ 25 декабря 2008

Проблема в том, что заголовок «Content-Type» отправляется за пределы цикла запроса. Вы должны напечатать заголовок «Content-Type» для каждого запроса. Если вы двигаетесь

распечатать "Content-type: text / html \ n \ n";

к началу цикла запроса это должно решить проблему.

Кроме того, вам нужно перебирать запросы, иначе вы не получите никакой выгоды, поэтому следуйте примеру первого автора:

my $request = FCGI::Request();
while($request->Accept() >= 0) {
  print("Content-type: text/html\n\n");
}
3 голосов
/ 04 декабря 2008

Я использую CGI :: Fast больше, чем FCGI, но идея та же самая, я думаю. Целью быстрого cgi является однократная загрузка программы и повторение цикла для каждого запроса.

Справочная страница FCGI гласит:

use FCGI;

my $count = 0;
my $request = FCGI::Request();

while($request->Accept() >= 0) {
    print("Content-type: text/html\r\n\r\n", ++$count);
}

Это означает, что вы должны Accept запрос, прежде чем вы сможете что-либо напечатать обратно в браузер.

2 голосов
/ 24 декабря 2008

Movable Type использует CGI :: Fast для FastCGI. Типичный скрипт FastCGI выполняется в цикле, как описано mat . Цикл, использующий CGI :: Fast, будет выглядеть так:

#!/usr/bin/perl

use strict;
use CGI::Fast;

my $count = 0;
while (my $q = CGI::Fast->new) {
    print("Content-Type: text/plain\n\n");
    print("Process ID: $$; Count is: " . ++$count);
}

Я тестировал этот сценарий на сервере с установленными модулями FCGI и CGI :: Fast и рассчитывал приращения, как и следовало ожидать. Если идентификатор процесса изменится, счетчик вернется к 1, а затем увеличится в этом процессе. Конечно, у каждого процесса есть свое переменное пространство.

Для MT, включение FastCGI - это вопрос переименования (или символической ссылки) скриптов cgi в 'fcgi' (или создание обработчика для скриптов 'cgi' fcgid, но это не сработает для mt-xmlrpc.cgi, который не является t FastCGI пока дружелюбен). Вам также необходимо добавить некоторые директивы в ваш файл mt-config.cgi, чтобы он знал имена новых скриптов. Как это:

AdminScript mt.fcgi
CommentsScript mt-comments.fcgi

И так далее. Дополнительная документация, относящаяся к FastCGI и Movable Type, доступна на movabletype.org .

0 голосов
/ 25 декабря 2008

В любом случае, исходя из журналов ошибок вашего сервера, похоже, что FCGI работает и вызывается правильно, но ваш скрипт просто не работает в цикле, ожидая следующего запроса. Итак, ваш тестовый скрипт выполнил задачу - сообщил, настроен ли FastCGI или нет. Так что теперь у вас должна быть возможность перенастроить MT для использования FastCGI.

...