Init script for Debian
This is an init script for Debian. Save as /etc/init.d/django
and run the following command:
update-rc.d django defaults
By default the script expects Django sites in /var/lib/django/<project>
. It will store PID files in /var/run/django
. These directories must already exist. Be careful not to set your RUN_PATH
to /var/run/
but to a subdirectory as this script changes the ownership of the runpath.
The settings may be overridden in a settings file located at /etc/defaults/django
. You must at least set the DJANGO_SITES
variable. An example is included below.
You can also have sites run in their own virtualenv by creating one with the same name as the Django site in /var/run/django/environments
.
/etc/init.d/django
#! /bin/sh ### BEGIN INIT INFO # Provides: FastCGI servers for Django # Required-Start: networking # Required-Stop: networking # Default-Start: 2 3 4 5 # Default-Stop: S 0 1 6 # Short-Description: Start FastCGI servers with Django. # Description: Django, in order to operate with FastCGI, must be started # in a very specific way with manage.py. This must be done # for each Django web server that has to run. ### END INIT INFO # # Author: Guillermo Fernandez Castellanos # <guillermo.fernandez.castellanos AT gmail.com>. # # Changed: Jannis Leidel # <jannis AT leidel.info> # Joost Cassee # <joost@cassee.net> # Sebastian Rahlf # <basti AT redtoad.de> # # Version: @(#)fastcgi 0.5 19-Nov-2009 basti AT redtoad.de # set -e #### CONFIGURATION (override in /etc/default/django) # django project names/directories DJANGO_SITES="" # path to the directory with your django projects SITES_PATH=/var/lib/django # path to the directory conrtaining all site-specific virtualenvs # (see http://pypi.python.org/pypi/virtualenv for more information) ENVIRONMENT_PATH=$SITES_PATH/environment # path to the directory for socket and pid files RUNFILES_PATH=/var/run/django # please make sure this is NOT root # local user prefered, www-data accepted RUN_AS=www-data # maximum requests before fast-cgi process respawns # (a.k.a. get killed and let live) MAXREQUESTS=1000 #### END CONFIGURATION # Include defaults if available if [ -f /etc/default/django ] ; then . /etc/default/django fi PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DESC="Django FastCGI servers" NAME=$0 SCRIPTNAME=/etc/init.d/$NAME mkdir -p $RUNFILES_PATH chown -R $RUN_AS:$RUN_AS $RUNFILES_PATH # A specific site can be started/stopped by appending its name SITE=$2 if [ -n "$SITE" ]; then DJANGO_SITES=$SITE fi # # Function that starts the daemon/service. # d_start() { # Starting all Django FastCGI processes for SITE in $DJANGO_SITES do echo -n " $SITE" # find python binary to use if [ -f $ENVIRONMENT_PATH/$SITE/bin/python ]; then PYTHON=$ENVIRONMENT_PATH/$SITE/bin/python else PYTHON=`which python` fi if [ -f $RUNFILES_PATH/$SITE.pid ]; then echo -n " already running" else start-stop-daemon --start --quiet \ --pidfile $RUNFILES_PATH/$SITE.pid \ --chuid $RUN_AS --exec /usr/bin/env -- $PYTHON \ $SITES_PATH/$SITE/manage.py runfcgi \ protocol=fcgi method=threaded maxrequests=$MAXREQUESTS \ socket=$RUNFILES_PATH/$SITE.socket \ pidfile=$RUNFILES_PATH/$SITE.pid chmod 400 $RUNFILES_PATH/$SITE.pid fi sleep 1 done } # # Function that stops the daemon/service. # d_stop() { # Killing all Django FastCGI processes running for SITE in $DJANGO_SITES do echo -n " $SITE" start-stop-daemon --stop --quiet --pidfile $RUNFILES_PATH/$SITE.pid \ || echo -n " not running" if [ -f $RUNFILES_PATH/$SITE.pid ]; then rm -f $RUNFILES_PATH/$SITE.pid fi sleep 1 done } ACTION="$1" case "$ACTION" in start) echo -n "Starting $DESC:" d_start echo "." ;; stop) echo -n "Stopping $DESC:" d_stop echo "." ;; status) echo "Status of $DESC:" for SITE in $DJANGO_SITES do echo -n " $SITE" if [ -f $RUNFILES_PATH/$SITE.pid ]; then echo " running ($(cat $RUNFILES_PATH/$SITE.pid))" else echo " not running" fi done ;; restart|force-reload) echo -n "Restarting $DESC: $NAME" d_stop sleep 2 d_start echo "." ;; *) echo "Usage: $NAME {start|stop|restart|force-reload|status} [site]" >&2 exit 3 ;; esac exit 0
/etc/default/django
This is an example settings file. Most settings (apart from DJANGO_SITES
) are not required, sane defaults are included in the script.
# django project names/directories DJANGO_SITES="myapp myapp2 myapp3" # path to the directory with your django projects #SITES_PATH=/home/django/projects # path to the directory conrtaining all site-specific virtualenvs # (see http://pypi.python.org/pypi/virtualenv for more information) ENVIRONMENT_PATH=$SITES_PATH/environment # path to the directory for socket and pid files RUNFILES_PATH=$SITES_PATH/run # please make sure this is NOT root # local user prefered, www-data accepted RUN_AS=django # maximum requests before fast-cgi process respawns # (a.k.a. get killed and let live) MAXREQUESTS=100