GNU/Linux >> Tutoriales Linux >  >> Linux

Configure Django con Postgres, Nginx y Gunicorn en Ubuntu 18.04

Django es un marco de aplicación web basado en python versátil, potente, eficiente y en constante evolución que puede utilizar para poner en marcha su aplicación web. Es un marco web popular y generalmente viene con un servidor de desarrollo que se usa para probar su código localmente. Si tiene la intención de llevar sus aplicaciones a producción, necesitará una configuración de servidor web más robusta y segura.

En esta guía, lo llevaremos a través del arte de implementar y configurar Django profesionalmente de una manera más eficiente y resistente. Instalaremos y configuraremos la base de datos PostgreSQL en lugar de la base de datos SQLite e integraremos el servidor de aplicaciones Gunicorn que se conectará con las aplicaciones. Más tarde, procederemos a configurar el servidor web NGINX que proporcionará un canal de proxy inverso al servidor Gunicorn, brindándonos así los componentes de rendimiento y seguridad necesarios para atender nuestras aplicaciones.

Requisitos

Antes de comenzar, realicemos una verificación de vuelo rápida y asegurémonos de tener lo siguiente

  • Una nueva instancia de servidor Ubuntu 18.04
  • Un usuario no root con privilegios sudo. En esta guía usaremos james
  • Acceso SSH al servidor

Objetivos

Aquí hay un recorrido rápido de lo que pretendemos lograr. Vamos a instalar Django dentro de un entorno virtual. Esto permite que los proyectos se manejen por separado del entorno anfitrión. Luego nos embarcaremos en la instalación y configuración del servidor de aplicaciones Gunicorn, que conectará la aplicación y traducirá las solicitudes en el protocolo HTTP a llamadas de Python que nuestra aplicación puede procesar. Finalmente, configuraremos Nginx, que es un servidor web de alto rendimiento con una gran cantidad de componentes de seguridad que aumentarán la seguridad de nuestras aplicaciones.

Cómo empezar

Para comenzar, comenzaremos actualizando nuestros repositorios de Ubuntu

$ sudo apt-get update

A continuación, descargaremos e instalaremos los paquetes de software necesarios para todas las aplicaciones que vamos a configurar. Estos incluirán el administrador de paquetes pip, PostgreSQL y Nginx.
Si está ejecutando Django con Python3, la sintaxis será

$ sudo apt-get install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx

Si su sistema ejecuta Python2, el comando será:

$ sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib nginx

Salida de muestra

El comando instalará el administrador de paquetes pip, todos los archivos de desarrollo de Python necesarios para construir Gunicorn, el servidor web Nginx, la base de datos de Postgres y las bibliotecas cruciales necesarias para interactuar con el motor de la base de datos.

Después de la instalación exitosa de todos los paquetes de software requeridos, ahora es el momento de crear una base de datos y un usuario para la aplicación web Django

Creación de base de datos PostgreSQL y usuario de base de datos

Ahora entremos y creemos una base de datos y un usuario para la aplicación Django
Inicie sesión en Postgres y ejecute el comando

$ sudo -u postgres psql

Accederá al indicador de Postgres como se ve en la salida

Cree una base de datos para su proyecto. En este caso, el nombre de la base de datos es "proyecto".

postgres=# CREATE DATABASE project;

Salida de muestra

¡NOTA! Todos los comandos en PostgreSQL deben terminar con un punto y coma.

Después de la creación exitosa de la base de datos, cree un usuario para el proyecto Django y asegúrese de asignar una contraseña segura. En este caso, el usuario es projectuser

Reemplace el atributo 'contraseña' con su propia contraseña segura.

postgres=# CREATE USER projectuser WITH PASSWORD 'password';

Salida de muestra

Para confirmar los parámetros de configuración de Django para la conectividad de la base de datos, vamos a:

  1. Establezca la codificación predeterminada en UTF-8
  2. Establecer el esquema de aislamiento en el valor de "lectura confirmada"
  3. Establecer la zona horaria en UTC

Ejecute los siguientes comandos para cumplir con los requisitos de configuración


postgres=# ALTER ROLE projectuser SET client_encoding TO 'utf8';
postgres=# ALTER ROLE projectuser SET default_transaction_isolation TO 'read committed';
postgres=# ALTER ROLE projectuser SET timezone TO 'UTC';

Ahora concedamos acceso a la base de datos a nuestro usuario recién creado

postgres=# GRANT ALL PRIVILEGES ON DATABASE project TO projectuser;

Salida de muestra

