Take the 2-minute tour ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

I want to run apache on Ubuntu 10.04, and use the nice supervision stuff in upstart (I'm not just talking about the apache init script, but proper service supervision a la daemontools - which is to say, restarting apache when it dies, things like that).

Does anyone have a running upstart config for supervising apache on ubuntu 10.04?

The Googles have been no help to me, but it could be that my google-fu is weak.

share|improve this question
2  
I'd like to know about this too. I host a lot of things (mainly Django processes) and would like to dump my fragile init scripts for something a little more robust. Hadn't considered upstart but if it works... –  Oli Aug 26 '10 at 9:41
1  
I should say, my normal supervision method is to use daemontools. I am a little surprised that in the new upstart-ubuntu world, no-one has used upstart's service supervision, as far as I could tell in my googling. I was expecting it to be a solved problem. –  Ben Williams Aug 28 '10 at 10:13
add comment

6 Answers

Couple of posts from Scott James Remnant on the topic that I hope can help you:

share|improve this answer
    
OK, So they go into some of the history about upstart supervising daemons and some of the gory details. It's still not a script for upstart-supervised apache, and, there's more detail in the upstart documentation. I suspect the final answer to this is going to be "write it yourself". –  Ben Williams Aug 31 '10 at 12:41
add comment

Oh, yes, typically the answer will be “write your own”, so my accordingly typical suggestion would be to consult the Getting Started - upstart page and… type away.

I hope someone more knowledgeable on the issue than me comes up with an working upstart script.

share|improve this answer
add comment
up vote 10 down vote accepted

Woooo!

I've written my own version that is pretty much working - with some conf file hacking, and using -D NO_DETACH.

First up, I had to set User, Group and PidFile in /etc/apache2/apache2.conf manually, rather than have them coming in from /etc/apache2/envvars. I couldn't work out a way to get those vars to be exported properly (I tried both env and export as per http://manpages.ubuntu.com/manpages/lucid/man5/init.5.html, but no good).

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

Then, this is my working /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

I can do start|stop|status|reload apache2 and get meaningful results; if I kill -9 the master apache process, it gets respawned pretty much immediately, and it starts and stops on boot as expected. So it's working reasonably well I reckon.


There were things I tried that I could not get working.

  • Tried to remove -D NO_DETACH, in conjunction with:
expect fork
expect daemon

That failed to start the service.

  • Tried to use a similar method to /etc/apache2/envvars to populate the ${APACHE_*} variables:
export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data
export APACHE_PID_FILE=/var/run/apache2.pid

That failed to start, and produced an error about apache2: bad user name ${APACHE_RUN_USER}.

  • Tried console output and console default options; at this point I was really just flailing about trying to get meaningful error messages. Seemed to make no difference.

    console output

  • This was useful for debugging apache messages:

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

  • This was another attempt to not modify /etc/apache2/apache2.conf that failed:

    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

share|improve this answer
    
One thing to watch out for.. 'start on runlevel [2345]' may start before network interfaces are configured.. so eth0 may be "up" but it may not be ready for use. Likewise, you may not have any local filesystems. One standard thats been used instead is start on (local-filesystems and net-device-up IFACE!=lo). –  SpamapS Nov 16 '10 at 20:14
    
interesting! The machine in question hasn't been rebooted for a while, so I'd be interested to give that a test. Thanks for the tip. –  Ben Williams Dec 1 '10 at 0:24
1  
Hi, great question, even better answer :) You can get envvars working as follows: script . /etc/apache2/envvars exec /usr/sbin/apache2 -D NO_DETACH end script –  Martin Carpenter Feb 5 '11 at 15:27
add comment

I would use an approach much like Ben Williams's but with -D FOREGROUND instead of -D NO_DETACH.

share|improve this answer
add comment

I've also hit this problem, however I used another approach. The easiest way to get the env variables is using the source command and pointing it to the apache envvars file, then you can run apache with the -D FOREGROUND options

so basically you need a script which looks like this (mine is in /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

Then you make it executable and point the supervisor to its location, you also need to use the stopsignal 6

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

The two first lines in the script catch the process group ID of the script, and set a trap which runs on signals passed to the process - this trap executes a kill with a negative process ID of the parent that runs all apache2 processes (the script itself) - killing with a negative PID means to kill all the children of such process aswell (so in this case all apache2 processes), without that I wasn't able to make supervisor kill the apache2 processes

The stopsignal 6 is used as I couldn't fin any other signal that could invoke the trap, the 9 cannot be caught, and 2 and 3 don't do anything (the script isn't killed)

after that it should work smoothly, with no modifications to the apache2 configuration whatsoever

share|improve this answer
add comment

Well, this script worked for me:

# 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
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.