skrip init baru diawasi untuk Apache?


16

Saya ingin menjalankan apache di Ubuntu 10.04, dan menggunakan hal-hal pengawasan yang bagus di pemula (Saya tidak hanya berbicara tentang skrip init apache, tetapi juga pengawasan layanan yang tepat a la daemontools - artinya, memulai kembali apache ketika mati, hal-hal seperti itu).

Adakah yang memiliki konfigurasi pemula yang berjalan untuk mengawasi apache di ubuntu 10.04?

Google tidak membantu saya, tetapi bisa jadi google-fu saya lemah.


2
Saya juga ingin tahu tentang ini. Saya meng-host banyak hal (terutama proses Django) dan ingin membuang skrip init rapuh saya untuk sesuatu yang sedikit lebih kuat. Tidak dianggap sebagai pemula tetapi jika itu berhasil ...
Oli

1
Saya harus mengatakan, metode pengawasan normal saya adalah menggunakan daemontools. Saya sedikit terkejut bahwa di dunia baru-ubuntu baru, tidak ada yang menggunakan pengawasan layanan pemula, sejauh yang saya tahu dalam googling saya. Saya berharap itu menjadi masalah yang terpecahkan.
Ben Williams

Jawaban:


10

Woooo!

Saya telah menulis versi saya sendiri yang cukup berfungsi - dengan beberapa peretasan file conf, dan menggunakan -D NO_DETACH.

Pertama, saya harus set User, Groupdan PidFiledi /etc/apache2/apache2.confmanual, daripada memiliki mereka datang dari /etc/apache2/envvars. Saya tidak dapat menemukan cara untuk membuat vars tersebut diekspor dengan benar (saya mencoba keduanya envdan exportsesuai http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , tetapi tidak bagus).

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

Lalu, ini pekerjaan saya /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

Saya bisa melakukan start|stop|status|reload apache2dan mendapatkan hasil yang bermakna; jika saya kill -9proses master apache, itu akan langsung direspawn, dan mulai dan berhenti saat boot seperti yang diharapkan. Jadi kurasa itu bekerja dengan cukup baik.


Ada beberapa hal yang saya coba sehingga saya tidak bisa bekerja.

  • Mencoba menghapus -D NO_DETACH, bersama dengan:
berharap garpu
harapkan daemon

Itu gagal memulai layanan.

  • Mencoba menggunakan metode serupa /etc/apache2/envvarsuntuk mengisi ${APACHE_*}variabel:
ekspor APACHE_RUN_USER = www-data
ekspor APACHE_RUN_GROUP = www-data
ekspor APACHE_PID_FILE = / var / run / apache2.pid

Itu gagal memulai, dan menghasilkan kesalahan tentang apache2: bad user name ${APACHE_RUN_USER}.

  • Mencoba konsol keluaran dan opsi konsol standar; pada titik ini saya benar-benar hanya gagal untuk mencoba mendapatkan pesan kesalahan yang bermakna. Tampaknya tidak ada bedanya.

    console output

  • Ini berguna untuk men-debug pesan apache:

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

  • Ini adalah upaya lain untuk tidak memodifikasi /etc/apache2/apache2.confyang gagal:

    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


Satu hal yang harus diperhatikan .. 'mulai di runlevel [2345]' dapat dimulai sebelum antarmuka jaringan dikonfigurasi .. jadi eth0 mungkin "naik" tetapi mungkin belum siap untuk digunakan. Demikian juga, Anda mungkin tidak memiliki sistem file lokal. Sebagai gantinya, standar yang digunakan adalah start on (sistem file lokal dan IFACE! Net-device-up! = Lo).
SpamapS

menarik! Mesin yang dimaksud belum di-boot ulang untuk sementara waktu, jadi saya tertarik untuk mencobanya. Terima kasih atas tipnya.
Ben Williams

1
Hai, pertanyaan yang bagus, jawaban yang lebih baik :) Anda dapat membuat semua karyawan bekerja sebagai berikut: skrip. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH skrip akhir
Martin Carpenter

5

Skrip ini bekerja untuk saya:

# 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

Saya juga mengalami masalah ini, namun saya menggunakan pendekatan lain. Cara termudah untuk mendapatkan variabel env adalah menggunakan perintah sumber dan mengarahkannya ke file apache envvars, maka Anda dapat menjalankan apache dengan opsi -D FOREGROUND

jadi pada dasarnya Anda memerlukan skrip yang terlihat seperti ini (milik saya ada di /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

Kemudian Anda membuatnya dieksekusi dan mengarahkan pengawas ke lokasi, Anda juga perlu menggunakan tanda berhenti 6

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

Dua baris pertama dalam skrip menangkap ID grup proses skrip, dan mengatur jebakan yang berjalan pada sinyal yang diteruskan ke proses - jebakan ini mengeksekusi kill dengan ID proses negatif dari induk yang menjalankan semua proses apache2 (skrip sendiri) - membunuh dengan PID negatif berarti membunuh semua anak dari proses tersebut juga (jadi dalam hal ini semua proses apache2), tanpa itu saya tidak dapat membuat pengawas membunuh proses apache2

Stopignal 6 digunakan karena saya tidak dapat menangkap sinyal lain yang dapat memanggil perangkap, 9 tidak dapat ditangkap, dan 2 dan 3 tidak melakukan apa-apa (skrip tidak terbunuh)

setelah itu harus bekerja dengan lancar, tanpa modifikasi konfigurasi apache2 sama sekali


2

Beberapa posting dari Scott James Remnant tentang topik yang saya harap dapat membantu Anda:


OK, jadi mereka masuk ke beberapa sejarah tentang daemon pengawasan pemula dan beberapa detail mengerikan. Ini masih bukan skrip untuk apache yang diawasi pemula, dan, ada lebih detail dalam dokumentasi pemula. Saya menduga jawaban terakhir untuk ini akan menjadi "tulis sendiri".
Ben Williams

0

Oh, ya, biasanya jawabannya adalah "tulis sendiri", jadi saran khas saya yang sesuai adalah untuk berkonsultasi dengan Memulai - halaman pemula dan ... ketik saja.

Saya berharap seseorang yang lebih berpengetahuan tentang masalah ini daripada saya membuat naskah pemula yang berfungsi.


0

Saya akan menggunakan pendekatan seperti pendekatan Ben Williams tetapi dengan -D FOREGROUNDalih - alih -D NO_DETACH.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.