Showing posts with label upstart. Show all posts
Showing posts with label upstart. Show all posts

Saturday, 13 April 2019

How to run gunicorn script using systemd in Debian

Since upstart is deprecated, it is not available in Debian 9, so I had to use systemd which turned out to be quite easy:

nano  /etc/systemd/system/gunicorn.service

Create the file:

[Unit]
Description=Gunicorn Daemon
#After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
User= appuser
Group=www-data
ExecStart=/path/to/project/gunicorn.sh
#Restart=always
#RestartSec=1
#Restart=on-failure
# Configures the time to wait before service is stopped forcefully.
TimeoutStopSec=300
[Install]
WantedBy=multi-user.target
You don't need to restart the server to enable the service:

systemctl enable gunicorn
Start it:
systemctl start gunicorn

Watch it:
systemctl status gunicorn
If you made changes to gunicorn.service you need to run:

systemctl daemon-reload

before restarting the daemon with

systemctl restart gunicorn

Wednesday, 27 June 2018

Deploy celery on Debian 8 using upstart

Make an upstart conf file:

nano /etc/init/celery.conf

Insert in it:

description "Celery application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid john
setgid www-data
chdir /path/to/django/proj
exec bash celery.sh
Put `celery.sh` in /path/to/django/proj


CELERY_BIN="/home/john/.projenv/bin/celery"


# App instance to use
CELERY_APP="proj"
# Where to chdir at start.
CELERYD_CHDIR="/path/to/django/proj"
# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=1"
# %n will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists (e.g., nobody).
CELERYD_USER="john"
CELERYD_GROUP="www-data"
# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1
export SECRET_KEY="somekey"

Start the deamon:

service celery start

That's it!‌

Wednesday, 12 April 2017

Deploy django on Debian with gunicorn using upstart

In my experience gunicorn is more stable and uses less memory than uwsgi to handle the same number of requests. It is also much simpler to configure and deploy.

The only issue with it is that finding good straightforward tutorial on its deployment hasn't been easy for me. The problem araise not by gunicorn but the rather convulted method of supervisor which adds more complexity to the process.

Fortunately there is the much simpler way to keep gunicorn running:‌ upstart

First you need to install pip and virtaulenv:

apt-get install python-pip
pip install virtualenv
Switch to a non-root user and create a virtualenv



su myuser 
virtualenv ~/.myenv
virtualenv ~/.myenv
activate the virtaualenv

source ~/.myenv/bin/activate

Install gunicorn while you'r on your virtualenv:

(.myenv)# pip install gunicorn


create a gunicorn.sh in  /path/to/project, like this:
#!/bin/bash
NAME="myproject"                                  # Name of the application
DJANGODIR=/path/to/project             # Django project directory
SOCKFILE=/tmp/gunicorn.sock  # we will communicte using this unix socket
USER=john                                        # the user to run as
GROUP=www-data                                     # the group to run
NUM_WORKERS=9                                     # twice the number of cpu cores
DJANGO_SETTINGS_MODULE=sai.settings             # which settings file should Django use
DJANGO_WSGI_MODULE=sai.wsgi                     # WSGI module name
echo "Starting $NAME as `whoami`"
# Activate the virtual environment
cd $DJANGODIR
source /home/user/.virtualenv/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec /home/john/.virtualenv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $NUM_WORKERS \
  --user=$USER --group=$GROUP \
  --bind=unix:$SOCKFILE \
  --log-level=debug \
  --log-file=-
Note: DO NOT create /tmp/gunicorn.sock  
gunicorn will do that for you


Make sure that upstart is installed:

apt-get install upstart

Now create an upstart job in /etc/init to run gunicorn.sh

nano /etc/init/gunicorn.conf
And put in it:
description "Gunicorn application server handling myproject"
start on runlevel [2345]
stop on runlevel [!2345]
respawn
setuid john
setgid www-data
chdir /path/to/project
exec bash gunicorn.sh


Now you can start gunicorn like any service :

service gunicorn restart

The only remaining step is to pass request to gunicorn in nginx, by a file like this:

upstream myproject {
    server unix:///tmp/gunicorn.sock;    # the socket will be created automatically
    }
server {
#...other stuff
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host;
        if (!-f $request_filename) {
            proxy_pass http://myproject;
            break;
        }
    }
}
Note 2: If you just started upstart, you may need to  reboot to be able to service gunicorn restart.



That's it!
Restart nginx and enjoy gunicorn.