Я пытаюсь получить Django + mod_fcgid настройка работает (mod_wsgi сложен, так как у меня есть статически связанный Python. Не спрашивайте.) Хотя это было тривиально для моей системы разработки Mac OS X, запустить ее на сервере до сих пор было невозможно.
С этой конфигурацией
LoadModule fcgid_module modules/mod_fcgid.so
FCGIDSocketPath run/mod_fcgid
FCGIDSharememPath run/mod_fcgid/fcgid_shm
ScriptAliasMatch /apps/([^/]+)(/.*)? /var/www/apps/$1/apache/dispatch.fcgi$2
<DirectoryMatch ^/var/www/apps/([^/]+)/apache>
SetHandler fcgid-script
Order allow,deny
Allow from all
Options +ExecCGI
</DirectoryMatch>
и этот пример dispatch.fcgi
:
#!/usr/bin/python
import sys
sys.path.insert(0, '/var/www/lib/python2.5/site-packages/flup-1.0.2.egg')
def myapp(environ, start_response):
start_response('200 OK', [('Content-Type', 'text/plain')])
return ['This is my hello world test!\n']
if __name__ == '__main__':
from flup.server.fcgi import WSGIServer
WSGIServer(myapp).run()
Просмотр моей тестовой страницы дает ошибку 500, и в моих журналах ошибок Apache я получаю:
WSGIServer: missing FastCGI param REQUEST_METHOD required by WSGI!
WSGIServer: missing FastCGI param SERVER_NAME required by WSGI!
WSGIServer: missing FastCGI param SERVER_PORT required by WSGI!
WSGIServer: missing FastCGI param SERVER_PROTOCOL required by WSGI!
Status: 200 OK
Content-Type: text/plain
Content-Length: 29
This is my hello world test!
[Wed Sep 30 11:09:18 2009] [notice] mod_fcgid: process /var/www/apps/test/apache/dispatch.fcgi(31043) exit(server exited), terminated by calling exit(), return code: 0
Вот мой результат, отлично выглядит - кроме журнала ошибок Apache, а не окна моего браузера.
Когда я удаляю свой SetHandler
директива, вывод идет именно там, где я хочу; очевидно, он работает в обычном режиме CGI. Это недостаточно эффективно для моего приложения Django, которое в этой конфигурации загружает страницу 1-2 секунды.
Пока что я пробовал:
Кажется, ничего не меняет, за исключением того, что использование AliasMatch показывает мне источник, чего я и ожидал.
Опять же, это было абсолютно тривиально в Mac OS X. Это просто работает с сопоставимой конфигурацией.
Помимо получения лучшего Python и использования mod_wsgi (что возможно, если больно), как мне заставить его работать?
Проблема: какая-то политика SELinux. Я недостаточно эксперт, чтобы диагностировать это, но делаю:
/usr/sbin/setenforce 0
заставляет все работать как шарм.