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.
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.
Câu trả lời:
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.
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
Để 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
Để thay đổi các biến này, tôi chỉnh sửa tệp envvars:
$ sudo vim /etc/apache2/envvars
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
Khởi động lại apache
$ sudo service apache2 restart
* Restarting web server apache2
... waiting ...done.
$
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.
gracefulvà điều đó không khiến các thay đổi có hiệu lực.
Trên 2.2, biến môi trường PATH không thể được đặt bằng Setenv.
Trên hệ thống của tôi, nó /etc/apache2/envvars.
PATH
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
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.
/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
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
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!
PATH