Apache 的 upstart 监督初始化脚本?

Apache 的 upstart 监督初始化脚本?

我想在 Ubuntu 10.04 上运行 apache,并使用 upstart 中的良好监督功能(我不只是在谈论 apache init 脚本,而是适当的服务监督 a la daemontools - 也就是说,当 apache 死机时重新启动它,诸如此类)。

有没有人有运行 upstart 配置来监督 ubuntu 10.04 上的 apache?

谷歌对我没有帮助,但这可能是因为我的谷歌能力较弱。

答案1

哇噢!

我已经编写了自己的版本,该版本基本可以运行——通过一些 conf 文件破解,并使用-D NO_DETACH

首先,我必须手动设置、UserGroup,而不是让它们从 传入。我无法想出一种方法来正确导出这些变量(我尝试了 和,按照PidFile/etc/apache2/apache2.conf/etc/apache2/envvarsenvexporthttp://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-数据
导出 APACHE_RUN_GROUP=www-数据
导出 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

答案2

嗯,这个脚本对我有用:

# 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

我也遇到过这个问题,但是我使用了另一种方法。获取环境变量的最简单方法是使用 source 命令并将其指向 apache envvars 文件,然后您可以使用 -D FOREGROUND 选项运行 apache

所以基本上你需要一个像这样的脚本(我的在 /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 执行终止操作 - 使用负 PID 终止意味着同时终止该进程的所有子进程(在本例中是所有 apache2 进程),如果没有这个,我就无法让主管终止 apache2 进程

使用停止信号 6 是因为我找不到任何其他可以调用陷阱的信号,信号 9 无法被捕获,信号 2 和 3 不执行任何操作(脚本没有被终止)

之后它应该可以顺利运行,无需对 apache2 配置进行任何修改

答案4

哦,是的,通常答案是“自己写”,所以我的典型建议是咨询入门 - upstart页面并...输入。

我希望有人比我更了解这个问题,能够想出一个可行的 upstart 脚本。

相关内容