Impostazione della variabile d'ambiente PATH di Apache2


13

Come puoi impostare la PATHvariabile d'ambiente per Apache2? Ho provato a impostarlo in /usr/sbin/envvarse in httpd.conf con SetEnv PATH(e passandolo a SSI con PassEnv), ma non viene portato avanti.


1
Hai bisogno di maggiori informazioni. Questo dipende dal sistema operativo in questione. Windows fa le cose diversamente da Un * xes. FreeBSD, RedHat e Ubuntu gestiscono tutti questo in diversi file.
Stefan Lasiewski,

Dici che alcuni approcci "non funzionano per PATH". Devi mostrarci come lo stai testando.

Risposte:


15

Come altri hanno già detto, lo fai attraverso l'uso di un file di variabili di ambiente. Fornirò maggiori dettagli in questa risposta e mostrerò la prova che funziona.

Questo file di variabili di ambiente deve essere di origine apachectl. Sulla mia casella Ubuntu, questo file è su /etc/apache2/envvars. Su RedHat, questo è a /etc/sysconfig/httpd. Su FreeBSD, questo è impostato in /etc/rc.conf(penso). In alternativa, puoi anche impostare queste informazioni in uno script di avvio ( /etc/init.d/httpdo apachectl, ecc.). Tuttavia, penso che sia meglio lasciare soli gli script di avvio, se possibile. Il posto migliore si trova nello script delle variabili di ambiente designato.

  1. Verifica la posizione di questo file envvars. Su Ubuntu, /etc/init.d/apache2ctlmostra che ha origine /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. Per visualizzare le variabili, sto usando uno script Perl printenv.cgi e l'ho reso disponibile su http://example.org/cgi-bin/printenv.cgi . Lo script mi ​​mostra il seguente PERCORSO:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Per modificare queste variabili, modifico il file envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Modifica il tuo PERCORSO in questo file. In questo esempio, aggiungerò /opt/local/binal mio PERCORSO. In alcuni casi, potrebbe essere necessario utilizzare export PATHe non solo PATH:

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

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Visualizza i risultati su http://example.org/cgi-bin/printenv.cgi , che ora mostrano che il PERCORSO ora contiene un nuovo elemento:

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

Se quanto sopra non funziona, potrebbe accadere qualcosa di insolito. Forse la tua sceneggiatura sta ignorando o sovrascrivendo il PERCORSO.


Assicurati di riavviare httpd: ho provato a utilizzare gracefule ciò non ha reso effettive le modifiche.
Boicottaggio SE per Monica Cellio

Su fedora 23: «Questo file non viene più utilizzato per configurare variabili di ambiente aggiuntive per il processo httpd. È stato sostituito da systemd. » paste.debian.net/361218
Nemo



1

Assicurati di aver caricato mod_env.

La sintassi corretta è (esempio):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Questo ha funzionato per me.


Funziona ma non perPATH
Matteo

Come si carica mod_env? Non viene caricato per impostazione predefinita in quanto integrato e compilato staticamente?
Chase T.

1

Puoi impostarlo in start()funzione di init script, qualcosa del genere:

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
}

Crea uno script Perl per elencare tutte le variabili di ambiente:

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

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

Inseriscilo /var/www/cgi-bine controlla http://domain.com/cgi-bin/env.cgi, vedrai i belows:

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

1

Su RedHat con Apache 2.4.x compilato dal sorgente con --prefix=/usr --enable-layout=RedHatil file envvars si trova in /usr/sbin/envvars. Posso confermare che l'impostazione del PATH appropriato in quel file lo rende Apache e PHP consapevoli di ciò.

Ho usato lo stesso approccio di Stefan Lasiewski per determinarlo. Per Apache 2.4.12 , il /usr/sbin/envvarsfile proviene dalla riga 49 di /usr/sbin/apachectl.


In fedora 23, invece , /usr/sbin/apachectlmenziona /etc/sysconfig/httpd, che contiene: «Questo file non viene più utilizzato per configurare variabili di ambiente aggiuntive per il processo httpd. È stato sostituito da systemd. » paste.debian.net/361218
Nemo

1

Modifica il file plist di Apache2 con qualunque editor ti piaccia (esempio usando vim):

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

Aggiungere quanto segue al file plist:

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

Se la EnvironmentVariableschiave esiste già, basta aggiungere

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

al <dict>

NB: per Mac OSX 10.11 (EL Capitan) o versioni successive, è necessario eseguire il comando csrutil disablein Terminale dopo aver riavviato e colpito CMD + R, quindi sarà possibile modificare questo file.

Riavvia Apache2

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

0

Sul mio sistema Apache2 ho scoperto che molti visitatori volevano solo saccheggiare la mia raccolta di emoticon / emoticon accuratamente compilata (sul serio!), Quindi ho deciso di utilizzare un link simbolico generato casualmente al percorso della directory che sarebbe stato raccolto come Apache2 variabile, ed era praticamente impossibile condividere i collegamenti.

Quindi, ogni 30 minuti, cron eseguiva uno script perl che riscriveva il file .htaccess e includeva un SetEnv come puoi vedere di seguito:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Quindi, nella parte superiore delle mie pagine PHP avrei letto la variabile in questo modo, e più avanti nella pagina ci sarebbe stata quella variabile utilizzata per creare un percorso per l'apprendista smiley:

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

Funziona per me e spero che ti aiuti!


Funziona ma non perPATH
Matteo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.