Mengapa apache2 tidak menghargai file utusan saya?

17

File envvar saya memiliki baris berikut:

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

Apache2.conf saya memiliki baris ini di dalamnya:

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

Tetapi ketika saya menjalankan apache2 -Msaya mendapatkan ini:

apache2: bad user name ${APACHE_RUN_USER}

Perbaikan sementara adalah dengan www-datamemasukkan kode apache2.conf ke dalam hard-code . Ada beberapa spekulasi di sini bahwa ini karena beberapa skrip konfigurasi tidak mengganti env vars dengan benar di file apache2.conf saya. Terlepas bagaimana cara saya mendapatkan apache2 untuk berkonsultasi dengan file envvars saya?

Sebagai titik data lain situs ini tampaknya mengindikasikan bahwa envvars dibuat di build, tetapi dibaca oleh apache2ctl saat runtime, menunjukkan bahwa file ini tidak hanya buang kotoran sisa oleh proses build.

Avery Chan
sumber

Jawaban:

30

Setelah melihat jawaban yang diberikan oleh @Lekensteyn, saya mencoba sudo apache2ctl -Mdengan apache2.conf saya dikembalikan ke aslinya. Ini berhasil jadi saya sedikit menggali halaman manual. Inilah yang man apache2harus dikatakan:

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.

Jadi, jawaban untuk pertanyaan ini adalah: Anda tidak menggunakan apache2dengan benar; menggunakanapache2ctl saja.

Terima kasih @Lekensteyn karena mengarahkan saya ke arah yang benar.

Avery Chan
sumber
Cara bahkan lebih benar akan menggunakan skrip init yang: sudo stop apache2, sudo restart apache2dan sudo start apache2( /etc/init.d/apache2 stop, dll)
Lekensteyn
Dalam kasus saya, saya menambahkan umaskpengaturan ke envvars, dan bahkan setelah memulai ulang menggunakannya apache2ctl restartmasih tidak berfungsi, tetapi memulai kembali menggunakan service apache2 restartberhasil ( service apache2 gracefultidak).
Matt Browne
disarankan menggunakan layanan alih-alih apachectl, tetapi jika Anda perlu menggunakan perintah yang tidak ditautkan ke perintah layanan, seperti apachectl -S ... jawaban ini bagus. upvote
Feida Kila
FYI: Melakukan /etc/init.d apache2 reloadtidak akan mengambil envvarstambahan, Anda harus berhenti dan memulai server
ThaDon
7

Dari http://httpd.apache.org/docs/2.2/configuring.html :

Nilai variabel lingkungan shell dapat digunakan dalam baris file konfigurasi menggunakan sintaks $ {ENVVAR}. Jika "ENVVAR" adalah nama variabel lingkungan yang valid, nilai variabel itu diganti ke tempat itu di baris file konfigurasi, dan pemrosesan berlanjut seolah-olah teks itu ditemukan langsung di file konfigurasi. (Jika variabel ENVVAR tidak ditemukan, karakter "$ {ENVVAR}" dibiarkan tidak berubah untuk digunakan pada tahap selanjutnya dalam pemrosesan file config.)

Jadi, variabel tersebut memang diambil dari lingkungan seperti yang diharapkan. Sekarang dimana ini terjadi?

Di /etc/init.d/apache2, APACHE_ENVVARSdiatur ke path envvarsfile yang didasarkan pada path initcript. Biasanya menghasilkan APACHE_ENVVARS=/etc/apache2/envvarsdiatur. Sekarang, karena nilai ini sama dengan nilai default yang ditetapkan apache2ctl, nilai itu tidak diekspor.

Dari /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

Penjelasan: jika APACHE_ENVVARSkosong, gunakan jalur default yang /etc/apache2/envvars. Jika file ini ada, "sumber" itu (jalankan perintah dari file itu di lingkungan saat ini).

Pastikan envvarsfile tersebut tidak mengandung kesalahan sintaksis apa pun. Untuk melakukan pemeriksaan seperti itu, gunakan:

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

Kesalahan dicetak jika ada.

Lekensteyn
sumber
Saya melakukan pemeriksaan dan dapat memverifikasi bahwa utusan saya tidak mengandung kesalahan sintaksis apa pun. Saya menemukan solusi; lihat jawaban saya di bawah ini.
Avery Chan