Instalación Nginx, Gunicorn y Django

Fuentes


Gunicorn

En proyect_name/bin, creamos un archivo gunicorn_start.sh

vim bin/gunicorn_start.sh

# Añadimos

#!/bin/bash

NAME="proyect_name" # Name of the application
DJANGODIR=/home/snicoper/projects/python/proyect_name/src/ # Django project directory
LOGFILE=/home/snicoper/projects/python/proyect_name/logs/gunicorn.log
LOGDIR=$(dirname $LOGFILE)
USER=snicoper # the user to run as
GROUP=snicoper # the group to run as
ADDRESS=127.0.0.1:8001
NUM_WORKERS=3 # how many worker processes should Gunicorn spawn
DJANGO_SETTINGS_MODULE=settings.settings_prod # which settings file should Django use
DJANGO_WSGI_MODULE=settings.wsgi # WSGI module name

echo "Starting $NAME as `whoami`"

# Activate the virtual environment
cd $DJANGODIR
source /home/snicoper/.virtualenvs/default/bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH

# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec gunicorn ${DJANGO_WSGI_MODULE}:application \
    --workers $NUM_WORKERS \
    --bind=$ADDRESS \
    --user=$USER --group=$GROUP \
    --log-level=debug \
    --log-file=$LOGFILE 2>>$LOGFILE

Advertencia

Corregir las rutas y usuario!

Permisos de ejecución

chmod +x bin/gunicorn_start.sh

Nginx

Instalación Nginx

Nota

En Fedora/Centos si se sirven las paginas en el home hay que dar permisos al home del usuario chmod 711 /home/usuario

# Ubuntu
sudo vim /etc/nginx/sites-avalaible/proyect_name

# Fedora/Centos
sudo vim /etc/nginx/conf.d/proyect_name.conf

Añadimos

server {
    listen   80;
    server_name www.workspace.local;

    access_log /var/log/nginx/proyect_name-access.log;
    error_log /var/log/nginx/proyect_name-error.log;

    # Django media
    location /media/  {
        alias /home/snicoper/projects/python/proyect_name/src/media/;  # your Django project's media files - amend as required
    }

    # Django static
    location /static/ {
        alias /home/snicoper/projects/python/proyect_name/src/static/; # your Django project's static files - amend as required
    }

    # Django static admin
    location /static/admin/ {
        # this changes depending on your python version
        alias /home/snicoper/.virtualenvs/default/lib/python3.4/site-packages/django/contrib/admin/static/admin/;
    }

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_connect_timeout 10;
        proxy_read_timeout 10;
        proxy_pass http://localhost:8001/;
    }

    # what to serve if upstream is not available or crashes
    error_page 500 502 503 504 /templates/50x.html;
}
# Solo Ubuntu
sudo ln -s /etc/nginx/sites-avalaible/proyect_name /etc/nginx/sites-enabled/proyect_name

Si los archivos static no se ven, mirar collectstatic de Django, o modificar location /static/admin/

En Fedora/Centos, mirar Reglas SELinux y si el proyecto esta en el home de un usuario, poner permisos 711 en el directorio del usuario, de lo contrario, mostrara un error 403

Reiniciar nginx

# Ubuntu
sudo service nginx restart

# Fedora/Centos
systemctl restart nginx.service

Supervisor

Ubuntu

sudo apt-get install supervisor
sudo touch /etc/supervisor/conf.d/proyect_name.conf

Añadir en proyect_name.conf

[program:proyect_name]
command=/home/snicoper/projects/python/proyect_name/bin/gunicorn_start.sh
user=snicoper
stdout_logfile=/home/snicoper/projects/python/proyect_name/logs/gunicorn_supervisor.log
redirect_stderr=true
autostart=true
autorestart=true

Crear archivo de log

mkdir /home/snicoper/projects/python/proyect_name/logs
touch /home/snicoper/projects/python/proyect_name/logs/gunicorn_supervisor.log
sudo supervisorctl reread
sudo supervisorctl update

Comandos supervisor

sudo supervisorctl status proyect_name
sudo supervisorctl stop proyect_name
sudo supervisorctl start proyect_name
sudo supervisorctl restart proyect_name

Systemd

Fedora/Centos7 como servicio

sudo vim /etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
After=syslog.target
After=network.target

[Service]
PIDFile=/run/gunicorn/pid
User=snicoper
Group=snicoper
WorkingDirectory=/home/snicoper/www/sitio/bin/
ExecStart=/bin/bash gunicorn_start.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
sudo systemctl start gunicorn.service
sudo systemctl stop gunicorn.service
sudo systemctl restart gunicorn.service
sudo systemctl enable gunicorn.service