Instalación stack Django, apache y PostGIS

De Departamento de Informatica
Saltar a: navegación, buscar

En esta guía se explicará paso a paso sobre cómo levantar un stack de Django + Apache + PostGIS. Además se dejará espacio para fácil instalación de un certificado SSL autofirmado o generado con Let's Encrypt, según se desee.

Contenido

Pasos para Fedora 22

Instalación Django

Primero se instalará Django en su servidor usando el gestor de paquetes por defecto en Fedora 22:

dnf install python-django

Por seguridad de su sistema, se recomienda fuertemente no utilizar pip para la instalación de django, tampoco se recomienda instalar utilizando la versión de desarrollo.

También necesitará un módulo de python para trabajar con Postgresql:

dnf install python-psycopg2

Instalación Postgresql y PostGIS

A continuación se instalará el DBMS que se eligió para esta guía, Postgresql.

Primero proceda a instalar el DBMS y PostGIS junto con algunas librerías adicionales:

dnf install postgresql-server postgresql-contrib postgis

Corremos el setup de postgresql (no necesita ingresar nada, es automático):

postgresql-setup initdb

Ahora dejamos a postgresql habilitado para inicie con el sistema:

systemctl enable postgresql

Y corremos el servicio:

systemctl start postgresql

A pesar de estar instalado postgresql, aún no funcionará, para esto tendrá que editar el archivo /var/lib/pgsql/data/postgresql.conf, buscar la línea que dice

listen_addresses = 'localhost'

Descomente la línea y cambie localhost por un asterisco, de forma de aceptar todo.

Y reiniciamos el servicio:

systemctl restart postgresql


Ahora vienen unas serie de pasos para dejar creada una base de datos geoespacial junto con un usuario para esa base de datos:

Ingresamos al usuario postgres, quien tiene derechos para modificar la base de datos:

su - postgres

Creación de usuario de nombre geodjango, le preguntará por la contraseña que desea asignar:

createuser --pwprompt --encrypted geodjango

Creación de la base de datos (llamada 'geodb') asignada al usuario anteriormente creado:

createdb --encoding=UTF8 --owner=geodjango geodb

Finalmente creamos la extension PostGIS para esa base de datos:

psql geodb -c "create extension postgis;"

Ahora debemos habilitar las conexiones para usuarios y bases de datos, edite el archivo /var/lib/pgsql/data/pg_hba.conf, reemplace la línea de host IPv4 por:

host    all             all             all                     md5

Borre la línea de IPv6 si no la requiere.

Dependiendo de su sistema probablemente quiera agregar distintos campos por cada usuario.

Nuevamente como usuario root reinicie el servicio de postgresql

systemctl restart postgresql

Ahora probaremos que todo funcionó:

su - postgres
psql --user geodjango -h HOST_NAME -l

Donde HOST_NAME es el nombre de su servidor.

Debería entrar a la consola de psql, si es así, la instalación fue exitosa y postgre

Instalación Apache

Para instalar Apache (el servidor web), ejecute como root:

dnf install httpd

Además necesitará una extensión para Django (o python mejor dicho):

dnf install mod_wsgi

Integrando Django y Apache

Esta sección indica como configurar Django y Apache para utilizar apache como servidor web.

Ingrese a la carpeta de configuraciones de apache en: /etc/httpd/conf.d y cree un archivo para su proyecto de la forma: nombre_proyecto.conf, edítelo y copie dentro lo siguiente:

<VirtualHost *:80>
    ServerAdmin [Mail-administrador-web]
    ServerName [Dominio-o-IP-página-web]
    ServerAlias [Alias-página-web]
    DocumentRoot [Archivos-proyecto]

    Alias /media [Archivos-media-proyecto]
    Alias /static [Archivos-static-proyecto]
    <Location "/static/">
        Options -Indexes
    </Location>

    <Directory [Archivos-static-proyecto]>
        Require all granted
    </Directory>

    WSGIDaemonProcess [nombre-proyecto]
    WSGIScriptAlias / [Archivo-wsgi.py-proyecto]

    ErrorLog logs/[nombre-log-de-error].log
    CustomLog logs/[nombre-log-de-acceso].log common
</VirtualHost>

Donde:

  • Mail-administrador-web: email del webmaster.
  • Dominio-o-IP-página-web: www.example.com o una ip 196.76.12.54
  • Alias-página-web: nombre del dominio, ip o un alias del dominio.
  • Archivos-proyecto: donde se encuentre su proyecto Django (generalmente /var/www/)
  • Archivos-media-proyecto: donde se encuentren sus archivos media (generalmente /var/www/proeycto/mediaroot)
  • Archivos-static-proyecto: donde se encuentren sus archivos estáticos (generalmente /var/www/proeycto/staticroot)
  • Archivo-wsgi.py-proyecto: archivo wsgi.py que se encuentra dentro de la carpeta principal de su proyecto (junto con settings.py)
  • nombre-log-de-error y nombre-log-de-acceso: nombre de los logs de httpd, example-error.log, example-access.log

