Definindo a variável de ambiente Apache2 PATH


13

Como você pode definir a PATHvariável de ambiente para o Apache2? Eu tentei configurá-lo dentro /usr/sbin/envvarse no httpd.conf com SetEnv PATH(e passá-lo para o SSI com o PassEnv), mas ele simplesmente não é levado adiante.


1
Precisa de mais informação. Isso depende do sistema operacional em questão. O Windows faz as coisas de maneira diferente do Un * xes. FreeBSD, RedHat e Ubuntu lidam com isso em arquivos diferentes.
Stefan Lasiewski

Você diz que algumas abordagens "não funcionam para o PATH". Você precisa nos mostrar como está testando.

Respostas:


15

Como já foi dito, você faz isso usando o arquivo de variável de ambiente an. Fornecerei mais detalhes nesta resposta e mostrarei a prova de que funciona.

Esse arquivo de variável de ambiente deve ser de origem apachectl. Na minha caixa do Ubuntu, este arquivo está em /etc/apache2/envvars. No RedHat, isso é em /etc/sysconfig/httpd. No FreeBSD, isso está definido /etc/rc.conf(eu acho). Como alternativa, você também pode definir essas informações em um script de inicialização ( /etc/init.d/httpdou apachectletc.). No entanto, acho melhor deixar os scripts de inicialização em paz, se possível. O melhor lugar é no script de variáveis ​​de ambiente designado.

  1. Verifique a localização desse arquivo envvars. No Ubuntu, /etc/init.d/apache2ctlmostra que ele fornece /etc/apache2/envvars:

    # the path to the environment variable file
    test -z "$APACHE_ENVVARS" && APACHE_ENVVARS='/etc/apache2/envvars'
    # pick up any necessary environment variables
    if test -f $APACHE_ENVVARS; then
       . $APACHE_ENVVARS
    fi
    
  2. Para visualizar as variáveis, estou usando um script Perl printenv.cgi e disponibilizado em http://example.org/cgi-bin/printenv.cgi . O script me mostra o seguinte PATH:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Para alterar essas variáveis, edito o arquivo envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Modifique seu PATH neste arquivo. Neste exemplo, anexarei /opt/local/binao meu PATH. Em alguns casos, pode ser necessário usar export PATHe não apenas PATH:

    export PATH=$PATH:/opt/local/bin
    
  5. Reinicie o apache

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Veja os resultados em http://example.org/cgi-bin/printenv.cgi , que agora mostram que o PATH agora contém um novo elemento:

    PATH = /usr/local/bin:/usr/bin:/bin:/opt/local/bin
    

Se o acima não funcionar, algo incomum pode estar acontecendo. Talvez seu script esteja ignorando ou substituindo o PATH.


Certifique-se de reiniciar o httpd - tentei usar gracefule isso não causou as alterações entrarem em vigor.
Boicote SE para Monica Cellio

No fedora 23: «Este arquivo não é mais usado para configurar variáveis ​​de ambiente adicionais para o processo httpd. Foi substituído por systemd. » Paste.debian.net/361218
Nemo



1

Verifique se você carregou o mod_env.

A sintaxe correta é (exemplo):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Isso funcionou para mim.


Funciona mas não paraPATH
Matteo

Como você carrega o mod_env? Ele não é carregado por padrão, pois é incorporado e compilado estaticamente?
Perseguição T.

1

Você pode configurá-lo em start()função do script init, algo como isto:

start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        export PATH=${PATH}:/var/ossec/bin
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

Crie um script Perl para listar todas as variáveis ​​de ambiente:

#!/usr/bin/perl -wT
print "Content-type: text/html\n\n";

foreach $key (sort keys(%ENV)) {
  print "$key = $ENV{$key}<p>";
}

Coloque /var/www/cgi-bine verifique http://domain.com/cgi-bin/env.cgi, você verá os seguintes:

PATH = /sbin:/usr/sbin:/bin:/usr/bin:/var/ossec/bin

1

No RedHat com Apache 2.4.x compilado da fonte com --prefix=/usr --enable-layout=RedHato arquivo envvars está localizado em /usr/sbin/envvars. Posso confirmar que a configuração do PATH apropriado nesse arquivo faz com que o Apache e o PHP estejam cientes disso.

Eu usei a mesma abordagem que Stefan Lasiewski para determinar isso. Para o Apache 2.4.12 , o /usr/sbin/envvarsarquivo é originado na linha 49 de /usr/sbin/apachectl.


No fedora 23, ele /usr/sbin/apachectlmenciona /etc/sysconfig/httpd, que contém: «Este arquivo não é mais usado para configurar variáveis ​​de ambiente adicionais para o processo httpd. Foi substituído por systemd. » Paste.debian.net/361218
Nemo

1

Edite o arquivo apache2 plist com o editor que desejar (por exemplo, usando o vim):

$ sudo vim /System/Library/LaunchDaemons/org.apache.httpd.plist

Adicione o seguinte ao arquivo plist:

<key>EnvironmentVariables</key>
<dict>
  <key>PATH</key>
  <string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>
</dict>

Se a EnvironmentVariableschave já existir, basta adicionar

<key>PATH</key>
<string>/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin</string>

ao <dict>

Nota: Para o Mac OSX 10.11 (EL Capitan) ou superior, é necessário executar o comando csrutil disableno Terminal após reiniciar e pressionar o CMD + R e, em seguida, você poderá editar este arquivo.

Reinicie o Apache2

$ sudo /usr/sbin/apachectl stop
$ sudo /usr/sbin/apachectl start

0

No meu sistema Apache2, achei que muitos visitantes só queriam amontoar minha coleção cuidadosamente compilada de Smileys / emoticons (sério!), Então decidi usar um link simbólico gerado aleatoriamente no caminho do diretório que seria escolhido como um Variável Apache2, e era praticamente impossível compartilhar links.

Portanto, a cada 30 minutos, o cron executava um script perl que reescreveria o arquivo .htaccess e incluiria um SetEnv como você pode ver abaixo:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Então, no topo das minhas páginas PHP, eu lia a variável assim, e mais tarde na página haveria essa variável usada para criar um caminho para o smiley apropriado:

$SMILEYDIR = apache_getenv("SMILEYDIR");
....
....
echo '<img src="/'.$SMILEYDIR.'//SMILEY_yay!.gif" border="0" hspace="3">';

Funciona para mim e espero que ajude!


Funciona mas não paraPATH
Matteo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.