Ahora puede salir del entorno de Postgres.

postgres=# \q

Creación de un entorno virtual Python para su proyecto Django

Para facilitar la administración de nuestra aplicación, vamos a instalar los requisitos previos necesarios de Python en un entorno virtual.
Pero primero, instalemos el entorno virtual
Si su sistema ejecuta Python3, actualice pip ejecutando

$ sudo -H pip3  install --upgrade pip

Para un sistema que se ejecuta en Python2 ejecutar

$ sudo -H pip install --upgrade pip

Salida de muestra

A partir de entonces, instale el entorno virtual usando pip

$ sudo -H pip install virtualenv

Salida de muestra

Con nuestro entorno virtual en su lugar, ahora vamos a crearlo y movernos hacia él


$ mkdir ~/project
$ cd ~/project

Ahora cree un entorno virtual de Python

virtualenv projectenv

Salida de muestra

Esto crea un directorio llamado projectenv dentro del directorio del proyecto.

Antes de instalar los requisitos de Python, active el entorno virtual

$ source projectenv/bin/activate

Salida de muestra

Observe cómo cambia el aviso a (projectenv)james@ubuntu: ~/project$

Con el entorno virtual activo, instalemos el adaptador Gunicorn, Django y Psycopg2 Postgres usando pip.

$ pip install django gunicorn psycopg2-binary

Salida de muestra

Crear y configurar un nuevo proyecto Django

En este punto, le indicaremos a Django que instale los archivos del proyecto en el directorio del proyecto que ya creamos. Se creará un directorio de segundo nivel junto con un script de administración.
Para lograr esto, ejecute el siguiente comando.

$ django-admin.py startproject project ~/project 

Nuestro directorio de proyectos, en este caso, ~/project debe tener los siguientes contenidos


manage.py      -  Django’s Python management script
project             - directory containing Django’s project package
projectenv      - Virtual environment directory that was earlier created

 

Salida de muestra

Ajuste de la configuración de los archivos del proyecto

Vamos a abrir el archivo de configuración

vim ~/project/settings.py

Desplácese hacia abajo y esté atento al atributo 'HOSTS PERMITIDOS'. Dentro de los corchetes, especifique la dirección IP del servidor y agregue el atributo 'localhost'.

Salida de muestra

A continuación, ubique la sección 'BASES DE DATOS'. Ajuste la configuración para que se ajuste a la información de la base de datos de PostgreSQL. Esto incluye el nombre de la base de datos, el usuario y la contraseña del usuario.

Salida de muestra

A continuación, desplácese hacia abajo y especifique la ubicación de los archivos estáticos. Esto es importante para que Nginx pueda manejar sin problemas las solicitudes de estos elementos. Desde el fragmento a continuación, los archivos estáticos se colocarán en un directorio llamado 'estático'

Guardar y Salir.

Completando la configuración inicial del proyecto

Migremos ahora el esquema de la base de datos a nuestra base de datos PostgreSQL


~/project/manage.py makemigrations

Salida de muestra


~/project/manage.py migrate
 

Salida de muestra


A continuación, vamos a crear un superusuario para el proyecto Django ejecutando el siguiente comando

~/project/manage.py createsuperuser 

Se le pedirá un nombre de usuario, correo electrónico y contraseña como se muestra a continuación

Salida de muestra

Tras la creación exitosa del superusuario, ahora podemos recopilar contenido estático en la ubicación del directorio

~/project/manage.py collectstatic

Salida de muestra

Estos archivos estáticos se colocarán en el ‘static’ directorio en la carpeta del proyecto.

Para probar el servidor de desarrollo, vamos a permitir un puerto, en este caso, el puerto 8000 que se utilizará para acceder a la aplicación a través de un navegador web.

Para abrir el puerto ejecutaremos

sudo ufw allow 8000

Finalmente, inicie el servidor de desarrollo de Django en el entorno virtual ejecutando

~/project/manage.py runserver 0.0.0.0:8000

Abra su navegador web y visite la dirección de su servidor

En este caso, la dirección de nuestro servidor es

https://38.76.11.180/

Debería poder ver la siguiente página de índice de Django

Salida de muestra

Agreguemos ahora /admin al final de la URL para acceder a la página de inicio de sesión

https://38.76.11.180/admin

Salida de muestra

Proporcione las credenciales que proporcionó al crear la cuenta de superusuario y presione 'Iniciar sesión'

Esto nos llevará al panel de administración de Django

Salida de muestra

