Définition de la variable d'environnement Apache2 PATH

13

Comment pouvez-vous définir la PATHvariable d'environnement pour Apache2? J'ai essayé de le configurer dans /usr/sbin/envvarset dans httpd.conf avec SetEnv PATH(et de le transmettre à SSI avec PassEnv), mais cela ne se fait tout simplement pas.

Matteo
la source
1
Besoin de plus d'informations. Cela dépend du système d'exploitation en question. Windows fait les choses différemment de Un * xes. FreeBSD, RedHat et Ubuntu gèrent tous cela dans des fichiers différents.
Stefan Lasiewski
Vous dites que certaines approches "ne fonctionnent pas pour PATH". Vous devez nous montrer comment vous le testez.

Réponses:

15

Comme d'autres l'ont dit, vous le faites en utilisant le fichier de variables d'environnement. Je fournirai plus de détails dans cette réponse et prouverai que cela fonctionne.

Ce fichier de variable d'environnement doit provenir de apachectl. Sur ma boîte Ubuntu, ce fichier est à /etc/apache2/envvars. Sur RedHat, c'est à /etc/sysconfig/httpd. Sur FreeBSD, cela se fait /etc/rc.conf(je pense). Comme alternative, vous pouvez également définir ces informations dans un script de démarrage ( /etc/init.d/httpdou apachectl, etc.). Cependant, je pense qu'il est préférable de laisser les scripts de démarrage seuls si possible. Le meilleur endroit est dans le script de variables d'environnement désigné.

  1. Vérifiez l'emplacement de ce fichier envvars. Sur Ubuntu, /etc/init.d/apache2ctlmontre qu'il source /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. Pour afficher les variables, j'utilise un script Perl printenv.cgi et je l'ai rendu disponible sur http://example.org/cgi-bin/printenv.cgi . Le script me montre le CHEMIN suivant:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Pour modifier ces variables, je modifie le fichier envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Modifiez votre CHEMIN dans ce fichier. Dans cet exemple, je vais ajouter /opt/local/binà mon CHEMIN. Dans certains cas, vous devrez peut-être utiliser export PATHet pas seulement PATH:

    export PATH=$PATH:/opt/local/bin
    
  5. Redémarrez apache

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Consultez les résultats sur http://example.org/cgi-bin/printenv.cgi , qui montrent désormais que le PATH contient désormais un nouvel élément:

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

Si ce qui précède ne fonctionne pas, quelque chose d'inhabituel peut se produire. Peut-être que votre script ignore ou remplace le CHEMIN.

Stefan Lasiewski
la source
Assurez-vous de redémarrer httpd - j'ai essayé d'utiliser graceful, et cela n'a pas provoqué les modifications.
Boycott SE pour Monica Cellio
Sur fedora 23: «Ce fichier n'est plus utilisé pour configurer des variables d'environnement supplémentaires pour le processus httpd. Il a été remplacé par systemd. » paste.debian.net/361218
Nemo
1

Sur mon système, c'est /etc/apache2/envvars.

En pause jusqu'à nouvel ordre.
la source
Ça marche mais pas pourPATH
Matteo
@Matteo: Cela fonctionnera. Voir mon exemple détaillé ci-dessous pour la preuve.
Stefan Lasiewski
1

Assurez-vous d'avoir chargé mod_env.

La syntaxe correcte est (exemple):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Cela a fonctionné pour moi.

weeheavy
la source
Ça marche mais pas pourPATH
Matteo
Comment chargez-vous mod_env? N'est-il pas chargé par défaut car il est intégré et compilé statiquement?
Chase T.
1

Vous pouvez le définir en start()fonction du script init, quelque chose comme ceci:

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
}

Créez un script Perl pour répertorier toutes les variables d'environnement:

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

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

Placez-le dans /var/www/cgi-binet vérifiez http://domain.com/cgi-bin/env.cgi, vous verrez les belows:

PATH = /sbin:/usr/sbin:/bin:/usr/bin:/var/ossec/bin
quanta
la source
1

Sur RedHat avec Apache 2.4.x compilé à partir de la source avec --prefix=/usr --enable-layout=RedHatle fichier envvars se trouve à /usr/sbin/envvars. Je peux confirmer que la définition du PATH approprié dans ce fichier permet à Apache et PHP de le savoir.

J'ai utilisé la même approche que Stefan Lasiewski pour le déterminer. Pour Apache 2.4.12 , le /usr/sbin/envvarsfichier provient de la ligne 49 de /usr/sbin/apachectl.

dcarrith
la source
Dans fedora 23, /usr/sbin/apachectlmentionne à la /etc/sysconfig/httpdplace, qui contient: «Ce fichier n'est plus utilisé pour configurer des variables d'environnement supplémentaires pour le processus httpd. Il a été remplacé par systemd. » paste.debian.net/361218
Nemo
1

Modifiez le fichier plist Apache2 avec l'éditeur que vous voulez (exemple en utilisant vim):

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

Ajoutez ce qui suit au fichier plist:

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

Si la EnvironmentVariablesclé existe déjà, ajoutez simplement

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

à la <dict>

NB: Pour Mac OSX 10.11 (EL Capitan) ou supérieur, vous devez exécuter la commande csrutil disabledans Terminal après avoir redémarré et appuyé sur CMD + R, puis vous pourrez modifier ce fichier.

Redémarrez Apache2

$ sudo /usr/sbin/apachectl stop
$ sudo /usr/sbin/apachectl start
frazras
la source
0

Sur mon système Apache2, j'ai constaté que beaucoup de visiteurs voulaient seulement piller ma collection soigneusement compilée de Smileys / émoticônes (sérieusement!), J'ai donc décidé d'utiliser un lien symbolique généré aléatoirement vers le chemin du répertoire qui serait ramassé comme un Variable Apache2, et il était pratiquement impossible de partager des liens.

Ainsi, toutes les 30 minutes, cron a exécuté un script perl qui réécrirait le fichier .htaccess et inclurait un SetEnv comme vous pouvez le voir ci-dessous:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Ensuite, en haut de mes pages PHP, j'avais lu la variable comme ça, et plus tard dans la page, il y aurait cette variable utilisée pour construire un chemin vers le smiley approprié:

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

Fonctionne pour moi et j'espère que cela vous aide!

peterg22
la source
Ça marche mais pas pourPATH
Matteo