由upstart监督的Apache初始化脚本?


16

我想在Ubuntu 10.04上运行apache,并在upstart中使用不错的监管工具(我不只是在谈论apache init脚本,而是适当的服务监管la daemontools-也就是说,死后重新启动apache的事情像那样)。

有人在ubuntu 10.04上有运行新贵的配置来监督Apache吗?

Google对我没有帮助,但可能是我的google-fu很弱。


2
我也想知道这一点。我托管了很多东西(主要是Django进程),并希望将易碎的初始化脚本转储为更健壮的东西。没考虑过暴发户,但如果成功的话……
奥利

1
我应该说,我通常的监督方法是使用daemontools。据我在谷歌搜索中所知,在新的暴发户-ubuntu世界中,没有人使用过暴发户的服务监督。我原以为这将是一个已解决的问题。
本·威廉姆斯

Answers:


10

oo!

我编写了自己的版本,该版本几乎可以正常工作-带有一些conf文件黑客攻击,并使用 -D NO_DETACH

首先,我必须设置UserGroup并且PidFile/etc/apache2/apache2.conf手动,而不是让他们来自何处/etc/apache2/envvars。我无法找到一种方法来正确导出这些var(我尝试了两种方法envexport并且按照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是主apache进程,它将立即重生,并且按预期启动和停止启动。因此,我认为它的运作相当不错。


我尝试过一些无法工作的事情。

  • 尝试删除-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


需要注意的一件事:“在运行级别[2345]上启动”可能会在配置网络接口之前启动。同样,您可能没有任何本地文件系统。取而代之的是一个标准(本地文件系统和net-device-up IFACE!= lo)。
SpamapS

有趣!有问题的计算机已经有一段时间没有重启了,所以我有兴趣进行一下测试。谢谢你的提示。
本·威廉姆斯

1
嗨,好问题,甚至更好的答案:)您可以使envvars如下工作:script。/ 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文件,然后可以使用-D FOREGROUND选项运行apache。

所以基本上您需要一个看起来像这样的脚本(mine在/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,并设置了一个陷阱,该陷阱在传递给该进程的信号上运行-该陷阱以运行所有apache2进程的父进程的负进程ID执行kill。本身)-使用负PID杀死意味着也要杀死该进程的所有子进程(因此,在本例中为所有apache2进程),否则我无法使管理员杀死apache2进程

使用stopsignal 6是因为我无法找到其他任何可以触发陷阱的信号,无法捕获9,并且2和3没有执行任何操作(脚本没有被杀死)

之后,它应该可以正常工作,无需对apache2配置进行任何修改


2

Scott James Remnant的几篇文章,希望对您有帮助:


好的,所以他们进入了有关监视守护程序的新贵的一些历史以及一些血腥的细节。它仍然不是针对新贵监督的Apache的脚本,并且在新贵文档中有更多详细信息。我怀疑对此的最终答案将是“自己编写”。
本·威廉姆斯

0

哦,是的,答案通常是“写你自己的”,因此,我的典型建议是咨询“ 入门-新贵”页面,然后键入。

我希望比我更了解这个问题的人能提出一个可行的新贵脚本。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.