Tại sao apache2 không tôn trọng tệp envvars của tôi?


17

Các tệp envvar của tôi có các dòng này trong đó:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache2.conf của tôi có những dòng này trong đó:

# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Nhưng khi tôi chạy apache2 -Mtôi nhận được điều này:

apache2: bad user name ${APACHE_RUN_USER}

Một sửa chữa tạm thời là mã cứng www-datavào tập tin apache2.conf của tôi. Có một số suy đoán ở đây rằng điều này là do một số tập lệnh cấu hình không thay thế chính xác các env trong tệp apache2.conf của tôi. Bất kể làm thế nào để tôi có được apache2 để tham khảo tệp envvars của tôi?

Vì một điểm dữ liệu khác , trang web này dường như chỉ ra các envvars được tạo khi xây dựng, nhưng được đọc bởi apache2ctl trong thời gian chạy, cho thấy rằng tệp này không chỉ là phân tích còn sót lại của quá trình xây dựng.

Câu trả lời:


30

Sau khi xem qua câu trả lời được đưa ra bởi @Lekensteyn, tôi đã thử sudo apache2ctl -Mvới apache2.conf của mình trở lại ban đầu. Điều này làm việc để tôi đi sâu vào các trang người đàn ông một chút. Đây là những gì man apache2đã nói:

In  general, apache2 should not be invoked directly, but rather should 
be invoked via /etc/init.d/apache2 or apache2ctl. The default Debian 
configuration requires environment variables that are defined in 
/etc/apache2/envvars  and  are  not  available  if  apache2  is  
started  directly. However, apache2ctl can be used to pass arbitrary 
arguments to apache2.

Vì vậy, câu trả lời cho câu hỏi này là: Bạn không sử dụng apache2đúng cách; sử dụng apache2ctlthay thế.

Cảm ơn @Lekensteyn đã chỉ cho tôi đi đúng hướng.


Cách thậm chí đúng hơn sẽ được sử dụng init script: sudo stop apache2, sudo restart apache2sudo start apache2( /etc/init.d/apache2 stop, vv)
Lekensteyn

Trong trường hợp của tôi, tôi đã thêm một umaskcài đặt cho envvars và ngay cả sau khi khởi động lại bằng cách sử dụng apache2ctl restartnó vẫn không hoạt động, nhưng khởi động lại bằng cách sử dụng service apache2 restartđã làm ( service apache2 gracefulkhông).
Matt Browne

khuyên bạn nên sử dụng dịch vụ thay vì apachectl, nhưng nếu bạn cần sử dụng các lệnh không được liên kết với lệnh dịch vụ, như apachectl -S ... câu trả lời này rất hay. upvote
Feida Kila

FYI: Thực hiện /etc/init.d apache2 reloadsẽ không nhận các envvarsbổ sung, bạn phải dừng và khởi động máy chủ
ThaDon

7

Từ http://httpd.apache.org/docs/2.2/configuring.html :

Các giá trị của biến môi trường shell có thể được sử dụng trong các dòng tệp cấu hình bằng cú pháp $ {ENVVAR}. Nếu "ENVVAR" là tên của biến môi trường hợp lệ, giá trị của biến đó được thay thế vào vị trí đó trong dòng tệp cấu hình và quá trình xử lý tiếp tục như thể văn bản đó được tìm thấy trực tiếp trong tệp cấu hình. (Nếu không tìm thấy biến ENVVAR, các ký tự "$ {ENVVAR}" không thay đổi để sử dụng cho các giai đoạn sau trong quá trình xử lý tệp cấu hình.)

Vì vậy, biến thực sự được lấy từ môi trường như mong đợi. Bây giờ điều này xảy ra ở đâu?

Trong /etc/init.d/apache2, APACHE_ENVVARSđược đặt thành đường dẫn của envvarstệp dựa trên đường dẫn initscript. Nó thường dẫn đến APACHE_ENVVARS=/etc/apache2/envvarsviệc được thiết lập. Bây giờ, vì giá trị này bằng với các giá trị mặc định như được đặt trong apache2ctl, nên nó không được xuất.

Từ /usr/sbin/apache2ctl:

# the path to the environment variable file
test -z "$APACHE_ENVVARS" && APACHE_ENVVARS="$APACHE_CONFDIR/envvars"
# pick up any necessary environment variables
if test -f $APACHE_ENVVARS; then
  . $APACHE_ENVVARS
fi

Giải thích: nếu APACHE_ENVVARStrống, sử dụng đường dẫn mặc định /etc/apache2/envvars. Nếu tệp này tồn tại, "nguồn" nó (thực hiện các lệnh từ tệp đó trong môi trường hiện tại).

Hãy chắc chắn rằng envvarstệp không chứa bất kỳ lỗi cú pháp. Để thực hiện kiểm tra như vậy, sử dụng:

sh -n /etc/apache2/envvars && echo Syntax OK || echo FAIL

Lỗi được in nếu có.


Tôi đã thực hiện kiểm tra và có thể xác minh rằng các envvars của tôi không chứa bất kỳ lỗi cú pháp nào. Tôi tìm thấy một giải pháp; xem câu trả lời của tôi dưới đây
Avery Chan
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.