¡Excelente! Ahora que hemos confirmado que Django está funcionando, presionemos CTRL + C en la terminal para salir de la aplicación

Confirmación de la capacidad de Gunicorn para probar el Proyecto

Antes de salir del entorno virtual, verifiquemos que nuestro servidor de aplicaciones Gunicorn pueda servir Django.
Mientras aún estamos en el directorio del proyecto, vamos a cargar el módulo WSGI

gunicorn --bind 0.0.0.0:8000 project.wsgi

Esto activa Gunicorn en la misma interfaz y puerto en el que se ejecutaba el servidor Django. Puede regresar y verificar que la aplicación Django se esté ejecutando en el navegador web.

Una vez hecho esto, presione CTRL + C para detener la aplicación y ejecute el comando de desactivación para salir del entorno virtual.

Habiendo probado que el servidor de aplicaciones Gunicorn puede servir nuestra aplicación Django, es hora de implementar una vía más robusta para iniciar y detener el servidor de aplicaciones.
Vamos a crear un archivo de servicio systemd con Gunicorn usando el siguiente comando

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

Comenzando con la sección [Unidad], pegue el siguiente contenido


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

Esta sección especifica dependencias y metadatos

A continuación, cree el [service] sección.

En esta sección, especificaremos el usuario y el grupo bajo el cual se debe ejecutar el proceso. En este caso, el usuario es root y el grupo es www-data. El grupo se especifica como www-data para que Nginx pueda comunicarse sin problemas con Gunicorn.

A continuación, se indicará la ruta completa al ejecutable de Gunicorn. Dado que Nginx está instalado en el mismo servidor, lo vincularemos a un socket de Unix.

Pegue el siguiente contenido


[Service]
User=james
Group=www-data
WorkingDirectory=/home/james/project
ExecStart=/home/james/project/projectenv/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/james/project/project.sock project.wsgi:application

Finalmente, cree la sección [Instalar] y agregue las siguientes líneas


[Install]
WantedBy=multi-user.target

¡Excelente! Ahora nuestro archivo de servicio systemd está completo.

Guarde y cierre el editor de texto. Reinicie el servicio Gunicorn y habilítelo para que se inicie en el arranque


$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn

Para verificar el estado de ejecución de gunicorn

$ systemctl status gunicorn

Salida de muestra

Verificar la presencia del archivo Gunicorn Socket

Ahora que hemos verificado que Nginx está funcionando, verifiquemos la existencia del archivo project.sock en nuestro directorio de proyectos

$ ls -l /home/james/project

Salida de muestra

NOTA:

Si falta el archivo project.sock, esto es un indicador de que gunicorn no pudo iniciarse correctamente.
Además, puede verificar los registros de gunicorn ejecutando el siguiente comando

$ sudo journalctl -u gunicorn

Hay varias razones por las que Nginx no pudo haber creado el archivo project.sock. Algunos incluyen

  1. Los archivos de proyecto son propiedad del usuario root en lugar del usuario sudo
  2. El directorio de trabajo dentro de /etc/systemd/system/gunicorn.service no apunta al directorio del proyecto.
  3. Configuraciones incorrectas en la directiva ExecStart

Si todas las configuraciones están bien, entonces no debería recibir ningún error después de ejecutar

$ sudo journalctl -u gunicorn

Una vez que realice cambios en /etc/systemd/system/gunicorn.service archivo, asegúrese de volver a cargar el servicio daemon para que los cambios surtan efecto


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Configuración de Nginx para dirigir el tráfico a Gunicorn

La última fase de esta guía es configurar el servidor web Nginx para canalizar el tráfico web al servicio Gunicorn

Crearemos y abriremos un nuevo bloque de servidor en sites-available directorio

$ sudo vim /etc/nginx/sites-available/project

Comience especificando que este bloque debe escuchar el puerto 80 y debe responder a la dirección IP del servidor.


server {
    listen 80;
    server_name server_domain_or_IP;
}

 

A continuación, le indicaremos a Nginx que ignore cualquier problema con la ubicación del favicon. Además, le indicaremos dónde ubicar los activos estáticos recopilados en ~/project/static directorio


location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/james/project;
    }

Por último, crearemos una ubicación de bloque / { } que coincidirá con el resto de las solicitudes.
Dentro de esta ubicación, definiremos el archivo proxy_params y luego dirigiremos el tráfico al socket creado por el proceso Gunicorn


location / {
        include proxy_params;
        proxy_pass https://unix:/home/james/project/project.sock;
    }
 

El archivo de configuración final debería verse así

Guarde y salga del archivo de configuración

