Apache için sonradan denetlenen init script?


16

Ben Ubuntu 10.04 üzerinde apache çalıştırmak ve uptart içinde güzel denetim şeyler kullanmak istiyorum (Ben sadece apache init betiği hakkında konuşmak değil, aynı zamanda bir hizmet da la daemontools - yani demek, apache öldüğünde yeniden başlatmak, şeyler bunun gibi).

Herkes ubuntu 10.04 üzerinde apache denetlemek için çalışan bir upstart yapılandırma var mı?

Googlelar bana yardımcı olmadı, ancak google-fu'm zayıf olabilir.


2
Bunu da bilmek istiyorum. Bir çok şeyi (esas olarak Django süreçleri) barındırıyorum ve kırılgan init scriptlerimi biraz daha sağlam bir şey için dökmek istiyorum. Kalkış yapmayı düşünmemiştim ama işe
yarıyorsa

1
Söylemeliyim ki, normal denetim yöntemim daemontools kullanmaktır. Yeni uptart-ubuntu dünyasında, hiç kimsenin googling'imde anlayabildiğim kadarıyla uptart'ın servis denetimini kullanmadığına biraz şaşırdım. Çözülmüş bir sorun olmasını bekliyordum.
Ben Williams

Yanıtlar:


10

Woooo!

Bazı conf dosyası hack ve kullanarak, hemen hemen çalışan kendi sürümümü yazdım -D NO_DETACH.

Öncelikle, ben sete vardı User, Groupve PidFilede /etc/apache2/apache2.confel yerine onları topluyoruz /etc/apache2/envvars. O almak için bir çıkış yolu işlemesi mümkün değil düzgün ihraç edilecek vars (ben hem çalıştı envve exportgereği http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html , ancak hiçbir iyi).

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

O zaman bu benim çalışmam /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 apache2Anlamlı sonuçlar elde edebilirim ; Eğer kill -9ana apache sürecindeysem, hemen hemen yeniden doğar ve beklendiği gibi önyüklemeye başlar ve durur. Bu yüzden oldukça iyi çalıştığını düşünüyorum.


Çalışamayacağım şeyler vardı.

  • Aşağıdakilerle birlikte çıkarmaya çalıştı -D NO_DETACH:
çatal bekliyoruz
arka plan beklemek

Hizmet başlatılamadı.

  • Değişkenleri /etc/apache2/envvarsdoldurmak için benzer bir yöntem kullanmaya çalıştım ${APACHE_*}:
dışa aktar APACHE_RUN_USER = www-data
dışa aktar APACHE_RUN_GROUP = www-data
APACHE_PID_FILE = / var / run / apache2.pid dosyasını dışa aktar

Bu başlayamadı ve hakkında bir hata üretti apache2: bad user name ${APACHE_RUN_USER}.

  • Denenmiş konsol çıkışı ve konsol varsayılan seçenekleri; bu noktada gerçekten anlamlı hata mesajları almaya çalışıyorum. Fark etmiyor gibiydi.

    console output

  • Bu, apache mesajlarında hata ayıklamak için kullanışlıdır:

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

  • Bu, /etc/apache2/apache2.confbaşarısız olanı değiştirmemeye yönelik başka bir girişimdi :

    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


Dikkat edilmesi gereken bir şey .. 'çalışma seviyesinde başlat [2345]' ağ arayüzleri yapılandırılmadan önce başlayabilir .. bu nedenle eth0 "yukarı" olabilir ancak kullanıma hazır olmayabilir. Aynı şekilde, yerel dosya sistemleriniz olmayabilir. Bunun yerine kullanılan standart bir başlangıç ​​(yerel dosya sistemleri ve ağ-cihazı-IFACE! = Lo).
SpamapS

ilginç! Söz konusu makine bir süredir yeniden başlatılmadı, bu yüzden bir test yapmak isterim. Bahşiş için teşekkürler.
Ben Williams

1
Merhaba, harika soru, daha iyi cevap :) Envvars aşağıdaki gibi çalışabilirsiniz: script. / etc / apache2 / envvars exec / usr / sbin / apache2 -D NO_DETACH son komut dosyası
Martin Carpenter

5

Bu senaryo benim için çalıştı:

# 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

Bu soruna da değindim, ancak başka bir yaklaşım kullandım. Env değişkenlerini almanın en kolay yolu source komutunu kullanmak ve apache envvars dosyasına işaret etmektir, o zaman -D FOREGROUND seçenekleriyle apache'yi çalıştırabilirsiniz

temelde şöyle bir komut dosyasına ihtiyacınız var (benimki /etc/apache2/apache2_foreground.sh içinde):

#!/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

Daha sonra çalıştırılabilir hale getirir ve süpervizörü yerine yönlendirirsiniz, ayrıca durak işaretini kullanmanız gerekir 6

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

Koddaki ilk iki satır, komut dosyasının işlem grubu kimliğini yakalar ve işleme geçirilen sinyaller üzerinde çalışan bir tuzak ayarlar. Bu tuzak, tüm apache2 süreçlerini (komut dosyası kendisi) - negatif bir PID ile öldürmek, böyle bir sürecin tüm çocuklarını da öldürmek anlamına gelir (bu durumda tüm apache2 süreçleri), o olmadan süpervizörün apache2 süreçlerini öldürmesini sağlayamadım

Stopignal 6, tuzağı çağırabilecek başka bir sinyali bitiremediğim için kullanıldı, 9 yakalanamadı ve 2 ve 3 hiçbir şey yapmadı (senaryo öldürülmedi)

bundan sonra apache2 yapılandırmasında hiçbir değişiklik yapılmadan sorunsuz bir şekilde çalışmalıdır.


2

Scott James Remnant'tan size yardımcı olabileceğini umduğum birkaç konu:


Tamam, bu yüzden onlar daemonları denetlemeye ve bazı kanlı ayrıntılara dair bazı tarihlere giriyorlar. Başlangıçta denetlenen apache için hala bir komut dosyası değildir ve sonradan başlatma belgelerinde daha fazla ayrıntı vardır. Bunun son cevabının "kendiniz yazın" olacağından şüpheleniyorum.
Ben Williams

0

Oh, evet, tipik olarak cevap “kendiniz yazın” olacaktır, bu yüzden buna göre tipik önerim Başlarken - başlangıç sayfası'na bakmak ve… yazmaktır .

Umarım benden daha bilgili biri çalışmakta olan bir start-up senaryosu bulur.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.