Форум сайта python.su
Здравствуйте. Хотелось бы помощи: питоновский FastCGI скрипт пишет в error.log вместо того, чтобы отвечать клиенту.
Код скрипта
#!/usr/bin/python
print "Content-Type=\"text/html; charset=utf-8\""
print "<html><body>Hello, FastCGIWORLD!</body></html>"
[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>
[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>
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-совместимый скрипт?
Офлайн
FILLIPOПредложение не имеет смысла т.к. wsgi - протокол между питоном и сервером, а “FastCGI - целый протокол, по которому сервер умеет общаться с программами на разных языках”, вы же не из питона будете общаться с программами на разных языках через fcgi.
и да, wsgi не предлагайте пожалуйста, ведь, как я это понимаю: wsgi - только питоновская штука, а FastCGI - целый протокол, по которому сервер умеет общаться с программами на разных языках.
Офлайн
там, вроде, нужно print вставить
#!/usr/bin/env python
print "Content-Type=\"text/html; charset=utf-8\""
print "<html><body>Hello, FastCGIWORLD!</body></html>"
Офлайн
py.user.nextвставил один, вставил второй (кажется, header'ы от body отделяются двумя пробелами?), поменял shebang на ваш - по-прежнему печатается в error.log
там, вроде, нужно print вставить
# Socket for cgid communication
ScriptSock ${APACHE_RUN_DIR}/cgisock
<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>
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
#!/usr/bin/python
print "Content-Type: text/html"
print "Hello, world!"
Отредактировано (Янв. 5, 2012 10:54:05)
Офлайн
> уже потратил достаточное время на “раскопки”.
и ещё потратите, “все” уже давно на wsgi =), разворачивается за 5 мин на норм дистрибе. http://www.py-my.ru/post/4bfb3c691d41c846bc00000f
> только для связи сервер - питон - сервер, а не сервер - любой язык - сервер
похоже что оно “никому” не нужно - для “каждого” языка свой протокол:
php - mod_php - apache
ruby - mod_ruby apache
python - mod_wsgi - apache
…
Офлайн
o7412369815963понял, уже бегу :), за ссылку спасибо.
“все” уже давно на wsgi
Офлайн
Не удержусь и напишу о текущем положении дел: поставил wsgi, почитал, дописал в wsgi.conf WSGIScriptAlias - работает. Дописал в fastcgi.conf ScriptAlias - заработало. Ну почему тогда <Directory путь_к_скриптам>Options +ExecCGI</Directory> не работает для FastCGI? Ведь факт, что отрабатывает со ScriptAlias подтвердил, что fastCGI я настроил правильно. Все, больше не ною и работаю с wsgi.
Офлайн
У вас обычное CGI приложение, а FastCGI - это протокол.
То есть вам нужно создать сокет (TCP или Unix) и слушать его.
Вот тут подробнее:
http://fastcgi.com/devkit/doc/fcgi-spec.html
http://www.nongnu.org/fastcgi/#AEN147
Офлайн
s0rg
Спасибо, этого еще не читал. Но мне казалось, что общение с socket берет на себя apache, отсюда и строки из файлов его настройки:
из cgid.conf
# Socket for cgid communication
ScriptSock ${APACHE_RUN_DIR}/cgisock
FastCgiIpcDir /var/lib/apache2/fastcgi
Офлайн
Неа - этим вы указываете какой именно сокет вы слушаете - но создавать / слушать - полностью ваша задача.
Офлайн