WSGI diz “permissões negadas” no meu servidor Ubuntu, nenhuma configuração WSGISocketPrefix funciona

2

Estou tentando executar o Apache2 com o mod_wsgi que suporta processos daemon no Ubuntu 10.04.3 LTS (lucid).

O problema é que não consigo descobrir uma configuração de trabalho para a diretiva WSGISocketPrefix. Minhas configurações são:

<VirtualHost *:80>
    ...

    WSGIDaemonProcess myapp threads=5
    WSGIScriptAlias / /var/www/myapp/myapp.wsgi
    <Directory /var/www/myapp>
        WSGIProcessGroup myapp
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

O Apache é executado como root. Estou usando o framework Flask Python, então segui este tutorial: link . Sem outras configurações, recebi um erro HTTP 503 Service Available Unavailable . No log de erro do Apache, recebi esta mensagem:

[Mon Oct 17 15:24:24 2011] [error] [client 90.181.85.69] (13)Permission denied: mod_wsgi (pid=21805): Unable to connect to WSGI daemon process 'kvinono' on '/var/run/apache2/wsgi.16282.4.1.sock' after multiple attempts.

Então achei isso: link , então tentei definir WSGISocketPrefix para qualquer valor que veio em minha mente e sempre tentou reiniciar / recarregar o Apache e olhou se funciona. Nunca funcionou, sempre erro de permissão, apenas em local diferente. Eu tentei definir usuário / grupo para o processo WSGI:

WSGIDaemonProcess myapp user=www-data group=www-data threads=5

... e ao mesmo tempo para definir as permissões certas em pastas como / var / run / wsgi e similares, mas isso não ajudou. Executar o processo do daemon WSGI como root / root não foi possível, o Apache não me permite fazer isso. Na verdade, o WSGI foi capaz de escrever e realmente escreveu o arquivo de soquete na pasta quando todas as permissões foram bem definidas, mas não resolveu o erro. Mesmo com o arquivo de soquete existente, ele processou completamente o mesmo erro permissão negada . Depois de várias outras tentativas e combinações, tentei definir WSGISocketPrefix até mesmo para / tmp. Novamente, o WSGI conseguiu criar o arquivo de soquete, mas ainda "travou" o erro acima.

Estou totalmente desesperado agora :-( Se você me sugerir que dance em volta de uma fogueira e cante alguns xingamentos de xamã, estou pronto para fazer isso somente se isso ajudar a resolver o problema.

    
por Honza Javorek 17.10.2011 / 13:35

3 respostas

1

Você está usando o ITK MPM for Apache. Você precisará estar usando o mod_wsgi 3.3 ou posterior, que contém correção:

When compiled against ITK MPM for Apache, if using daemon mode, the listener socket for daemon process will be marked as being owned by the same user that daemon process runs. This will at least allow a request handled under ITK MPM to be directed to daemon process owned by same user as script. See issue:

http://code.google.com/p/modwsgi/issues/detail?id=187

Você não pode, entretanto, usar apenas o binário fornecido pelo sistema operacional, pois os disponíveis provavelmente só serão para o trabalhador e prefork MPM. Para o ITK MPM você precisará compilar o mod_wsgi a partir do código-fonte e você DEVE ter os arquivos de cabeçalhos apropriados para o ITK MPM instalado e não aqueles para o MPM do trabalhador ou do prefork. Isso ocorre porque o código-fonte do mod_wsgi possui:

    if (!geteuid()) {
#if defined(MPM_ITK)
        if (chown(process->socket, process->uid, -1) < 0) {
#else
        if (chown(process->socket, ap_unixd_config.user_id, -1) < 0) {
#endif
            ap_log_error(APLOG_MARK, APLOG_ALERT, errno, wsgi_server,
                         "mod_wsgi (pid=%d): Couldn't change owner of unix "
                         "domain socket '%s'.", getpid(),
                         process->socket);
            return -1;
        }
    }

IOW, é uma escolha de tempo de compilação de como configurar permissões com ele sendo definido apenas para o ITK MPM corretamente se os cabeçalhos do ITK MPM estiverem instalados corretamente e, portanto, o MPM_ITK #define for encontrado.

Em resumo, você precisará fazer o seguinte:

(1) Assegure-se de que os arquivos de cabeçalho do ITK MPM estejam instalados. Se estiver usando o pacote binário para o Apache, veja se há uma variante do ITK do pacote Apache dev.

(2) Compile e instale mod_wsgi a partir do código-fonte disponível no pacote fonte mod_wsgi 3.3 publicamente disponível para download

O pacote do código-fonte mod_wsgi e as instruções de instalação estão disponíveis em:

link

    
por 18.10.2011 / 02:56
1

A resposta de Graham Dumpleton pode funcionar, eu não tentei. Estou usando o mod_wsgi 3.2 e tenho o mesmo problema.

O problema parece ser o WSGISocketPrefix começa em / etc / httpd (ou / etc / apache2) e usa uma concatenação simples. Então, quando você adiciona à sua configuração

WSGISocketPrefix /var/run/wsgi

ele acaba tentando colocar o arquivo em / etc / httpd // var / run / wsgi. Por algum motivo, não registra esse erro.

A solução alternativa? Eu tenho que trabalhar assim :

WSGISocketPrefix ../../var/run/wsgi

Eu descobri isso usando "var / run / wsgi" (sem lead /) como meu prefixo e vi nos logs:

[Thu Feb 14 14:50:28 2013] [alert] (2)No such file or directory: mod_wsgi (pid=18702): Couldn't bind unix domain socket '/etc/httpd/var/run/wsgi.18702.0.1.sock'.

Bem, esperamos que isso seja corrigido na versão mais recente, mas pelo menos podemos nos ater ao nosso pacote distribuído pelo SO.

    
por 14.02.2013 / 20:58
-1

Tente isto:

<VirtualHost *:80>
    ...

    WSGIDaemonProcess myapp threads=5
    WSGIScriptAlias / /var/www/myapp/myapp.wsgi/
    <Directory /var/www/myapp/>
        WSGIProcessGroup myapp
        WSGIApplicationGroup %{GLOBAL}
        WSGIScriptReloading On
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Então você tenta adicionar o caractere '/' no caminho e diretórios do wsgi final.

    
por 17.10.2011 / 14:37