Найти - Пользователи
Полная версия: Apache/2.2.20 (Ubuntu) + Python 2.7.2 + FastCGI
Начало » Web » Apache/2.2.20 (Ubuntu) + Python 2.7.2 + FastCGI
1
FILLIPO
Здравствуйте. Хотелось бы помощи: питоновский FastCGI скрипт пишет в error.log вместо того, чтобы отвечать клиенту.

Код скрипта
#!/usr/bin/python

print "Content-Type=\"text/html; charset=utf-8\""
print "<html><body>Hello, FastCGIWORLD!</body></html>"
Фрагмент error.log
[Wed Jan 04 23:08:29 2012] [error] [client 127.0.0.1] FastCGI: comm with (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" aborted: (first read) idle timeout (30 sec)
[Wed Jan 04 23:08:29 2012] [error] [client 127.0.0.1] FastCGI: incomplete headers (0 bytes) received from server "/var/www/fcgi-bin/HelloFastCGIWorld.py"
[Wed Jan 04 23:08:33 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" restarted (pid 6750)
Content-Type="text/html; charset=utf-8"
<html><body>Hello, FastCGIWORLD!</body></html>
причем примечательно, что даже когда к скрипту не обращаются, он исправно каждые 5 секунд пишет в error.log, убивается и воскресает.
[Wed Jan 04 23:08:08 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" (pid 6731) terminated by calling exit with status '0'
[Wed Jan 04 23:08:13 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" restarted (pid 6732)
Content-Type="text/html; charset=utf-8"
<html><body>Hello, FastCGIWORLD!</body></html>
[Wed Jan 04 23:08:13 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" (pid 6732) terminated by calling exit with status '0'
[Wed Jan 04 23:08:18 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" restarted (pid 6733)
Content-Type="text/html; charset=utf-8"
<html><body>Hello, FastCGIWORLD!</body></html>
[Wed Jan 04 23:08:18 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" (pid 6733) terminated by calling exit with status '0'
[Wed Jan 04 23:08:23 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" restarted (pid 6747)
Content-Type="text/html; charset=utf-8"
<html><body>Hello, FastCGIWORLD!</body></html>
[Wed Jan 04 23:08:23 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" (pid 6747) terminated by calling exit with status '0'
[Wed Jan 04 23:08:28 2012] [warn] FastCGI: (dynamic) server "/var/www/fcgi-bin/HelloFastCGIWorld.py" restarted (pid 6748)
Content-Type="text/html; charset=utf-8"
<html><body>Hello, FastCGIWORLD!</body></html>
google дал ответ, который я не понимаю
mod_fastcgi logs FastCGI application error (stderr) output to the server log associated with the request. Errors reported by the FastCGI process manager, fcgi-pm, are reported to the main server log (typically, logs/error_log). Data written to stdout or stderr before entering the FastCGI accept loop or via a mechanism that is not FastCGI protocol aware will also be directed to the main server log. If Apache's LogLevel is set to info additional informational messages are printed to the logs, these messages may be especially helpful while debugging a configuration.
что такое FastCGI accept loop? как выглядит питоновский FastCGI-совместимый скрипт?
и да, wsgi не предлагайте пожалуйста, ведь, как я это понимаю: wsgi - только питоновская штука, а FastCGI - целый протокол, по которому сервер умеет общаться с программами на разных языках.
o7412369815963
FILLIPO
и да, wsgi не предлагайте пожалуйста, ведь, как я это понимаю: wsgi - только питоновская штука, а FastCGI - целый протокол, по которому сервер умеет общаться с программами на разных языках.
Предложение не имеет смысла т.к. wsgi - протокол между питоном и сервером, а “FastCGI - целый протокол, по которому сервер умеет общаться с программами на разных языках”, вы же не из питона будете общаться с программами на разных языках через fcgi.

Возможно вы хотели сказать, что wsgi понимают не все веб-вервера, но опять же это необоснованные страхи, т.к. в этом случае можно использовать apache как прослойку от питона к “боевому” серверу.
Ещё можете глянуть uwsgi.
py.user.next
там, вроде, нужно print вставить

#!/usr/bin/env python

print "Content-Type=\"text/html; charset=utf-8\""
print
print "<html><body>Hello, FastCGIWORLD!</body></html>"
FILLIPO
py.user.next
там, вроде, нужно print вставить
вставил один, вставил второй (кажется, header'ы от body отделяются двумя пробелами?), поменял shebang на ваш - по-прежнему печатается в error.log

o7412369815963
я имел в виду, что один раз прочитав, настроив и поняв FastCGI, потом можно пользоваться любым языком для написания скриптов, а не только питоном, но про wsgi и uwsgi почитаю еще (меня остановило именно то, что эти два протокола только для связи сервер - питон - сервер, а не сервер - любой язык - сервер). Теперь сначала хочу заставить заработать python через FastCGI хотя бы потому, что уже потратил достаточное время на “раскопки”. Поэтому, если кому по-прежнему интересно, еще пара фактов:
в mods-enabled вижу среди прочего: cgid.conf cgid.load fastcgi.conf fastcgi.load (в свою очередь в apache2.conf есть строчки, которые подключают все .conf файлы из mods-enabled), содержимое
cgid.conf
# Socket for cgid communication
ScriptSock ${APACHE_RUN_DIR}/cgisock
fastcgi.conf
<IfModule mod_fastcgi.c>
#AddHandler fastcgi-script .fcgi
AddHandler fastcgi-script .py py .fcgi fcgi
#FastCgiWrapper /usr/lib/apache2/suexec
FastCgiIpcDir /var/lib/apache2/fastcgi
</IfModule>

<Directory /var/www/fcgi-bin>
Options +ExecCGI
</Directory>
права на fcgi-bin
all3fox@faeton:/var/www$ stat fcgi-bin
File: «fcgi-bin»
Size: 4096 Blocks: 8 IO Block: 4096 каталог
Device: 801h/2049d Inode: 394341 Links: 3
Access: (0777/drwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-01-05 10:22:44.338159882 +0400
Modify: 2012-01-05 10:24:13.726603141 +0400
Change: 2012-01-05 10:24:13.726603141 +0400
all3fox@faeton:/var/www$ stat fcgi-bin/HelloFastCGIWorld.py
File: «fcgi-bin/HelloFastCGIWorld.py»
Size: 140 Blocks: 8 IO Block: 4096 обычный файл
Device: 801h/2049d Inode: 394212 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2012-01-05 10:24:16.390616353 +0400
Modify: 2012-01-05 10:24:13.674602880 +0400
Change: 2012-01-05 10:24:13.726603141 +0400
проблема остается прежней: питоновский fast-cgi скрипт пишет в error.log вместо того, чтобы отвечать клиенту

UPD
тем временем был проштудирован питоновский мануал, код скрипта изменен на православно простой
#!/usr/bin/python

print "Content-Type: text/html"
print
print "Hello, world!"
ошибка осталось, из чего напрашивается вывод: дело не в питоне, мне нужна помощь по апачу и его fast-cgi модулю? Попробовал поискать нормальный форум - не нашел, на irc канал #httpd попасть не смог.
o7412369815963
> уже потратил достаточное время на “раскопки”.

и ещё потратите, “все” уже давно на wsgi =), разворачивается за 5 мин на норм дистрибе. http://www.py-my.ru/post/4bfb3c691d41c846bc00000f

> только для связи сервер - питон - сервер, а не сервер - любой язык - сервер
похоже что оно “никому” не нужно - для “каждого” языка свой протокол:
php - mod_php - apache
ruby - mod_ruby apache
python - mod_wsgi - apache
FILLIPO
o7412369815963
“все” уже давно на wsgi
понял, уже бегу :), за ссылку спасибо.
FILLIPO
Не удержусь и напишу о текущем положении дел: поставил wsgi, почитал, дописал в wsgi.conf WSGIScriptAlias - работает. Дописал в fastcgi.conf ScriptAlias - заработало. Ну почему тогда <Directory путь_к_скриптам>Options +ExecCGI</Directory> не работает для FastCGI? Ведь факт, что отрабатывает со ScriptAlias подтвердил, что fastCGI я настроил правильно. Все, больше не ною и работаю с wsgi.
s0rg
У вас обычное CGI приложение, а FastCGI - это протокол.
То есть вам нужно создать сокет (TCP или Unix) и слушать его.

Вот тут подробнее:
http://fastcgi.com/devkit/doc/fcgi-spec.html
http://www.nongnu.org/fastcgi/#AEN147
FILLIPO
s0rg
Спасибо, этого еще не читал. Но мне казалось, что общение с socket берет на себя apache, отсюда и строки из файлов его настройки:
из cgid.conf
# Socket for cgid communication
ScriptSock ${APACHE_RUN_DIR}/cgisock
из fastcgi.conf
FastCgiIpcDir /var/lib/apache2/fastcgi
то есть я думал, что stdout скрипта apache сам перенаправляет в socket. В любом случае сейчас пойду читать ссылки и гуглить. Спасибо.
s0rg
Неа - этим вы указываете какой именно сокет вы слушаете - но создавать / слушать - полностью ваша задача.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB