Establecer la variable de entorno Apache2 PATH

13

¿Cómo se puede establecer la PATHvariable de entorno para Apache2? Intenté configurarlo en /usr/sbin/envvarsy en httpd.conf con SetEnv PATH(y pasarlo a SSI con PassEnv), pero simplemente no se deja llevar.

Matteo
fuente
1
Necesitas más información. Esto depende del sistema operativo en cuestión. Windows hace las cosas de manera diferente a Un * xes. FreeBSD, RedHat y Ubuntu manejan esto en diferentes archivos.
Stefan Lasiewski
Usted dice que algunos enfoques "no funcionan para PATH". Necesita mostrarnos cómo lo está probando.

Respuestas:

15

Como otros han dicho, esto se hace mediante el uso de un archivo de variable de entorno. Proporcionaré más detalles en esta respuesta y mostraré pruebas de que funciona.

Este archivo de variable de entorno debe ser fuente apachectl. En mi cuadro de Ubuntu, este archivo está en /etc/apache2/envvars. En RedHat, esto es a las /etc/sysconfig/httpd. En FreeBSD, esto se establece en /etc/rc.conf(creo). Como alternativa, también puede configurar esta información en un script de inicio ( /etc/init.d/httpdo apachectl, etc.). Sin embargo, creo que es mejor dejar solo los scripts de inicio si es posible. El mejor lugar es en el script de variables de entorno designado.

  1. Verifique la ubicación de este archivo envvars. En Ubuntu, /etc/init.d/apache2ctlmuestra que las fuentes /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 ver las variables, estoy usando un script de Perl printenv.cgi , y lo hice disponible en http://example.org/cgi-bin/printenv.cgi . El script me muestra el siguiente CAMINO:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Para cambiar estas variables, edito el archivo envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Modifique su RUTA en este archivo. En este ejemplo, adjuntaré /opt/local/bina mi RUTA. En algunos casos, es posible que deba usar export PATHy no solo PATH:

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

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Vea los resultados en http://example.org/cgi-bin/printenv.cgi , que ahora muestran que la RUTA ahora contiene un nuevo elemento:

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

Si lo anterior no funciona, puede estar sucediendo algo inusual. Quizás su guión esté ignorando o sobrescribiendo la RUTA.

Stefan Lasiewski
fuente
Asegúrese de reiniciar httpd: intenté usarlo gracefuly eso no causó que los cambios tuvieran efecto.
Boicot SE para Monica Cellio
En fedora 23: «Este archivo ya no se usa para configurar variables de entorno adicionales para el proceso httpd. Ha sido reemplazado por systemd. » Paste.debian.net/361218
Nemo
1

En mi sistema lo es /etc/apache2/envvars.

Pausado hasta nuevo aviso.
fuente
Funciona pero no paraPATH
Matteo
@Matteo: Esto funcionará. Vea mi ejemplo detallado a continuación para la prueba.
Stefan Lasiewski
1

Asegúrate de haber cargado mod_env.

La sintaxis correcta es (ejemplo):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Esto funcionó para mí.

weeheavy
fuente
Funciona pero no paraPATH
Matteo
¿Cómo se carga mod_env? ¿No se carga de forma predeterminada ya que está integrado y está compilado estáticamente?
Chase T.
1

Puede configurarlo en start()función del guión de inicio, algo como esto:

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
}

Cree una secuencia de comandos Perl para enumerar todas las variables de entorno:

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

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

Colóquelo /var/www/cgi-biny verifique http://domain.com/cgi-bin/env.cgique verá lo siguiente:

PATH = /sbin:/usr/sbin:/bin:/usr/bin:/var/ossec/bin
quanta
fuente
1

En RedHat con Apache 2.4.x compilado desde la fuente con --prefix=/usr --enable-layout=RedHatel archivo envvars se encuentra en /usr/sbin/envvars. Puedo confirmar que establecer la RUTA adecuada en ese archivo hace que Apache y PHP lo sepan.

Usé el mismo enfoque que Stefan Lasiewski para determinar eso. Para Apache 2.4.12 , el /usr/sbin/envvarsarchivo se origina en la línea 49 de /usr/sbin/apachectl.

dcarrith
fuente
En fedora 23, /usr/sbin/apachectlmenciona en su /etc/sysconfig/httpdlugar, que contiene: «Este archivo ya no se utiliza para configurar variables de entorno adicionales para el proceso httpd. Ha sido reemplazado por systemd. » Paste.debian.net/361218
Nemo
1

Edite el archivo plist Apache2 con el editor que desee (ejemplo usando vim):

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

Agregue lo siguiente al archivo plist:

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

Si la EnvironmentVariablesclave ya existe, simplemente agregue

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

al <dict>

NB: para Mac OSX 10.11 (EL Capitan) o superior, debe ejecutar el comando csrutil disableen la Terminal después de reiniciar y presionar CMD + R y luego podrá editar este archivo.

Reiniciar Apache2

$ sudo /usr/sbin/apachectl stop
$ sudo /usr/sbin/apachectl start
frazras
fuente
0

En mi sistema Apache2 descubrí que muchos visitantes solo querían saquear mi colección cuidadosamente compilada de emoticones / emoticones (¡en serio!), Así que decidí usar un enlace simbólico generado aleatoriamente a la ruta del directorio que se recogería como un Apache2 variable, y era prácticamente imposible compartir enlaces.

Entonces, cada 30 minutos, cron ejecutó un script perl que reescribiría el archivo .htaccess e incluiría un SetEnv como puede ver a continuación:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Luego, en la parte superior de mis páginas PHP, leía la variable así, y más tarde en la página, esa variable se usaría para construir una ruta hacia el smiley apropiado:

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

¡Funciona para mí, y espero que te ayude!

peterg22
fuente
Funciona pero no paraPATH
Matteo