สคริปต์เริ่มต้นที่ได้รับการควบคุมดูแลสำหรับ Apache?


16

ฉันต้องการเรียกใช้ apache บน Ubuntu 10.04 และใช้สิ่งกำกับดูแลที่ดีในการพุ่งพรวด (ฉันไม่เพียง แต่พูดถึงสคริปต์ init apache แต่การดูแลบริการที่เหมาะสม la daemontools - ซึ่งก็คือการพูดเริ่ม apache เมื่อมันตายสิ่งต่าง ๆ เช่นนั้น).

ใครบ้างที่มีการตั้งค่าเริ่มต้นทำงานสำหรับการกำกับดูแล Apache ใน Ubuntu 10.04?

Googles ไม่ได้ช่วยฉัน แต่อาจเป็นได้ว่า google-fu ของฉันอ่อนแอ


2
ฉันก็อยากรู้เรื่องนี้เช่นกัน ฉันโฮสต์หลายสิ่งหลายอย่าง (ส่วนใหญ่เป็นกระบวนการ Django) และต้องการทิ้งสคริปต์เริ่มต้นที่บอบบางของฉันสำหรับบางสิ่งที่มีประสิทธิภาพมากกว่านี้เล็กน้อย ยังไม่ได้พิจารณาถึงการพุ่งพรวด แต่ถ้าได้ผล ...
Oli

1
ฉันควรจะบอกว่าวิธีการดูแลปกติของฉันคือการใช้ daemontools ฉันแปลกใจนิดหน่อยที่ในโลกแห่งใหม่พุ่งพรวด - อูบุนตูไม่มีใครใช้บริการดูแลพุ่งพรวดเท่าที่ฉันสามารถบอกได้ใน googling ฉันคาดหวังว่ามันจะเป็นปัญหาที่แก้ไขแล้ว
Ben Williams

คำตอบ:


10

Woooo!

ผมเคยเขียนรุ่นของตัวเองที่มีการทำงานที่สวยมาก - มีบางส่วนแฮ็คไฟล์ conf -D NO_DETACHและการใช้

ขึ้นครั้งแรกที่ฉันได้ไปชุดUser, GroupและPidFileในตนเองมากกว่าที่จะมีพวกเขามาจาก/etc/apache2/apache2.conf /etc/apache2/envvarsฉันไม่สามารถหาวิธีที่จะทำให้ vars เหล่านั้นส่งออกอย่างถูกต้อง (ฉันลองทั้งสองอย่างenvและexportตามhttp://manpages.ubuntu.com/manpages/lucid/man5/init.5.htmlแต่ไม่ดี)

root@lucid:/etc/apache2# diff -u apache2.conf.orig apache2.conf
--- apache2.conf.orig   2010-09-20 13:46:33.857868534 +0930
+++ apache2.conf        2010-09-20 13:47:22.377842204 +0930
@@ -63,7 +63,7 @@
 # identification number when it starts.
 # This needs to be set in /etc/apache2/envvars
 #
-PidFile ${APACHE_PID_FILE}
+PidFile /var/run/apache2.pid

 #
 # Timeout: The number of seconds before receives and sends time out.
@@ -142,8 +142,8 @@
 </IfModule>

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

 #
 # AccessFileName: The name of the file to look for in each directory

นี่คือการทำงานของฉัน/etc/init/apache2.conf:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

ฉันสามารถทำได้start|stop|status|reload apache2และรับผลลัพธ์ที่มีความหมาย ถ้าฉันkill -9เป็นกระบวนการอาปาเช่หลักมันก็จะเกิดใหม่ทันทีและมันก็จะเริ่มและหยุดเมื่อบู๊ตตามที่คาดไว้ ดังนั้นฉันจึงคิดว่าทำงานได้ดีพอสมควร


มีบางสิ่งที่ฉันพยายามที่จะไม่สามารถทำงานได้

  • พยายามลบ-D NO_DETACHพร้อมกับ:
คาดหวังส้อม
คาดหวังภูต

ที่ล้มเหลวในการเริ่มบริการ

  • พยายามใช้วิธีที่คล้ายกัน/etc/apache2/envvarsเพื่อเติม${APACHE_*}ตัวแปร:
ส่งออก APACHE_RUN_USER = www-data
ส่งออก APACHE_RUN_GROUP = www-data
ส่งออก APACHE_PID_FILE = / var / run / apache2.pid

apache2: bad user name ${APACHE_RUN_USER}ที่ล้มเหลวในการเริ่มต้นและผลิตข้อผิดพลาดเกี่ยวกับ

  • พยายามเอาต์พุตคอนโซลและตัวเลือกดีฟอลต์ของคอนโซล; ณ จุดนี้ฉันรู้สึกสับสนเมื่อพยายามรับข้อความแสดงข้อผิดพลาดที่มีความหมาย ดูเหมือนว่าจะสร้างความแตกต่าง

    console output

  • สิ่งนี้มีประโยชน์สำหรับการดีบักข้อความ apache:

    exec /usr/sbin/apache2 -X -e debug -E /var/log/apache2/foo.log

  • นี่เป็นความพยายามอีกครั้งที่จะไม่แก้ไข/etc/apache2/apache2.confที่ล้มเหลว:

    exec APACHE_RUN_USER=www-data APACHE_RUN_GROUP=www-data APACHE_PID_FILE=/var/run/apache2.pid /usr/sbin/apache2 -D NO_DETACH -e debug -E /var/log/apache2/foo.log


สิ่งหนึ่งที่ต้องระวัง .. 'start on runlevel [2345]' อาจเริ่มต้นก่อนที่อินเทอร์เฟซเครือข่ายจะได้รับการกำหนดค่า .. ดังนั้น eth0 อาจเป็น "up" แต่อาจไม่พร้อมใช้งาน เช่นเดียวกันคุณอาจไม่มีระบบไฟล์ในตัวเครื่อง หนึ่งมาตรฐานที่ใช้แทนจะเริ่มต้นขึ้น (local-filesystems และ net-device-up IFACE! = lo)
SpamapS

! ที่น่าสนใจ เครื่องจักรที่สงสัยไม่ได้ถูกรีบูทมาระยะหนึ่งแล้วดังนั้นฉันจึงสนใจที่จะทำการทดสอบ ขอบคุณสำหรับทิป.
Ben Williams

1
สวัสดีคำถามที่ดีคำตอบที่ดียิ่งขึ้น :) คุณสามารถทำให้ envvars ทำงานดังนี้: สคริปต์ / etc / apache2 / envvars exec / usr / sbin / apache2 -D สคริปต์สิ้นสุด NO_DETACH
Martin Carpenter

