O problema: alguma política do SELinux. Eu não sou especialista o suficiente para diagnosticar, mas fazendo:
/usr/sbin/setenforce 0
faz tudo funcionar como um encanto.
Eu estou tentando fazer um setup do Django + mod_fcgid funcionando (o mod_wsgi é complicado, já que eu tenho um link estaticamente Python, não pergunte. Embora isso tenha sido trivial na minha caixa de desenvolvimento do Mac OS X, a execução do mesmo no servidor, até agora, provou ser impossível.
Com esta configuração
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>
e este exemplo 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()
Navegar para a minha página de teste gera um erro 500 e, nos meus logs de erro do Apache, recebo:
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
A minha saída está ótima, exceto no log de erros do Apache, não na janela do meu navegador.
Quando eu removo minha diretiva SetHandler
, a saída vai para a direita onde eu quero; obviamente, ele está sendo executado no modo CGI comum. Isso não é de alto desempenho o suficiente para o meu aplicativo Django, que recebe 1-2 tempos de carregamento de segunda página nessa configuração.
Até agora, tentei:
Nada parece fazer qualquer diferença, exceto que usar o AliasMatch me mostra a origem, que é como eu esperava.
Mais uma vez, isso foi absolutamente trivial no Mac OS X. Ele simplesmente funciona com uma configuração comparável.
Além de obter um Python melhor e usar o mod_wsgi (o que é possível, se for um problema), como faço para que ele funcione?