ทำไม apache2 ไม่เคารพไฟล์ envvars ของฉัน


17

ไฟล์ envvar ของฉันมีบรรทัดเหล่านี้อยู่:

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

apache2.conf ของฉันมีบรรทัดเหล่านี้อยู่:

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

แต่เมื่อฉันเรียกใช้apache2 -Mฉันได้รับสิ่งนี้:

apache2: bad user name ${APACHE_RUN_USER}

การแก้ไขชั่วคราวคือการใส่รหัสwww-dataลงในไฟล์ apache2.conf ของฉัน มีการเก็งกำไรบางอย่างที่นี่เป็นเพราะสคริปต์การกำหนดค่าบางอย่างไม่ได้แทนที่ env vars อย่างถูกต้องในไฟล์ apache2.conf ของฉัน ไม่ว่าฉันจะรับ apache2 เพื่อศึกษาไฟล์ envvars ของฉันได้อย่างไร

ในฐานะที่เป็นจุดข้อมูลอื่นไซต์นี้ดูเหมือนว่าบ่งชี้ envvars ถูกสร้างขึ้นที่ build แต่อ่านโดย apache2ctl ที่รันไทม์บอกว่าไฟล์นี้ไม่ได้เป็นเพียงเซ่อเหลือโดยกระบวนการสร้าง

คำตอบ:


30

หลังจากดูคำตอบที่ได้รับจาก @Lekensteyn ฉันลองsudo apache2ctl -Mapache2.conf ของฉันกลับไปเป็นต้นฉบับ วิธีนี้ใช้ได้ผลดังนั้นฉันจึงขุดลงใน man man สักครู่ นี่คือสิ่งที่man apache2ต้องพูด:

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.

ดังนั้นคำตอบสำหรับคำถามนี้คือคุณไม่ได้ใช้apache2อย่างถูกต้อง ใช้apache2ctlแทน

ขอบคุณ @Lekensteyn ที่ชี้ฉันไปในทิศทางที่ถูกต้อง


วิธีที่ถูกต้องแม้มากขึ้นจะใช้ initscript นี้sudo stop apache2, sudo restart apache2และsudo start apache2( /etc/init.d/apache2 stopอื่น ๆ )
Lekensteyn

ในกรณีของฉันฉันกำลังเพิ่มการumaskตั้งค่าเป็น envvars และแม้หลังจากการรีสตาร์ทโดยใช้apache2ctl restartมันก็ยังไม่ทำงาน แต่การรีสตาร์ทโดยใช้service apache2 restartนั้นใช้งานได้ ( service apache2 gracefulไม่ได้)
Matt Browne

ขอแนะนำให้ใช้บริการแทน apachectl แต่ถ้าคุณต้องการใช้คำสั่งที่ไม่ได้เชื่อมโยงกับคำสั่งบริการเช่น apachectl -S ... คำตอบนี้ยอดเยี่ยม upvote
Feida Kila

FYI: การที่/etc/init.d apache2 reloadจะไม่รับสิ่งที่envvarsเพิ่มเข้ามาคุณต้องหยุดและเริ่มต้นเซิร์ฟเวอร์
Tha

7

จากhttp://httpd.apache.org/docs/2.2/configuring.html :

ค่าของตัวแปรสภาวะแวดล้อมเชลล์สามารถใช้ในบรรทัดไฟล์คอนฟิกูเรชันโดยใช้ไวยากรณ์ $ {ENVVAR} หาก "ENVVAR" เป็นชื่อของตัวแปรสภาพแวดล้อมที่ถูกต้องค่าของตัวแปรนั้นจะถูกแทนที่ในจุดนั้นในบรรทัดไฟล์การกำหนดค่าและการประมวลผลจะดำเนินการต่อราวกับว่าข้อความนั้นถูกพบโดยตรงในไฟล์กำหนดค่า (หากไม่พบตัวแปร ENVVAR อักขระ "$ {ENVVAR}" จะไม่มีการเปลี่ยนแปลงเพื่อใช้ในระยะต่อมาในการประมวลผลไฟล์ config)

ดังนั้นตัวแปรจึงถูกดึงจากสภาพแวดล้อมตามที่คาดไว้ ตอนนี้จะเกิดอะไรขึ้น?

ใน/etc/init.d/apache2, APACHE_ENVVARSการตั้งค่าไปยังเส้นทางของenvvarsไฟล์ซึ่งจะขึ้นอยู่บนเส้นทาง initscript มันมักจะส่งผลในAPACHE_ENVVARS=/etc/apache2/envvarsการตั้งค่า ตอนนี้เนื่องจากค่านี้เท่ากับค่าเริ่มต้นตามที่ตั้งapache2ctlไว้จึงไม่ถูกส่งออก

จาก/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

คำอธิบาย: ถ้าเป็นที่ว่างเปล่าให้ใช้เส้นทางเริ่มต้นซึ่งเป็นAPACHE_ENVVARS /etc/apache2/envvarsหากไฟล์นี้มีอยู่ "แหล่งที่มา" มัน (ดำเนินการคำสั่งจากไฟล์นั้นในสภาพแวดล้อมปัจจุบัน)

ตรวจสอบให้แน่ใจว่าenvvarsไฟล์ไม่มีข้อผิดพลาดทางไวยากรณ์ใด ๆ เพื่อทำการตรวจสอบดังกล่าวใช้:

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

ข้อผิดพลาดจะถูกพิมพ์ถ้ามี


ฉันทำการตรวจสอบและสามารถตรวจสอบได้ว่า envvars ของฉันไม่มีข้อผิดพลาดทางไวยากรณ์ใด ๆ ฉันพบวิธีแก้ปัญหา ดูคำตอบของฉันด้านล่าง
เอเวอรี่ชาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.