Đặt biến môi trường Apache2 PATH


13

Làm thế nào bạn có thể đặt PATHbiến môi trường cho Apache2? Tôi đã thử cài đặt nó trong /usr/sbin/envvarsvà trong httpd.conf với SetEnv PATH(và chuyển nó cho SSI bằng PassEnv), nhưng nó không được mang theo.


1
Cần thêm thông tin. Điều này phụ thuộc vào hệ điều hành trong câu hỏi. Windows thực hiện mọi thứ khác với Un * xes. FreeBSD, RedHat và Ubuntu đều xử lý việc này trong các tệp khác nhau.
Stefan Lasiewski

Bạn nói một số cách tiếp cận "không làm việc cho PATH". Bạn cần cho chúng tôi thấy bạn đang thử nghiệm nó như thế nào.

Câu trả lời:


15

Như những người khác đã nói, bạn làm điều này thông qua việc sử dụng tệp biến môi trường. Tôi sẽ cung cấp thêm chi tiết trong câu trả lời này, và đưa ra bằng chứng rằng nó hoạt động.

Tệp biến môi trường này phải là nguồn từ apachectl. Trên hộp Ubuntu của tôi, tập tin này là tại /etc/apache2/envvars. Trên RedHat, đây là lúc /etc/sysconfig/httpd. Trên FreeBSD, điều này được đặt trong /etc/rc.conf(tôi nghĩ). Thay vào đó, bạn cũng có thể đặt thông tin này trong tập lệnh khởi động ( /etc/init.d/httpdhoặc apachectl, v.v.). Tuy nhiên, tôi nghĩ tốt nhất là để các kịch bản khởi động một mình nếu có thể. Nơi tốt nhất là trong tập lệnh biến môi trường được chỉ định.

  1. Xác nhận vị trí của tệp envvars này. Trên Ubuntu, /etc/init.d/apache2ctlcho thấy nó có nguồn /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. Để xem các biến, tôi đang sử dụng tập lệnh Perl printenv.cgi và làm cho nó có sẵn tại http://example.org/cgi-bin/printenv.cgi . Kịch bản cho tôi thấy PATH sau:

    PATH = /usr/local/bin:/usr/bin:/bin
    
  3. Để thay đổi các biến này, tôi chỉnh sửa tệp envvars:

    $ sudo vim /etc/apache2/envvars 
    
  4. Sửa đổi PATH của bạn trong tập tin này. Trong ví dụ này, tôi sẽ nối /opt/local/binvào PATH của tôi. Trong một số trường hợp, bạn có thể cần sử dụng export PATHvà không chỉ PATH:

    export PATH=$PATH:/opt/local/bin
    
  5. Khởi động lại apache

    $ sudo service apache2 restart
     * Restarting web server apache2
     ... waiting    ...done.
    $
    
  6. Xem kết quả trên http://example.org/cgi-bin/printenv.cgi , giờ đây cho thấy PATH hiện chứa một phần tử mới:

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

Nếu những điều trên không hoạt động, một cái gì đó bất thường có thể xảy ra. Có lẽ kịch bản của bạn đang bỏ qua hoặc ghi đè lên PATH.


Đảm bảo bạn khởi động lại httpd - Tôi đã thử sử dụng gracefulvà điều đó không khiến các thay đổi có hiệu lực.
Tẩy chay SE cho Monica Cellio

Trên fedora 23: «Tệp này không còn được sử dụng để định cấu hình các biến môi trường bổ sung cho quy trình httpd. Nó đã được thay thế bởi systemd. » Paste.debian.net/361218
Nemo



1

Hãy chắc chắn rằng bạn đã tải mod_env.

Cú pháp đúng là (ví dụ):

SetEnv LD_LIBRARY_PATH /usr/local/lib

Điều này làm việc cho tôi.


Nó hoạt động nhưng không dành choPATH
Matteo

Làm thế nào để bạn tải mod_env? Nó không được tải theo mặc định vì nó được tích hợp và biên dịch tĩnh?
Đuổi theo

1

Bạn có thể đặt nó trong start()chức năng của init script, đại loại như thế này:

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
}

Tạo tập lệnh Perl để liệt kê tất cả các biến môi trường:

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

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

Đặt nó vào /var/www/cgi-binvà kiểm tra http://domain.com/cgi-bin/env.cgi, bạn sẽ thấy các tín hiệu:

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

1

Trên RedHat với Apache 2.4.x được biên dịch từ nguồn với --prefix=/usr --enable-layout=RedHattệp envvars được đặt tại /usr/sbin/envvars. Tôi có thể xác nhận rằng việc thiết lập PATH thích hợp trong tệp đó làm cho nó để Apache và PHP nhận thức được nó.

Tôi đã sử dụng cách tiếp cận tương tự như Stefan Lasiewski để xác định điều đó. Đối với Apache 2.4.12 , /usr/sbin/envvarstệp có nguồn gốc trên dòng 49 của /usr/sbin/apachectl.


Trong fedora 23, /usr/sbin/apachectlđề cập /etc/sysconfig/httpdthay vào đó, có chứa: «Tệp này không còn được sử dụng để định cấu hình các biến môi trường bổ sung cho quy trình httpd. Nó đã được thay thế bởi systemd. » Paste.debian.net/361218
Nemo

1

Chỉnh sửa tệp plist Apache2 với bất kỳ trình soạn thảo nào bạn thích (ví dụ sử dụng vim):

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

Thêm phần sau vào tệp plist:

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

Nếu EnvironmentVariableskhóa đã tồn tại, chỉ cần thêm

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

để <dict>

Lưu ý: Đối với Mac OSX 10.11 (EL Capitan) trở lên, bạn cần chạy lệnh csrutil disabletrong Terminal sau khi khởi động lại và nhấn CMD + R và sau đó bạn sẽ có thể chỉnh sửa tệp này.

Khởi động lại Apache2

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

0

Trên hệ thống Apache2 của tôi, tôi thấy rằng rất nhiều khách truy cập chỉ muốn cướp bộ sưu tập Smileys / biểu tượng cảm xúc được biên soạn cẩn thận của tôi (nghiêm túc!), Vì vậy tôi đã quyết định sử dụng một liên kết tượng trưng được tạo ngẫu nhiên vào đường dẫn thư mục sẽ được chọn làm đường dẫn Biến Apache2 và thực tế không thể chia sẻ liên kết.

Vì vậy, cứ sau 30 phút, cron lại chạy một tập lệnh perl sẽ viết lại tệp .htaccess và bao gồm SetEnv như bạn có thể thấy bên dưới:

....
SetEnv SMILEYDIR "QyQGTZ8cgcK3zMVL0aNJ"

Sau đó, ở đầu các trang PHP của tôi, tôi đã đọc biến như vậy và sau đó trong trang sẽ có biến đó được sử dụng để xây dựng đường dẫn đến biểu tượng mặt cười phù hợp:

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

Làm việc cho tôi, và hy vọng nó sẽ giúp bạn!


Nó hoạt động nhưng không dành choPATH
Matteo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.