我想在Ubuntu 10.04上运行apache,并在upstart中使用不错的监管工具(我不只是在谈论apache init脚本,而是适当的服务监管la daemontools-也就是说,死后重新启动apache的事情像那样)。
有人在ubuntu 10.04上有运行新贵的配置来监督Apache吗?
Google对我没有帮助,但可能是我的google-fu很弱。
我想在Ubuntu 10.04上运行apache,并在upstart中使用不错的监管工具(我不只是在谈论apache init脚本,而是适当的服务监管la daemontools-也就是说,死后重新启动apache的事情像那样)。
有人在ubuntu 10.04上有运行新贵的配置来监督Apache吗?
Google对我没有帮助,但可能是我的google-fu很弱。
Answers:
oo!
我编写了自己的版本,该版本几乎可以正常工作-带有一些conf文件黑客攻击,并使用 -D NO_DETACH
。
首先,我必须设置User
,Group
并且PidFile
在/etc/apache2/apache2.conf
手动,而不是让他们来自何处/etc/apache2/envvars
。我无法找到一种方法来正确导出这些var(我尝试了两种方法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
是主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
好吧,这个脚本对我有用:
# 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
我也遇到了这个问题,但是我使用了另一种方法。获取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配置进行任何修改
Scott James Remnant的几篇文章,希望对您有帮助:
我会使用类似于Ben Williams的方法,但是使用-D FOREGROUND
而不是-D NO_DETACH
。