5

สคริปต์นี้ใช้ได้กับฉัน:

# apache2 - http server
#
# Apache is a web server that responds to HTTP and HTTPS requests.
# Required-Start:    $local_fs $remote_fs $network $syslog
# Required-Stop:     $local_fs $remote_fs $network $syslog

description "apache2 http server"

start on runlevel [2345]
stop on runlevel [!2345]

pre-start script
    mkdir -p /var/run/apache2 || true
    install -d -o www-data /var/lock/apache2 || true
    # ssl_scache shouldn't be here if we're just starting up.
    # (this is bad if there are several apache2 instances running)
    rm -f /var/run/apache2/*ssl_scache* || true
end script

limit cpu 300 300
env APACHE_RUN_USER=www-data
env APACHE_RUN_GROUP=www-data
env APACHE_PID_FILE=/var/run/apache2.pid

# Give up if restart occurs 10 times in 30 seconds.
respawn limit 10 30

exec /usr/sbin/apache2 -D NO_DETACH
respawn

3

ฉันเคยประสบปัญหานี้เช่นกัน แต่ฉันใช้วิธีการอื่น วิธีที่ง่ายที่สุดในการรับตัวแปร env คือการใช้คำสั่ง source และชี้ไปที่ไฟล์ apache envvars จากนั้นคุณสามารถเรียกใช้ apache ด้วยตัวเลือก -D FOREGROUND

ดังนั้นโดยทั่วไปคุณต้องการสคริปต์ที่มีลักษณะเช่นนี้ (ของฉันอยู่ใน /etc/apache2/apache2_foreground.sh):

#!/bin/bash

read pid cmd state ppid pgrp session tty_nr tpgid rest < /proc/self/stat
trap "kill -TERM -$pgrp; exit" EXIT TERM KILL SIGKILL SIGTERM SIGQUIT


source /etc/httpd/envvars
apache2 -D FOREGROUND

จากนั้นคุณทำให้มันสามารถเรียกใช้งานได้และนำผู้ควบคุมไปยังตำแหน่งของมันคุณจำเป็นต้องใช้เครื่องหมายหยุด 6

command=/etc/apache2/apache2_foreground.sh
stopsignal=6

บรรทัดแรกสองบรรทัดในสคริปต์ตรวจจับ ID กลุ่มกระบวนการของสคริปต์และตั้งค่ากับดักซึ่งทำงานบนสัญญาณที่ส่งผ่านไปยังกระบวนการ - กับดักนี้ดำเนินการฆ่าด้วย ID กระบวนการเชิงลบของผู้ปกครองที่เรียกใช้กระบวนการ apache2 ทั้งหมด (สคริปต์ ตัวเอง) - การฆ่าด้วย PID เชิงลบหมายถึงการฆ่าเด็กทั้งหมดของกระบวนการดังกล่าว (ดังนั้นในกรณีนี้กระบวนการ apache2 ทั้งหมด) โดยที่ฉันไม่สามารถทำให้หัวหน้างานฆ่ากระบวนการ apache2 ได้

Stopignal 6 ใช้เพราะฉันไม่สามารถปรับสัญญาณอื่น ๆ ที่สามารถเรียกใช้กับดักสัญญาณ 9 ไม่สามารถจับได้และ 2 และ 3 ไม่ทำอะไรเลย (สคริปต์ไม่ถูกฆ่า)

หลังจากนั้นควรทำงานได้อย่างราบรื่นโดยไม่มีการแก้ไขการกำหนดค่า apache2 ใด ๆ


2

สองโพสต์จาก Scott James Remnant ในหัวข้อที่ฉันหวังว่าสามารถช่วยคุณได้:


ตกลงดังนั้นพวกเขาเข้าไปในประวัติศาสตร์เกี่ยวกับการดูแล daemons พุ่งพรวดและรายละเอียดเต็มไปด้วยเลือดบางส่วน มันยังไม่ได้เป็นสคริปต์สำหรับ apache ที่ดูแลโดยคนธรรมดาและยังมีรายละเอียดเพิ่มเติมในเอกสาร upstart ฉันสงสัยว่าคำตอบสุดท้ายนี้จะเป็น "เขียนเอง"
Ben Williams

0

โอ้ใช่โดยทั่วไปคำตอบจะเป็น "เขียนของคุณเอง" ดังนั้นคำแนะนำทั่วไปของฉันก็คือให้ปรึกษาหน้าเริ่มต้นใช้งาน -หน้าเริ่มต้นและ ... พิมพ์ออกไป

ฉันหวังว่าจะมีคนที่มีความรู้ในเรื่องนี้มากกว่าที่ฉันคิดด้วยสคริปต์ธรรมดา


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