Implementar Django en un entorno de producción por primera vez puede ser una tarea abrumadora. A menudo, los desarrolladores lanzarán una instancia de Linux en la nube para su entorno de producción.
En este tutorial, le mostraremos cómo iniciar Django en producción, utilizando una instancia nueva de Ubuntu.
Asumiremos que toda su edición se realiza en el servidor y que está ejecutando los comandos como root.
Para este tutorial, usamos Ubuntu 18.04.2 LTS
Creando un usuario para el proyecto
Crearemos un nuevo usuario, django, para ejecutar nuestra aplicación. Esto proporciona un ligero beneficio de seguridad.
Para crear el nuevo usuario:
useradd -m djangoLa -m bandera
crea un nuevo directorio de inicio: / home / django.
Configurar el entorno de Python
Lo primero es lo primero: actualice sus listas de paquetes con apt-get update
Ubuntu 18.04 se envía con Python 3.6, pero no se envía con pip, que necesitará para instalar sus dependencias.
apt-get install python3-pipAhora que tenemos pip, creemos un entorno virtual. Los entornos virtuales ayudan a evitar conflictos con los paquetes de Python utilizados por Linux.
pip3 instalar virtualenvcd / home / django
virtualenv env
Ahora que ha creado un Python 3 virtual.6 ambiente en el / home / django / env
carpeta que se puede activar con el siguiente comando: Ahora que tenemos pip, creemos un entorno virtual. Los entornos virtuales ayudan a evitar conflictos con los paquetes de Python utilizados por Linux.
Configurando el proyecto Django
Para este tutorial, crearemos un proyecto Django temporal. Si está implementando su propio código, tendrá que cargarlo en el servidor. Estaremos operando en el directorio de inicio, / home / django.Configurando el proyecto Django
Creemos el proyecto Django:
cd / home / djangoenv de origen / bin / activar
pip instalar django
tutorial de startproject de django-admin
Verifique que todo funcione ejecutando:
tutorial de cdPython administrar.py runserver 0.0.0.0:80
Nuestra instancia de Ubuntu se ejecuta a 178.128.229.34, así que nos conectaremos a http: // 178.128.229.34.Verifique que todo funcione ejecutando:
Probablemente verá algo como esto:
Para solucionar este problema, editaremos / home / django / tutorial / tutorial / settings.py
. Encontrar ALLOWED_HOSTS = []
y configúrelo en:
178.128.229.34 '# reemplace esto con la dirección IP de su servidor
o el nombre de dominio que estás usando para conectarte
]
Ahora volvamos a http: // 178.128.229.34:
Estupendo! Estamos en línea!
Configurando PostgreSQL, la base de datos
De forma predeterminada, Django usa una base de datos SQLite3. Desafortunadamente, SQLite3 no permite escrituras simultáneas. Si su sitio web solo tiene un usuario que edita datos y el resto de los visitantes solo están leyendo páginas, esto podría ser apropiado. Pero si tiene varias personas editando datos al mismo tiempo, es probable que desee utilizar un backend diferente.
Las opciones comunes son PostgreSQL y Mysql. Iremos con PostgreSQL para este tutorial.
Empiece por instalar PostgreSQL:
apt-get install postgresqlLuego inicie psql, un shell de base de datos. De forma predeterminada, solo el usuario de postgres puede conectarse a la base de datos, por lo que primero tendremos que autenticarnos como ese usuario:
su - postgrespsql
A continuación, necesitamos una base de datos y un usuario para acceder a esa base de datos:
crear tutorial de base de datos;crear usuario tutorial_user con contraseña cifrada 'tutorial_password';
conceda todos los privilegios sobre el tutorial de la base de datos a tutorial_user;
Ahora, escriba exit o presione Ctrl-D dos veces: una vez para salir de psql y una vez para cerrar la sesión del shell de postgresuser.
Estupendo! Ahora tenemos nuestra base de datos y usuario configurados. Verifiquemos que podemos iniciar sesión en nuestra base de datos.
Intentaremos abrir un shell de base de datos, esta vez iniciando sesión en la base de datos que creamos con el usuario que creamos:
psql -Ututorial_user -dtutorial -h127.0.0.1 -WCuando se le solicite, ingrese la contraseña que creamos: tutorial_password.
Si ve un shell de base de datos, ha tenido éxito. Si ve algún error, tendrá que volver atrás y averiguar qué está mal.
Conectando Django a la base de datos
Para conectar Django a la base de datos, primero necesitamos instalar el adaptador Python PostgreSQL:
pip instalar psycopg2-binaryEntonces, abramos / home / django / tutorial / tutorial / settings.py
y configurar la conexión.
Encuentre su conexión de base de datos actual; si no lo modificó, podría verse así:
BASES DE DATOS ='defecto':
'MOTOR': 'django.db.backends.sqlite3 ',
'NOMBRE': os.camino.unirse (BASE_DIR, 'db.sqlite3 '),
Para conectarse a PostgreSQL, lo reemplazaremos con lo siguiente:
BASES DE DATOS ='defecto':
'MOTOR': 'django.db.backends.postgresql_psycopg2 ',
'NAME': 'tutorial',
'USUARIO': 'tutorial_user',
'PASSWORD': 'tutorial_password',
'ANFITRIÓN': '127.0.0.1 ',
'PUERTO': '5432',
Probemos la conexión:
cd / home / django / tutorialPython administrar.py runserver 0.0.0.0:80
Debería poder volver a visitar su sitio web (para nosotros en http: // 178.128.229.34 /, pero reemplácelo con su IP o nombre de host).
Si todo va bien, podemos continuar.
Configurando nginx, el servidor web
Cuando corres Python administrar.py runserver
, estás usando el servidor de desarrollo de Django. Esto es excelente para el desarrollo local, pero al igual que con SQLite3, no es realmente adecuado para la producción.
Las opciones comunes para los servidores web de producción son nginx y Apache. Para este tutorial, usaremos nginx.
Instale nginx usando lo siguiente:
apt-get install nginxAhora, si todo ha funcionado bien, nginx debería ejecutarse en el puerto 80. Adelante, visite su sitio web; debería ver:
Genial, entonces nginx está en funcionamiento! A continuación, necesitaremos configurarlo para comunicarse con Django. Abra el archivo de configuración de nginx, ubicado en / etc / nginx / sites-available / default. Reemplacemos el archivo con lo siguiente:
aguas arriba de djangoservidor 127.0.0.1: 8000;
servidor
escucha 80;
localización /
try_files $ uri @send_to_django;
ubicación @send_to_django
proxy_set_header Host $ http_host;
proxy_redirect off;
proxy_pass http: // django;
Pruebe el archivo de configuración ejecutando nginx -t. Si todo está bien, podemos recargar ejecutando nginx -s reload.
Ahora, si visita su sitio, verá lo siguiente:
Siempre que vea esto, significa que nginx no pudo pasar la solicitud al proceso ascendente. Por el momento, es porque está intentando pasar la solicitud a 127.0.0.1: 8000 pero no hay ningún proceso escuchando en esa dirección.
Iniciemos el servidor de desarrollo de Django e intentemos de nuevo:
cd / home / django / tutorialPython administrar.py runserver 127.0.0.1: 8000
y vuelva a visitar su sitio web. Debería ver su aplicación Django.
Montaje de Django en Gunicorn
Recuerde, no queremos usar nuestro servidor de desarrollo Django en producción. En su lugar, usaremos un servidor Web Server Gateway Interface (WSGI) para ejecutar Django. Nginx pasará la solicitud al servidor WSGI, que ejecuta Django.
Las opciones comunes para un servidor WSGI son Gunicorn y uWSGI. Para este tutorial usaremos Gunicorn.
Instalemos Gunicorn:
pip instalar gunicornA continuación, podemos iniciar gunicorn de la siguiente manera:
cd / home / django / tutorialtutorial de gunicorn.wsgi
Ahora debería poder visitar su sitio web y ver que su aplicación se ejecuta correctamente.
Ejecutar Gunicorn como servicio
Hay algunos problemas al ejecutar gunicorn de esta manera:
- Si cerramos la sesión SSH, el proceso de gunicorn se detendrá.
- Si el servidor se reinicia, el proceso de gunicorn no se iniciará.
- El proceso se está ejecutando como root. Si los piratas informáticos encuentran un exploit en el código de nuestra aplicación, podrán ejecutar comandos como root. No queremos esto; pero es por eso que creamos el djangouser!
Para resolver estos problemas, ejecutaremos Gunicorn como un servicio systemd.
cd / home / djangocontenedor mkdir
cd / home / django / bin
toque el servidor de inicio.sh
En el servidor de inicio.sh:
cd / home / djangoenv de origen / bin / activar
tutorial de cd
tutorial de gunicorn.wsgi
Ahora puedes probar el script:
cd / home / django / binservidor de inicio de bash.sh
# visite su sitio web, debería estar funcionando
Ahora creamos el servicio systemd para Gunicorn. Cree / etc / systemd / system / gunicorn.servicio de la siguiente manera:
[Unidad]Descripción = Gunicorn
Después = red.objetivo
[Servicio]
Tipo = simple
Usuario = django
ExecStart = / inicio / django / bin / start-server.sh
Reiniciar = en caso de falla
[Instalar en pc]
WantedBy = multiusuario.objetivo
Ahora, habilitemos el servicio e inícielo
systemctl habilitar gunicornsystemctl start gunicorn
Debería poder ver su sitio web en este momento.
Podemos apagar gunicorn de la siguiente manera:
systemctl detener gunicornY debería ver un 502 Bad Gateway.
Finalmente, revisemos el ciclo de arranque:
systemctl start gunicornreinicie ahora
Cuando su máquina vuelva a estar en línea, debería ver que su sitio web está activo.
Archivos estáticos
Si visita el panel de administración de Django en su sitio web en / admin / (para nosotros, es http: // 178.128.229.34 / admin /), notará que los archivos estáticos no se cargan correctamente.
Necesitaremos crear una nueva carpeta para archivos estáticos:
cd / home / djangomkdir estático
Luego, le decimos a Django que es donde debe colocar los archivos estáticos editando / home / django / tutorial / tutorial / settings.py y agregando:
RAÍZ_ESTÁTICA = '/ inicio / django / static /'Ahora podemos recopilar los archivos estáticos:
cd / home / djangoenv de origen / bin / activar
tutorial de cd
Python administrar.Py Collectstatic
Finalmente, necesitamos decirle a nginx que sirva esos archivos estáticos.
Abramos / etc / nginx / sites-available / default y agreguemos lo siguiente directamente sobre su ubicación / bloque:
location / static /root / home / django;
try_files $ uri = 404;
El archivo completo ahora debería verse así:
aguas arriba de djangoservidor 127.0.0.1: 8000;
servidor
escucha 80;
location / static /
root / home / django;
try_files $ uri = 404;
localización /
try_files $ uri @send_to_django;
ubicación @send_to_django
proxy_set_header Host $ http_host;
proxy_redirect off;
proxy_pass http: // django;
Podemos recargar el archivo usando nginx -s reload
Y voilá! Tus archivos estáticos ahora funcionarán completamente.
Conclusión
En este punto, su aplicación Django está funcionando correctamente. Si tiene algunos requisitos especiales, es posible que deba configurar una caché como Redis o una cola de mensajes como Rabbit MQ. Es posible que también desee configurar la implementación continua, ya que el procedimiento de implementación puede llevar un tiempo.
Otro paso importante es tomar los pasos apropiados para asegurar su máquina Ubuntu. De lo contrario, es posible que su servidor no funcione correctamente!
Buena suerte!