Ahora modificaremos WSGI.py para que pueda funcionar como debe:

Edite el archivo wsgi.py de su proyecto e importe la librería sys, luego ingrese la línea:

sys.path.append('/var/www/PROYECTO/')

Justo antes de "application = ...".

Con esto funcionando, reinicie el servicio de Apache:

systemctl restart httpd

Finalmente deberemos abrir el puerto http en nuestro firewall:

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --reload

Si entra a su dominio deberá ver su proyecto Django.

Si no, puede que se deba a permisos de SElinux, por lo que deberá usar alguna herramienta para solucionarlo como por ejemplo 'sealert'.

En la siguiente sección aprenderá como realizar los pasos anteriores pero usando un certificado SSL.

Certificación SSL

Certificado Autofirmado

Primeramente generamos una llave privada(se puede cambiar 1024, por 2048 o 4096, mientras mayor el número mayor mejor encriptación):

openssl genrsa -des3 -out server.key 1024

Luego, generamos una petición de certificado:

openssl req -new -key server.key -out server.csr

Aunque se piden muchos datos, el más importante (y obligatorio) es el 'Common Name', en donde se ingresa el nombre del dominio de nuestra página.

Posteriormente, firmaremos nuestro certificado ya creado:

openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Finalmente pasamos a editar nuestro virtualhost. Para esta instancia, dejaremos que a nuestra página solo se pueda acceder por https, pero haremos que si alguien intenta acceder por http, sea redirigido a https:

Deberá instalar una extensión adicional:

dnf install mod_ssl
<VirtualHost *:80>
ServerName [Dominio-o-IP-página]
Redirect / https://[Dominio-página-web]/
</VirtualHost>

<VirtualHost *:443>
ServerAdmin [Mail-Administrador-Webpage]
ServerName [Dominio-o-IP-página-web]
ServerAlias [Alias-página-web]
DocumentRoot [Archivos-página-web]

#resto de la configuración

SSLEngine on
SSLCertificateFile [Ubicación-certificados]/server.crt
SSLCertificateKeyFile [Ubicación-certificados]/server.key

</VirtualHost>

[Dominio-página-web] es el dominio de nuestra página (la URL de nuestra página web).

Finalmente agregamos los puertos de https a nuestro firewall y cargamos la configuración nueva:

systemctl restart httpd
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Certificación gratuita Let's Encrypt

Let's Encrypt es una autoridad certificadora gratuita, abierta y automatizada, la cual se encuentra en beta pública. Primeramente, descargaremos el proyecto desde su repositorio git y ejecutaremos cierto script para obtener la versión más actual.

git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help

Desde aqui, en muchos casos utilizar 'letsencrypt-auto' guiará en el proceso de obtener e instalar un certificado de forma interactiva. Pero para asegurarse, podemos hacer este proceso directamente por linea de comando:

./letsencrypt-auto certonly --standalone --email [Mail-Administrador-Webpage] --standalone-supported-challenges tls-sni-01 -d [Dominio-página-web] --agree-tos

[Mail-Administrador-Webpage] equivale al mail del administrador de la página. [Dominio-página-web] es el dominio a certificar (la URL de nuestra página web). El parámetro 'tls-sni-01' indica que utilizaremos el puerto 443.

Puede que sea necesario la instalación de configuración adicional:

dnf install mod_ssl

Posteriormente pasamos a editar nuestro virtualhost. Para esta instancia, dejaremos que a nuestra página solo se pueda acceder por https, pero haremos que si alguien intenta acceder por http, sea redirigido a https:

<VirtualHost *:80>
ServerName [Dominio-o-IP-página]
Redirect / https://[Dominio-página-web]/
</VirtualHost>

<VirtualHost *:443>
ServerAdmin [Mail-Administrador-Webpage]
ServerName [Dominio-o-IP-página-web]
ServerAlias [Alias-página-web]
DocumentRoot [Archivos-página-web]

#resto de la configuración

SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/[Dominio-página-web]/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/[Dominio-página-web]/privkey.pem

</VirtualHost>

[Dominio-página-web] es el dominio de nuestra página (la URL de nuestra página web).

Finalmente agregamos los puertos de https a nuestro firewall y cargamos la configuración nueva:

systemctl restart httpd
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

Cabe recalcar que la cantidad de certificados es limitada, y además estos tienen una duración de 90 días.

Herramientas personales
Espacios de nombres
Variantes
Acciones
Navegación
Herramientas