Mengatur variabel lingkungan Apache2 PATH


13

Bagaimana Anda bisa mengatur PATHvariabel lingkungan untuk Apache2? Saya sudah mencoba mengaturnya di /usr/sbin/envvarsdan di httpd.conf dengan SetEnv PATH(dan meneruskannya ke SSI dengan PassEnv), tetapi itu tidak bisa dijalankan.


1
Butuh informasi lebih. Ini tergantung pada OS yang dimaksud. Windows melakukan sesuatu yang berbeda dari Un * xes. FreeBSD, RedHat dan Ubuntu semuanya menangani ini dalam file yang berbeda.
Stefan Lasiewski

Anda mengatakan beberapa pendekatan "tidak bekerja untuk PATH". Anda harus menunjukkan kepada kami bagaimana Anda mengujinya.

Jawaban:


15

Seperti yang orang lain katakan, Anda melakukan ini melalui penggunaan file variabel lingkungan. Saya akan memberikan rincian lebih lanjut dalam jawaban ini, dan menunjukkan bukti bahwa itu berhasil.

File variabel lingkungan ini harus berasal dari apachectl. Di kotak Ubuntu saya, file ini di /etc/apache2/envvars. Di RedHat, ini di /etc/sysconfig/httpd. Pada FreeBSD, ini diatur dalam /etc/rc.conf(saya pikir). Sebagai alternatif, Anda juga dapat mengatur informasi ini dalam skrip startup ( /etc/init.d/httpdatau apachectl, dll.). Namun, saya pikir sebaiknya tinggalkan skrip startup sendiri jika memungkinkan. Tempat terbaik adalah dalam skrip variabel lingkungan yang ditunjuk.

  1. Verifikasi lokasi file envvars ini. Di Ubuntu, /etc/init.d/apache2ctlmenunjukkan bahwa itu sumber /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. Untuk melihat variabel, saya menggunakan skrip Perl printenv.cgi , dan membuatnya tersedia di http://example.org/cgi-bin/printenv.cgi . Script menunjukkan PATH berikut kepada saya:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Untuk mengubah variabel-variabel ini, saya mengedit file envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Ubah PATH Anda di file ini. Dalam contoh ini, saya akan menambahkan /opt/local/binPATH saya. Dalam beberapa kasus, Anda mungkin perlu menggunakan export PATHdan tidak hanya PATH:

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

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Lihat hasilnya di http://example.org/cgi-bin/printenv.cgi , yang sekarang menunjukkan bahwa PATH sekarang berisi elemen baru:

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

Jika hal di atas tidak berhasil, sesuatu yang tidak biasa mungkin terjadi. Mungkin skrip Anda mengabaikan atau menimpa PATH.


Pastikan Anda me-restart httpd - saya mencoba menggunakan graceful, dan itu tidak menyebabkan perubahan berlaku.
Boikot SE untuk Monica Cellio

Pada fedora 23: «File ini tidak lagi digunakan untuk mengonfigurasi variabel lingkungan tambahan untuk proses httpd. Itu telah digantikan oleh systemd. » Paste.debian.net/361218
Nemo



1

Pastikan Anda telah memuat mod_env.

Sintaks yang benar adalah (contoh):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Ini berhasil untuk saya.


Ini bekerja tetapi tidak untukPATH
Matteo

Bagaimana Anda memuat mod_env? Bukankah itu dimuat secara default karena built-in dan dikompilasi secara statis?
Chase T.

1

Anda dapat mengaturnya dalam start()fungsi skrip init, seperti ini:

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
}

Buat skrip Perl untuk mencantumkan semua variabel lingkungan:

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

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

Tempatkan ke dalam /var/www/cgi-bin, dan periksa http://domain.com/cgi-bin/env.cgi, Anda akan melihat di bawah ini:

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

1

Di RedHat dengan Apache 2.4.x dikompilasi dari sumber dengan --prefix=/usr --enable-layout=RedHatfile envvars terletak di /usr/sbin/envvars. Saya dapat mengonfirmasi bahwa pengaturan PATH yang sesuai dalam file itu membuatnya begitu Apache dan PHP menyadarinya.

Saya menggunakan pendekatan yang sama dengan Stefan Lasiewski untuk menentukan itu. Untuk Apache 2.4.12 , /usr/sbin/envvarsfile tersebut bersumber pada baris 49 dari /usr/sbin/apachectl.


Dalam fedora 23, /usr/sbin/apachectlsebutkan /etc/sysconfig/httpdsebaliknya, yang berisi: «File ini tidak lagi digunakan untuk mengonfigurasi variabel lingkungan tambahan untuk proses httpd. Itu telah digantikan oleh systemd. » Paste.debian.net/361218
Nemo

1

Edit file plist Apache2 dengan editor apa pun yang Anda suka (contoh menggunakan vim):

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

Tambahkan berikut ini ke file plist:

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

Jika EnvironmentVariableskunci sudah ada, cukup tambahkan

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

ke <dict>

NB: Untuk Mac OSX 10.11 (EL Capitan) atau lebih tinggi, Anda harus menjalankan perintah csrutil disabledi Terminal setelah mem-boot ulang dan menekan CMD + R dan kemudian Anda akan dapat mengedit file ini.

Mulai ulang Apache2

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

0

Pada sistem Apache2 saya, saya menemukan bahwa banyak pengunjung hanya ingin menjarah koleksi Smiley / emotikon yang saya buat dengan hati-hati (serius!), Jadi saya memutuskan untuk menggunakan symlink yang dibuat secara acak ke jalur direktori yang akan diambil sebagai Variabel Apache2, dan praktis tidak mungkin untuk membagikan tautan.

Jadi, setiap 30 menit, cron menjalankan skrip perl yang akan menulis ulang file .htaccess dan memasukkan SetEnv seperti yang Anda lihat di bawah:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Kemudian, di bagian atas halaman PHP saya, saya akan membaca variabel seperti itu, dan kemudian di halaman akan ada variabel yang digunakan untuk membangun path ke aplikasi yang sesuai smiley:

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

Bekerja untuk saya, dan saya harap ini membantu Anda!


Ini bekerja tetapi tidak untukPATH
Matteo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.