Habilitemos el archivo vinculándolo al directorio de sitios habilitados

$ sudo ln -s /etc/nginx/sites-available/project /etc/nginx/sites-enabled

A continuación, probemos nuestra configuración en busca de errores

$ sudo nginx -t

Si todo salió bien, el resultado debería ser como se muestra a continuación

Después de probar la configuración de Nginx

$ sudo systemctl restart nginx

Ahora que ya no necesitamos acceso al servidor de desarrollo en el puerto 8000, eliminemos la regla en el firewall.

$ sudo ufw delete allow 8000

Permitamos también el puerto 80

$ sudo ufw allow 'Nginx Full'

Ahora debería poder ir al dominio o dirección IP de su servidor para ver su aplicación sin especificar el puerto 8000

Consejos problemáticos

1. Servidor que muestra la página Nginx predeterminada

Si Nginx muestra la página predeterminada en lugar de enviar un proxy a la aplicación Django, debe verificar el /etc/nginx/sites-available/project archivo y asegúrese de que la IP de su servidor o el nombre de dominio estén correctamente indicados. La página predeterminada implica que Nginx no pudo hacer coincidir su solicitud y, en su lugar, recurrió a /etc/nginx/sites-available/default

2. 502 Error de puerta de enlace incorrecta en lugar de la aplicación Django

Un error 502 es una indicación de que el servidor web Nginx no pudo enviar la solicitud con éxito. Para solucionar el problema con precisión, consulte los registros en el archivo de registro de errores como se muestra y esto podría darle una pista de lo que podría estar mal.

$  sudo tail -F /var/log/nginx/error.log

3. “No se pudo conectar al servidor” Conexión rechazada

Un error que puede encontrar al intentar acceder a ciertos componentes en su navegador web es

OperationalError at /admin/login/
could not connect to server: Connection refused
    Is the server running on host "localhost" (127.0.0.1) and accepting
    TCP/IP connections on port 5432?

Esto muestra que la aplicación Django no puede conectarse a la base de datos de Postgres
Asegúrese de que Postgres se está ejecutando ejecutando

$ sudo systemctl status postgresql

Si no se está ejecutando, inícielo y habilítelo para que se inicie en el arranque


$ sudo systemctl start postgresql
$ sudo systemctl enable postgresql

Si aún tiene problemas, asegúrese de que la configuración de la base de datos en
~/myproject/myproject/settings.py son correctos.

Para obtener más información sobre la solución de problemas, examine los siguientes registros


Nginx process logs                 sudo journalctl -u nginx

Nginx access logs                    sudo tail -f  /var/log/nginx/access.log

Nginx error logs	          sudo less /var/log/nginx/error.log


Gunicorn Application logs     sudo journalctl -u gunicorn

A medida que realiza cambios en los archivos de configuración, asegúrese de reiniciarlos para que los cambios surtan efecto.

Si decide realizar cambios en el archivo de servicio systemd de gunicorn, asegúrese de volver a cargar el daemon y reiniciar gunicorn


$ sudo systemctl daemon-reload
$ sudo systemctl restart gunicorn

Cuando realice cambios en la configuración del bloque del servidor Nginx, pruebe la configuración

$ sudo nginx -t && sudo systemctl restart nginx

Conclusión

Gracias por tomarse el tiempo en este artículo. En este artículo, configuramos un proyecto Django en un entorno virtual y configuramos Gunicorn para traducir las solicitudes de los clientes y Nginx para el tráfico proxy a nuestra aplicación Django.


Linux
  1. Nginx con libmodsecurity y OWASP ModSecurity Core Rule Set en Ubuntu 16.04

  2. Instale Django CMS en Ubuntu 12.04 con MariaDB, Gunicorn y Nginx

  3. Instalar WordPress con Varnish y Nginx en Ubuntu

  4. Filtre y optimice las solicitudes de archivos estáticos con NGINX en Ubuntu 18.04

  5. Cómo instalar Node.js con NVM y Nginx en Ubuntu 22.04

Cómo configurar Nginx con soporte HTTP/2 en Ubuntu 18.04

Configure Django con Postgres, Nginx y Gunicorn en Ubuntu 18.04

Cómo configurar un servidor Seafile con Nginx en Ubuntu 18.04

Cómo configurar Tomcat con Nginx como proxy inverso en Ubuntu 18.04

Instale y configure Varnish Cache con Nginx Web Server en Ubuntu 18.04

Cómo instalar y configurar una VPN con OpenVPN en Ubuntu 18.04