apache2 FastCGI-коммуникация с динамическим сервером прервана время ожидания при первом чтении
Описание: Невозможно запустить любой из самых простых сценариев FastCGI "Hello World", любой запрос всегда заканчивается тайм-аутом. Кажется, что нет никакой связи между сервером и скриптами FastCGI (с использованием динамических скриптов FastCGI).
Окружающая среда
- Ubuntu Precise (12.04)
- пакет
apache2.2-bin
- пакет
apache2-mpm-prefork
- пакет
libapache2-mod-fastcgi
- пакет
libfcgi-perl
- пакет
python-flup
- Несколько сайтов, настроенных как виртуальные хосты на
127.0.0.1
- Существует
/var/lib/apache2/fastcgi
каталог, принадлежащийwww-data
Доступно для чтения всем (владелец, группа и другие) - Существует
/var/lib/apache2/fastcgi/dynamic
каталог, принадлежащийwww-data
, который ограничен владельцем (читаемый, доступный для записи и доступный дляwww-data
только) - Существует файл индекса / сокета в
/var/lib/apache2/fastcgi/
каталог
FastCGI соответствующие конфигурации:
Каталог /etc/apache2/mods-enabled/
содержит ссылку на fastcgi.conf
а также fastcgi.load
(mod_fastcgi
включен).
Файл fastcgi.conf
содержит следующее (осталось нетронутым, я его не редактировал):
<IfModule mod_fastcgi.c>
AddHandler fastcgi-script .fcgi
#FastCgiWrapper /usr/lib/apache2/suexec
FastCgiIpcDir /var/lib/apache2/fastcgi
</IfModule>
Соответствующий файл конфигурации в /etc/apache2/sites-enabled/
содержит следующее (больше ничего нет о специфической конфигурации FastCGI):
<DirectoryMatch /fcgi-bin>
Options +ExecCGI
<FilesMatch "^[^\.]+$">
SetHandler fastcgi-script
</FilesMatch>
</DirectoryMatch>
Тестовые материалы на тестовом виртуальном хосте:
Там существует fcgi-bin/test-perl.fcgi
чей контент (файл является исполняемым для всех и читаемым для владельца и группы):
#!/usr/bin/perl
use CGI::Fast qw(:standard);
$COUNTER = 0;
while (new CGI::Fast) {
print header;
print start_html("Fast CGI Rocks");
print
h1("Fast CGI Rocks"),
"Invocation number ",b($COUNTER++),
" PID ",b($$),".",
hr;
print end_html;
}
Там существует fcgi-bin/test-python.fcgi
чей контент (файл является исполняемым для всех и читаемым для владельца и группы):
#!/usr/bin/python
def myapp(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['Hello World!\n']
try:
from flup.server.fcgi import WSGIServer
WSGIServer(myapp).run()
except:
import sys, traceback
traceback.print_exc(file=open("errlog.txt","a"))
Проблема
Хотя оба fcgi-bin/test-perl.fcgi
а также fcgi-bin/test-python.fcgi
работает нормально, когда выполняется из командной строки, ни один, кажется, не работает при вызове, например, как http://test.loc/fcgi-bin/test-perl.fcgi
или же http://test.loc/fcgi-bin/test-python.fcgi
,
Ничего не происходит, и после некоторой задержки я получаю ошибку 500, и журналы ошибок Apache содержат несколько записей, похожих на:
[<date>] [error] [client <IP>] FastCGI: comm with (dynamic) server "/<…>/fcgi-bin/<script>.fcgi" aborted: (first read) idle timeout (30 sec), referer: <referrer>
[<date>] [error] [client <IP>] FastCGI: incomplete headers (0 bytes) received from server "<…>/fcgi-bin/<script>.fcgi", referer: <referrer>
Я часами искал в Интернете, пытаясь понять, почему он не работает, и, наконец, решил сдаться и попросить помощи здесь.
Любые указатели и контрольный список приветствуются. Не стесняйтесь спрашивать о любых недостающих деталях, которые вы считаете актуальными или заслуживающими проверки.
Приятного дня.
-- редактировать --
Обновление проблемы
В моем собственном ответе на мой собственный вопрос я упомянул странный случай, когда все вдруг выглядело нормально без причин. Позже я обнаружил, что это было только отчасти хорошо.
На одном и том же виртуальном хосте, то есть с точно такой же конфигурацией сервера, некоторые сценарии, которые абсолютно одинаковы (и имеют точно такие же права доступа), завершаются ошибкой в зависимости от их расположения.
В остальном вот что в конфигурации сайта:
<DirectoryMatch /fcgi-bin>
Options +ExecCGI
<FilesMatch "^[^\.]+$">
SetHandler fastcgi-script
</FilesMatch>
</DirectoryMatch>
С учетом вышеизложенного, только сценарии в /fcgi-bin
обрабатываются как скрипт FastCGI. Но у меня также есть некоторые другие (все еще для тестирования): один в /cgi-bin
и один в /
(т.е. в public_html
каталог). Для этого .htaccess
содержит эту запись:
Options +ExecCGI
AddHandler fastcgi-script .fcgi
Таким образом, два других скрипта FastCGI должны работать так же, как /fcgi-bin
, но они этого не делают, и в настоящее время они неизменно заканчиваются тайм-аутом соединения, так же, как /fcgi-bin
первый сделал.
Это заставляет меня чувствовать, что что-то может быть не так с mod_fastcgi
модуль (известная ошибка? еще?). Пока что этот модуль работает довольно случайно.
- редактировать 2 -
Выше в первом редактировании было моей ошибкой: группа была не права с другими сценариями, это должно было быть www-data
, но это не так. Так что что-то не так, придерживайтесь ответа, который я дал, то есть попробуйте посмотреть на FastCgiConfig
и посмотрите, решит ли он что-нибудь или хотя бы соблюдает параметры тайм-аута.
3 ответа
Я отвечу на свой вопрос, как мне кажется, работает сейчас. Однако эпилог все еще выглядит странно.
Хотя конфигурация по умолчанию должна быть в порядке, я все же хотел еще раз просмотреть документ "Module mod_fastcgi". Поскольку я хотел только динамический FastCGI, я сосредоточился на FastCgiConfig
только директива, поэтому намеренно не FastCgiServer
а также FastCgiExternalServer
директивы.
Как не было FastCgiServer
вообще по умолчанию fastcgi.conf
файл, я начал пытаться настроить свой собственный. Для первого теста я хотел использовать -appConnTimeout
вариант, по крайней мере, попросить сервер не ждать так долго, прежде чем он возвращает мне ошибку 500.
Поэтому я просто добавил это в конфигурацию сайта (я не трогал fastcgi.cong
), в том же файле, где настроены виртуальные хосты:
FastCgiConfig -appConnTimeout 2
Это означало, что сервер должен ждать не более 2 секунд вместо 30 секунд ожидания. Я попытался вызвать скрипт FastCGI, чтобы увидеть, работает ли хотя бы эта конфигурация. Я ожидал получить ошибку с задержкой в 2 секунды, но вместо этого скрипт работал без ошибок.
Что странно, так это то, что я затем попытался удалить эту опцию, чтобы проверить, было ли это просто то дополнение, которое просто отсутствовало, чтобы заставить работать скрипты FastCGI. Но после того, как я закомментировал эту опцию, она все еще работала и после полной перезагрузки осталась прежней.
Больше не могу сказать, это выглядит странно, но это единственное, что я сделал, я больше ничего не редактировал. Я могу просто предложить людям, которые могут столкнуться с подобной проблемой, просто попробовать выше.
Извините, если я не могу объяснить, что именно он сделал. Я действительно хотел бы знать. Сейчас это работает, но я не знаю почему.
Ответ peng.rl решит мою проблему.
Мой ceph radosgw вообще не может получить информацию от apache. после отключения FastCgiWrapper я могу записывать данные в wireshark.