PassEnv não encontra variáveis ENV

2

Eu tenho esse /etc/profile.d/myfile.sh :

export MYVAR=myval

Eu também tenho uma linha PassEnv MYVAR em uma seção <virtualhost> de um apache conf dir.

Isso me permite fazer coisas como:

$ echo $MYVAR
myval
$ python
>>> import os; os.getenv('MYVAR')
'myval'
$ sudo echo $MYVAR
myval
$ sudo -i
root# echo $MYVAR
myval

Mas então, apesar de ser esse o caso, obtenho:

root# /sbin/service httpd restart
/sbin/service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd: [Mon Oct 22 14:44:02 2012] [warn] PassEnv variable MYVAR was undefined
                                                           [  OK  ]

E todas as minhas tentativas de acessar o MYVAR de dentro dos meus scripts wsgi simplesmente não funcionam.

Pensamentos? Estou fazendo algo obviamente errado?

EDITAR para mais detalhes

Eu tenho um enxame de computadores / VMs e um enxame de desenvolvedores trabalhando em um enxame de projetos. Eu preciso de um lugar central simples para manter as informações do ambiente, o mais comum é o "ambiente" (dev / stage / prod). O esquema que temos (modificando *.wsgi programaticamente) está se tornando mais frágil do que gostaríamos.

As principais opções que vejo são:

  • coloque as coisas no ambiente de shell
  • colocar coisas em outros arquivos de configuração

Colocar as coisas no ambiente shell é o melhor, porque não precisaremos escrever mais código duplicado "what is my environment".

    
por quodlibetor 22.10.2012 / 21:06

1 resposta

2

O Apache não vai ler o perfil de usuário global.

A grande questão é: o que você realmente quer fazer isso?

O que você está fazendo geralmente é a maneira errada de fazer as coisas com o Apache, mas porque não sabe o problema real que você está tentando resolver, então não pode dizer o que você deve fazer.

Ajuste sua pergunta e defina quais variáveis de ambiente você está tentando definir e por quê.

ATUALIZAÇÃO 1

Não especificamente o que você está fazendo, mas o SetEnv no mod_wsgi não define variáveis de ambiente do processo. Define as variáveis por solicitação no dicionário do ambiente WSGI.

PassEnv, que está relacionado ao SetEnv, faria a mesma coisa, mas em vez da chave / valor que está sendo definida no arquivo de configuração do Apache, ele viria das variáveis de ambiente de processo existentes que o Apache herdou.

Portanto, nenhuma das diretivas realmente tem o efeito de definir uma variável de ambiente de todo o processo para um aplicativo WSGI em execução sob o mod_wsgi. IOW, eles não seriam acessíveis via os.environ como você parece querer.

Agora, para PassEnv especificamente, se o que você está querendo fazer é que as variáveis de ambiente do processo Apache também estejam disponíveis para um aplicativo WSGI em mod_wsgi, então PassEnv é realmente redundante, pois as variáveis de ambiente do processo Apache já estarão disponíveis.

Isso ocorre porque, no modo incorporado, os aplicativos WSGI são executados dentro dos processos de trabalho filho do Apache. Mesmo no modo daemon, o processo daemon é uma bifurcação direta do processo pai do Apache (nenhum exec de qualquer aplicativo separado) e, portanto, também está efetivamente sendo executado dentro do Apache.

Portanto, o PassEnv não é obrigatório, pois já estaria definido.

Para fazer isso como você está querendo, você está simplesmente fazendo isso no lugar errado, pois os scripts de inicialização do Apache init.d não vão originar o perfil de login do usuário global.

Se você estiver usando uma distribuição Apache da Apache Software Foundation, ou uma que não tenha se desviado para longe, o local correto para definir variáveis de ambiente para o Apache está no arquivo 'envvars' no mesmo diretório que o Apache. executável. Em várias distribuições Linux, a configuração do Apache ignora totalmente esse arquivo e, em vez disso, é necessário configurá-lo em algum arquivo especial junto com os arquivos init.d Apache específicos do sistema. O que exatamente você tem que fazer lá dependerá da distribuição Linux.

Então, como eu disse, o Apache não lerá esse arquivo de perfil global.

Faça no lugar certo e tecnicamente poderia funcionar, mas confiar em definir variáveis de ambiente que afetam todo o Apache não seria o que eu recomendaria.

Seria melhor que um script WSGI lesse um arquivo de configuração separado, que define o status do sistema e, em seguida, baseia suas ações. Usar um arquivo de configuração especificamente para o propósito não é tão mágico quanto confiar em configurações de variáveis de ambiente vindas de um arquivo que não é especificamente parte do projeto, mas de scripts de inicialização do Apache.

    
por 23.10.2012 / 00:03