A través de este tutorial vamos a instalar y configurar nuestro entorno de producción para ejecutar nuestra aplicación django que tenemos en un repositorio GITHUB y ejecutaremos con NGINX, GUNICORN y SUPERVISOR.

Nos abstraemos de la configuracion Postgresql, ya que en este caso asumimos que a través de la settings de producción, apuntamos a nuestro sevidor BBDD. En nuestro caso, apuntaríamos a nuestro servidor en elephantsql.

Preparación del sistema (Ubuntu 18.04)

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install python3-pip
  • pip3 install virtualenv
  • mkdir .virtualenvs
  • cd .virtualenvs
  • virtualenv -p python3 nombre_env
  • source nombre_env/bin/activate

Instalación genérica del Aplicativo

  • source /root/.virtualenvs/nombre_env/bin/activate
  • cd /var/www/
  • sudo git clone https://github.com/usuario/nombre_repositorio.git
  • cd nombre_repositorio
  • pip3 install -r requirements.txt
  • python3 manage.py migrate  (migrate_schemas si utilizamos django-multitenant)

Instalación y configuración NGINX

  • sudo apt-get install nginx
  • cd /etc/nginx/sites-available
  • sudo touch sitio.com
  • sudo nano sitio.com
  • Copiar y pegar
      server {
      charset UTF-8;
      listen         80;
      server_name    sitio.com *.csitio.com;
      root           /var/www/nombre_repositorio/nombre_app;
      access_log /var/log/nombre_app/nginx/access.log;
      error_log /var/log/nombre_app/nginx/error.log;
      client_max_body_size 50M;
      
      location /static {
      	alias /var/www/nombre_repositorio/static;
      }
      location /media {
      	alias /var/www/nombre_repositorio/media;
      }
      location /{
      	proxy_pass_header Server;
      	proxy_set_header Host $http_host;
      	proxy_redirect off;
      	proxy_read_timeout 300;
      	uwsgi_read_timeout 3600;
      	proxy_connect_timeout 300;
      	proxy_pass http://127.0.0.1:8000;
      	proxy_set_header X-Forwarder-Host $server_name;
      	proxy_set_header X-Real-IP $remote_addr;
      	add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
      	}
         }
    
  • cd sites-enabled
  • sudo ln -s ../sites-available/sitio.com

Creamos directorio de logs

  • cd /var/log
  • sudo mkdir app
  • cd app
  • sudo mkdir nginx

Vamos a borrar el link de default para tener solo la app en elpuerto 80

  • cd /etc/nginx
  • cd sites-enabled
  • ls -la sudo rm default

Comprobar fichero de configuración

  • sudo nginx -t

Reiniciar nginx

  • sudo service nginx restart  

Instalar el proxy gunicorn

  • source /root/.virtualenvs/nombre_app/bin/activate
  • pip3 install gunicorn
  • cd /var/www
  • sudo touch gunicorn.py
  • sudo nano gunicorn.py
  • Copiar y pegar
 import multiprocessing
 num_workers = multiprocessing.cpu_count()*2+1
 command = '/root/.virtualenvs/nombre_app/bin/gunicorn'
 pythonpath = 'var/www/nombre_repositorio'
 bind ='0.0.0.0:8000'
 workers = num_workers
 timeout = 120

Instalar supervisor

  • sudo apt-get install supervisor
  • cd /etc/supervisor
  • cd conf.d
  • sudo touch nombre_app.conf
  • sudo nano nombr_app.conf
[program:nombre_app]
command = /root/.virtualenvs/nombre_app/bin/gunicorn --log-file=- -c /var/www/gunicorn.py nombre_repositorio.nombre_app.wsgi
stdout_logfile = /var/log/nombre_app/gunicorn/access.log
stderr_logfile = /var/log/nombre_app/gunicorn/error.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8
  • cd /var/log/nombre_app
  • mkdir gunicorn
  • sudo supervisorctl reload