Ustawienie zmiennej środowiskowej Apache2 PATH


13

Jak ustawić PATHzmienną środowiskową dla Apache2? Próbowałem ustawić go w /usr/sbin/envvarshttpd.conf za pomocą SetEnv PATH(i przekazać go do SSI za pomocą PassEnv), ale po prostu się nie da.


1
Potrzebujesz więcej informacji. To zależy od danego systemu operacyjnego. Windows działa inaczej niż Un * xes. FreeBSD, RedHat i Ubuntu obsługują to w różnych plikach.
Stefan Lasiewski

Mówisz, że niektóre podejścia „nie działają dla PATH”. Musisz nam pokazać, jak to testujesz.

Odpowiedzi:


15

Jak powiedzieli inni, robisz to za pomocą pliku zmiennej środowiskowej. Podam więcej szczegółów w tej odpowiedzi i pokażę dowód, że to działa.

Ten plik zmiennych środowiskowych musi pochodzić z apachectl. Na moim polu Ubuntu ten plik znajduje się pod adresem /etc/apache2/envvars. Na RedHat jest to /etc/sysconfig/httpd. W FreeBSD jest to ustawione /etc/rc.conf(myślę). Alternatywnie możesz ustawić te informacje w skrypcie startowym ( /etc/init.d/httpdlub apachectlitp.). Myślę jednak, że najlepiej pozostawić skrypty startowe w spokoju, jeśli to możliwe. Najlepsze miejsce znajduje się w wyznaczonym skrypcie zmiennych środowiskowych.

  1. Sprawdź lokalizację tego pliku envvars. Na Ubuntu /etc/init.d/apache2ctlpokazuje, że źródło /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. Aby wyświetlić zmienne, używam skryptu printenv.cgi Perla i udostępniłem go na stronie http://example.org/cgi-bin/printenv.cgi . Skrypt pokazuje mi następującą ŚCIEŻKĘ:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Aby zmienić te zmienne, edytuję plik envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Zmodyfikuj ŚCIEŻKĘ w tym pliku. W tym przykładzie dołączę /opt/local/bindo mojej ŚCIEŻKI. W niektórych przypadkach może być konieczne użycie, export PATHa nie tylko PATH:

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

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Zobacz wyniki na http://example.org/cgi-bin/printenv.cgi , które pokazują, że ŚCIEŻKA zawiera teraz nowy element:

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

Jeśli powyższe nie działa, może się dziać coś niezwykłego. Być może twój skrypt ignoruje lub zastępuje ŚCIEŻKĘ.


Upewnij się, że ponowne uruchomienie httpd - Próbowałem za pomocą graceful, i które nie powodują zmiany odniosły skutek.
Bojkot SE dla Moniki Cellio

Na fedorze 23: «Ten plik nie jest już używany do konfigurowania dodatkowych zmiennych środowiskowych dla procesu httpd. Został zastąpiony przez systemd. » paste.debian.net/361218
Nemo



1

Upewnij się, że załadowałeś mod_env.

Prawidłowa składnia to (przykład):

SetEnv LD_LIBRARY_PATH /usr/local/lib

To zadziałało dla mnie.


Działa, ale nie dlaPATH
Matteo,

Jak ładujesz mod_env? Czy nie jest ładowany domyślnie, ponieważ jest wbudowany i skompilowany statycznie?
Chase T.

1

Możesz ustawić to w start()funkcji skryptu inicjującego, coś takiego:

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
}

Utwórz skrypt Perla, aby wyświetlić wszystkie zmienne środowiskowe:

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

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

Umieść go /var/www/cgi-bini sprawdź http://domain.com/cgi-bin/env.cgi, a zobaczysz poniżej:

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

1

Na RedHat z Apache 2.4.x skompilowanym ze źródła z --prefix=/usr --enable-layout=RedHatplikiem envvars znajduje się na /usr/sbin/envvars. Mogę potwierdzić, że ustawienie odpowiedniej ŚCIEŻKI w tym pliku powoduje, że Apache i PHP są tego świadomi.

Zastosowałem to samo podejście, co Stefan Lasiewski, aby to ustalić. Dla Apache 2.4.12 The /usr/sbin/envvarsplik pochodzi on line 49 /usr/sbin/apachectl.


W Fedorze 23 zamiast tego /usr/sbin/apachectlwspomina /etc/sysconfig/httpd, który zawiera: «Ten plik nie jest już używany do konfigurowania dodatkowych zmiennych środowiskowych dla procesu httpd. Został zastąpiony przez systemd. » paste.debian.net/361218
Nemo

1

Edytuj plik Plist Apache2 za pomocą dowolnego edytora, który ci się podoba (na przykład za pomocą vima):

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

Dodaj następujące pliki do pliku plist:

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

Jeśli EnvironmentVariablesklucz już istnieje, po prostu dodaj

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

do <dict>

Uwaga: w przypadku systemu Mac OSX 10.11 (EL Capitan) lub nowszego należy uruchomić polecenie csrutil disablew terminalu po ponownym uruchomieniu i naciśnięciu CMD + R, a następnie będzie można edytować ten plik.

Uruchom ponownie Apache2

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

0

W moim systemie Apache2 odkryłem, że wielu odwiedzających chce jedynie splądrować moją starannie skompilowaną kolekcję emotikonów / emotikonów (poważnie!), Więc zdecydowałem się użyć losowo wygenerowanego dowiązania symbolicznego do ścieżki katalogu, która byłaby wybrana jako Zmienna Apache2 i dzielenie się linkami było praktycznie niemożliwe.

Co 30 minut cron uruchamiał skrypt Perla, który przepisałby plik .htaccess i zawierał SetEnv, jak widać poniżej:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Następnie na górze moich stron PHP czytałem zmienną w ten sposób, a później na stronie znajdowała się zmienna używana do budowania ścieżki do odpowiedniej buźki:

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

Działa dla mnie i mam nadzieję, że ci to pomoże!


Działa, ale nie dlaPATH
Matteo,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.