Skip to content

Instantly share code, notes, and snippets.

@fixmycode
Last active January 26, 2018 15:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fixmycode/85bf4f82fb09081b4cdf0d9aeb5b39db to your computer and use it in GitHub Desktop.
Save fixmycode/85bf4f82fb09081b4cdf0d9aeb5b39db to your computer and use it in GitHub Desktop.
Despliegue de Django en HTTPS

Prefacio

Esta guía asume que tienes una aplicación en Django que opera dentro de un entorno virtual. También se asume que usas Ubuntu u otra distro basada en Debian pero no es requisito.

Requisitos

Sobre SSL

La creación del certificado y tu llave no son parte de esta guía, pero, se espera que estén aquí:

/etc/ssl/mi_certificado.crt
/etc/ssl/mi_llave.key

Instalación

1.- instalar supervisor y nginx

sudo apt-get update
sudo apt-get install -y nginx supervisor

2.- crea un usuario que se llame como tu app, solo servirá para correr la aplicación. al mismo tiempo, definimos el lugar donde estará toda nuestra app, aprovechamos de crear ahí mismo el virtualenv

sudo groupadd mis_apps
sudo useradd -d /opt/mi_app -g mis_apps mi_app
sudo su - mi_app
mkdir run static logs

   virtualenv .venv #python3 -m venv .venv si usarás python3

3.- instalamos gunicorn

source .venv/bin/activate
pip install gunicorn

4.- pon tu aplicación en algún directorio dentro de mi_app, para este ejemplo la llamaremos servicio, si tienes tu app en un repositorio, puedes clonarla a este directorio, de tal forma que la ruta completa hacia tu wsgi.py quede:

/opt/mi_app/servicio/mi_app/wsgi.py
/opt/mi_app/servicio/manage.py #para referencia

5.- es un execelente momento para recolectar archivos estáticos que tu app necesite. en tu settings.py configura:

STATIC_URL='/static/'
STATIC_ROOT=/opt/mi_app/static/

5.1.- y luego ejecuta

./servicio/mi_app/manage.py collectstatic

4.- luego debes salir del usuario mi_app, poner cada archivo en este gist en su lugar y recargar

sudo service nginx restart
sudo supervisorctl reread
sudo supervisorctl update
# este es el archivo de configuración de gunicorn, la ubicación la defines cuando configuremos supervisor
# es importante porque define la ubicación del socket donde se conecta el nginx
import multiprocessing
workers = multiprocessing.cpu_count() * 2 + 1
bind = 'unix:/opt/mi_app/run/gunicorn.sock'
user = 'mi_app'
group = 'mis_apps'
name = 'mi-app-worker'
accesslog = '/opt/mi_app/logs/access.log'
errorlog = '/opt/mi_app/logs/error.log'
loglevel = 'debug'
capture_output = True
# el archivo de configuración de nginx no tiene ninguna extensión en particular
# debes ponerlo en o crear un link simbólico en /etc/nginx/sites-enabled/mi_sitio
upstream app_server {
server unix:/opt/mi_app/run/gunicorn.sock fail_timeout=0;
}
server {
#redirige el tráfico al servidor seguro.
server_name midominio.cl;
listen 80;
return 301 https://midominio.cl$request_uri;
}
server {
# configura el nombre de dominio que tendrá la máquina
server_name midomino.cl;
listen 443 deferred;
ssl on;
ssl_certificate /etc/ssl/mi_certificado.crt;
ssl_certificate_key /etc/ssl/mi_llave.key;
client_max_body_size 4G;
keepalive_timeout 5;
access_log /opt/mi_app/logs/nginx-access.log;
error_log /opt/mi_app/logs/nginx-error.log;
# archivos estáticos se montant en /opt/mi_app/static
# y el STATIC_URL es /static/ asi que:
root /opt/mi_app;
location / {
# intenta ubicar el archivo y si no llama al app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
error_page 500 502 503 504 /500.html;
location = /500.html {
root /opt/mi_app/static;
}
}
; la configuración de supervisor se pone en /etc/supervisord/conf.d/mi_sitio.conf
; notar que la ruta hacia guni_config.py puede ser cualquiera, pero hacer un
; directorio config es una buena idea.
[program:mi_app]
user=mi_app
directory=/opt/mi_app/servicio
command=/opt/mi_app/.venv/bin/gunicorn -c /opt/mi_app/guni_config.py mi_app.wsgi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment