Diferència entre revisions de la pàgina «WoSeBerry - Manual técnico»

De Wiket
Salta a la navegació Salta a la cerca
Línia 443: Línia 443:
 
=== Usuario de chequeo ===
 
=== Usuario de chequeo ===
 
Por tal de que HAProxy sea capaz de comprobar que nodo MariaDB está operativo y cual está caído, deberemos crear un usuario sin contraseña. HAProxy utilizará este usuario para establecer una conexión y así mantener el nodo operativo. Para crear este usuario entraremos en la consola de MySQL en cualquiera de los nodos, como por ejemplo la BERRY-04:
 
Por tal de que HAProxy sea capaz de comprobar que nodo MariaDB está operativo y cual está caído, deberemos crear un usuario sin contraseña. HAProxy utilizará este usuario para establecer una conexión y así mantener el nodo operativo. Para crear este usuario entraremos en la consola de MySQL en cualquiera de los nodos, como por ejemplo la BERRY-04:
  <b>pi@BERRY-04:~$ mysql -u pi -p
+
  <b>pi@BERRY-04:~$</b> mysql -u pi -p
  
 
Una vez hayamos entrado en la consola, crearemos el usuario ejecutando el siguiente comando:
 
Una vez hayamos entrado en la consola, crearemos el usuario ejecutando el siguiente comando:

Revisió del 07:26, 17 maig 2018

Manual de instalación y configuración.

$ comando

<p style="color: red">Avisos en color rojo</p>

Configuración de las Raspberry Pi

Instalación del sistema operativo

Todas las Raspberry Pi de nuestro proyecto cuentan con el sistema operativo Raspbian. Este sistema es la adaptación de la distribución Debian adaptada al hardware de una Raspberry. A excepción del resto de Raspberry, la Raspberry con función de firewall (BERRY-01) llevará instalada la versión con interfaz gráfica.

Una vez instalado el sistema operativo Raspbian en cada una de las Raspberry, procederemos a la configuración básica con la ejecución del siguiente comando:

$ sudo raspi-config
Opciones de configuración al ejecutar el comando raspi-config

Asignación del direccionamiento IP

Dado que el proyecto está montado bajo una LAN, se creó una red independiente con IPs de clase privada de tipo C. Para configurar la IP estática en las Raspberry deberemos editar el siguiente fichero:

$ sudo nano /etc/dhcpcd.conf

En éste asignaremos el direccionamiento correspondiente a cada Raspberry:

Raspberry 1:

  • Hostname: BERRY-01
  • Software: HAProxy y UFW
  • IP (eth0): 192.168.30.254/24
  • IP (eth1): 192.168.3.123/24
  • DNS: 192.168.30.254 10.27.100.1

Raspberry 2:

  • Hostname: BERRY-02
  • Software: WordPress
  • IP (eth0): 192.168.30.2/24
  • DNS: 192.168.30.254

Raspberry 3:

  • Hostname: BERRY-03
  • Software: WordPress
  • IP (eth0): 192.168.30.3/24
  • DNS: 192.168.30.254

Raspberry 4:

  • Hostname: BERRY-04
  • Software: MariaDB y Galera Cluster
  • IP (eth0): 192.168.30.4/24
  • DNS: 192.168.30.254

Raspberry 5:

  • Hostname: BERRY-05
  • Software: MariaDB y Galera Cluster
  • IP (eth0): 192.168.30.5/24
  • DNS: 192.168.30.254

Raspberry 6:

  • Hostname: BERRY-06
  • Software: MariaDB y Galera Cluster
  • IP (eth0): 192.168.30.6/24
  • DNS: 192.168.30.254


Configuración básica para la Raspberry firewall

Dado que todo el escenario estará montado bajo una LAN, deberemos configurar en la Raspberry con función de firewall (BERRY-01) aspectos como:

  • Servidor DNS: Nos proporcionará la asignación de un dominio para la tienda online.
  • Enrutamiento: Permitirá la circulación de tráfico.
  • Enmascaramiento: Permitirá enmascarar el tráfico de la red LAN con la IP de la interfaz "eth1".

Servidor DNS

Para configurar un servidor DNS en Raspbian necesitaremos instalar el paquete "bind9", para ello ejecutaremos el siguiente comando:

pi@BERRY-01:~$ sudo apt install bind9

Una vez instalado, realizaremos una copia de seguridad de los archivos de configuración. De esta manera, en caso de tener un error podremos restaurar la configuración por defecto:

pi@BERRY-01:~$ sudo cp /etc/bind/named.conf.local /etc/bind/named.conf.local.bak
pi@BERRY-01:~$ sudo cp /etc/bind/db.local /etc/bind/db.woseberry

Seguidamente editaremos el archivo /etc/bind/named.conf.local para crear la zona directa e indicar cual es el archivo que contiene su configuración:

pi@BERRY-01:~$ sudo nano /etc/bind/named.conf.local
zone "woseberry.tk" {
    type master;
    file "/etc/bind/db.woseberry";
};

Por último, crearemos la zona directa editando el fichero /etc/bind/db.woseberry

pi@BERRY-01:~$ sudo nano /etc/bind/db.woseberry
;
; BIND reverse data file for local loopback interface
;
$TTL    604800
@           IN  SOA     woseberry.tk. root.woseberry.tk. (
                  2     ; Serial
             604800     ; Refresh
              86400     ; Retry
            2419200     ; Expire
             604800 )   ; Negative Cache TTL
;
@	    IN	NS	woseberry.tk
@	    IN	A	192.168.30.123
BERRY-01    IN	A	192.168.30.254
BERRY-02    IN	A	192.168.30.2
BERRY-03    IN	A	192.168.30.3
BERRY-04    IN	A	192.168.30.4
BERRY-05    IN	A	192.168.30.5
BERRY-06    IN	A	192.168.30.6

Enrutamiento y enmascaramiento

Dado que la BERRY-01 es la encargada de dar acceso a Internet a la LAN, es primordial activar la directiva de enrutamiento además de enmascarar las IP de la LAN por la IP de la interfaz eth1. Para ello, editaremos el archivo /etc/rc.local con la finalidad de que dichas directivas se ejecuten en el inicio del sistema.

pi@BERRY-01:~$ sudo nano /etc/rc.local
…

# Activar el enrutamiento
echo 1 > /proc/sys/net/ipv4/ip_forward

# Enmascarar el tráfico de la LAN con la IP de la interfaz que nos proporciona salida a Internet
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o eth1 -j MASQUERADE

exit 0


Instalación y configuración WordPress

Ahora que tenemos salida a Internet desde la LAN procederemos a realizar la instalación del los servidores de base de datos y los gestores de contenido WordPress.

Instalación servidor base de datos MySQL

Empezaremos con la instalación de MySQL Server en las BERRY-04 y BERRY-05, las cuales son las encargadas de almacenas todos los datos que se generarán en la tienda virtual. Para ello ejecutaremos el siguiente comando en ambas Raspberry:

pi@BERRY-04:~$ sudo apt install mysql-server mysql-client phpmyadmin
pi@BERRY-05:~$ sudo apt install mysql-server mysql-client phpmyadmin
pi@BERRY-06:~$ sudo apt install mysql-server mysql-client phpmyadmin

Finalizada la instalación, generaremos un usuario llamado pi que tendrá todos los privilegios en cualquier base de datos y desde cualquier máquina. Realizaremos la siguiente operación en las tres Raspberry:

pi@BERRY-04:~$ sudo su
root@BERRY-04:/home/pi# mysql -u root 
MariaDB [(none)]> CREATE USER 'pi'@'%' IDENTIFIED BY 'woseberry';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'pi'@'%';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

Aprovechando que estamos gestionando las bases de datos y los usuarios, crearemos una base de datos llamada wordpress y un usuario con el mismo nombre con permisos sobre esa base de datos.

MariaDB [(none)]> CREATE DATABASE wordpress;
MariaDB [(none)]> GRANT ALL ON wordpress.* TO 'wordpress'@'%' IDENTIFIED BY 'woseberry';
MariaDB [(none)]> FLUSH PRIVILEGES;
MariaDB [(none)]> exit;

A continuación modificamos la dirección IP por defecto del archivo 50-server.cnf y en la línea bind-address ponemos la IP 0.0.0.0 para que escuche peticiones provinientes de cualquier dirección IP.

pi@BERRY-04:~$ sudo nano /etc/mysql/mariadb-conf.d/50-server.cnf
[mysqld]
bind-address = 0.0.0.0
pi@BERRY-04:~$ sudo service mysql restart
pi@BERRY-05:~$ sudo nano /etc/mysql/mariadb-conf.d/50-server.cnf
[mysqld]
bind-address = 0.0.0.0
pi@BERRY-05:~$ sudo service mysql restart
pi@BERRY-06:~$ sudo nano /etc/mysql/mariadb-conf.d/50-server.cnf
[mysqld]
bind-address = 0.0.0.0
pi@BERRY-06:~$ sudo service mysql restart

Instalación servidor web apache

Con los servidores de base de datos ya en marcha en las BERRY-04 y BERRY-05, procederemos a la instalación y de los servidores web en las BERRY-02 y BERRY-03. Para que WordPress funcione correctamente, necesitamos instalar los siguientes paquetes:

pi@BERRY-02:~$ sudo apt-get install apache2 php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-gd php7.0-imap php7.0-mcrypt php7.0-recode php7.0-tidy php7.0-xmlrpc
pi@BERRY-03:~$ sudo apt-get install apache2 php7.0 libapache2-mod-php7.0 php7.0-mysql php7.0-curl php7.0-gd php7.0-imap php7.0-mcrypt php7.0-recode php7.0-tidy php7.0-xmlrpc

Descarga, instalación y configuración Wordpress

En primer lugar descargamos wordpress de su página oficial.

pi@BERRY-02:~$ wget https://es.wordpress.org/wordpress-4.9.5-es_ES.zip
pi@BERRY-03:~$ wget https://es.wordpress.org/wordpress-4.9.5-es_ES.zip


Descomprimimos Wordpress y copiamos el contenido de la carpeta en el directorio /var/www/html

pi@BERRY-02:~$ unzip wordpress-4.9.5-es_ES.zip
pi@BERRY-02:~$ sudo cp -R wordpress/* /var/www/html
pi@BERRY-03:~$ unzip wordpress-4.9.5-es_ES.zip
pi@BERRY-03:~$ sudo cp -R wordpress/* /var/www/html


Ya que hemos copiado el contenido de la carpeta wordpress directamente en el directorio por defecto del servidor web, eliminamos la página de ejemplo de Apache2.

pi@BERRY-02:~$ sudo rm /var/www/html/index.html
pi@BERRY-03:~$ sudo rm /var/www/html/index.html


Copiamos el archivo de configuración de ejemplo de Wordpress.

pi@BERRY-02:~$ sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php
pi@BERRY-03:~$ sudo cp /var/www/html/wp-config-sample.php /var/www/html/wp-config.php


Cambiamos el propietario y los permisos a los archivos de Wordpress.

pi@BERRY-02:~$ sudo chown -R www-data:www-data /var/www/html/
pi@BERRY-02:~$ sudo chmod -R 755 /var/www/html/
pi@BERRY-03:~$ sudo chown -R www-data:www-data /var/www/html/
pi@BERRY-03:~$ sudo chmod -R 755 /var/www/html/


Activamos los módulos correspondientes de Apache2 para que Wordpress funcione correctamente.

pi@BERRY-02:~$ sudo a2enmod headers
pi@BERRY-02:~$ sudo a2enmod rewrite
pi@BERRY-03:~$ sudo a2enmod headers
pi@BERRY-03:~$ sudo a2enmod rewrite


Reiniciar Apache2 para aplicar los cambios.

pi@BERRY-02:~$ sudo service apache2 restart
pi@BERRY-03:~$ sudo service apache2 restart


Modificamos el archivo de configuración wp-config.php para vincularlo con la base de datos correspondiente.

pi@BERRY-02:~$ sudo nano /var/www/html/wp-config.php
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpress');

/** MySQL database password */
define('DB_PASSWORD', 'woseberry');

/** MySQL hostname */
define('DB_HOST', '192.168.30.2');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');


pi@BERRY-03:~$ sudo nano /var/www/html/wp-config.php
// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');

/** MySQL database username */
define('DB_USER', 'wordpress');

/** MySQL database password */
define('DB_PASSWORD', 'woseberry');

/** MySQL hostname */
define('DB_HOST', '192.168.30.3');

/** Database Charset to use in creating database tables. */
define('DB_CHARSET', 'utf8');

/** The Database Collate type. Don't change this if in doubt. */
define('DB_COLLATE', '');


Ahora solo nos falta completar el proceso de instalación desde la interfaz web. Para ello, en la barra de direcciones de un navegador web, escribimos el dominio o la dirección IP del servidor de la siguiente forma http://dominio_o_IP

En nuestro caso, accederemos mediante el dominio:

http://woseberry.tk

Instalación Wordpress

Certificados SSL - HTTPS

Dado que la finalidad es conseguir una tienda online que sea operativa, es primordial que cuente con unos certificados SSL que acrediten que la tienda es segura y se puede comprar en ella sin miedo a que nuestros datos se vean comprometidos por falta de seguridad. Para ello, las empresas suelen pagar por unos certificados validados por entidades certificadoras que acreditan la autenticidad de los certificados. Sin embargo, también existe la posibilidad de hacerlo de manera gratuita completando unos formularios y cumpliendo determinados requisitos. Paralelamente, también debemos realizar las configuraciones oportunas para que nuestro site funcione de forma segura a través del puerto 443 con el protocolo HTTPS.


Crear, configurar e instalar certificados - Let's Encrypt

Podemos utilizar la página web Get HTTPS for free para conseguir unos certificados válidos acreditados por esta entidad. Para ello se deben siguir ciertos pasos que detallamos a continuación.

Generar clave privada y solicitud de firma de certificado

Para generar una clave privada ejecutamos el siguiente comando en una de las Raspberry Pi.

$ openssl genrsa 4096 > Certificados/domain.key

Seguidamente generamos una petición de firma de certificado (CSR) con el dominio, en nuestro caso woseberry.tk

$ openssl req -new -sha256 -key Certificados/domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:woseberry.tk"))

Firmar la petición API

Para que la entidad Let’s Encrypt pueda validar que somos realmente nosotros quienes solicitamos los certificados y los que disponemos del servidor donde queremos instalarlos, deberemos ir generando unas claves a partir de nuestra clave privada. De este modo, devolviendo el HASH resultante podrán acreditar nuestra identidad y propiedad del dominio. Uno de los pasos a realizar es la configuración de un registro TXT en los DNS de nuestro proveedor de dominio que apunten al dominio woseberry.tk. Por esta razón, es primordial tener registrado dicho dominio y apuntarlo a un servidor público en Internet. De esta manera, al configurar el registro TXT en el DNS, Let’s Encrypt podrá validar correctamente nuestra identidad.

Instalación de certificados

Una vez finalizados los pasos anteriores, dispondremos de 3 claves:

  • domain.key
  • domain.crt
  • intermediate.pem

Estas claves las utilizaremos tanto en los servidores Apache de las Raspberry BERRY-02 y BERRY-03 como para la BERRY-01 con HAProxy. Por lo tanto, es primordial disponer de estos tres archivos en las tres Raspberry. Para ello, podemos copiarlos mediante el siguiente comando en la Raspberry correspondiente.

$ scp Certificados/* pi@BERRY-01:/home/pi/Certificados
$ scp Certificados/* pi@BERRY-02:/home/pi/Certificados
$ scp Certificados/* pi@BERRY-03:/home/pi/Certificados

Creamos la misma carpeta en las tres Raspberry para almacenar las claves.

$ sudo mkdir /etc/apache2/ssl

Una vez hayamos transferido los certificados y tengamos la carpeta /etc/apache2/ssl creada en las tres Raspberry, moveremos las claves a dicha carpeta mediante el siguiente comando.

$ sudo mv Certificados/* /etc/apache2/ssl

Configuración servidor apache para funcionar de forma segura mediante HTTPS

En primer lugar activamos el modulo SSL de apache2.

pi@BERRY-02:~$ sudo a2enmod ssl

Antes de modificar el archivo de configuración default-ssl.conf, hacemos una copia de seguridad del site SSL.

pi@BERRY-02:~$ sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Ahora ya podemos modificar el archivo del site SSL y especificar las rutas al certificado y clave privada.

pi@BERRY-02:~$ sudo nano /etc/apache2/sites-available/default-ssl.conf
 <IfModule mod_ssl.c>
       <VirtualHost _default_:443>
               ServerAdmin [email protected]
               DocumentRoot /var/www/html
               ErrorLog ${APACHE_LOG_DIR}/error.log
               CustomLog ${APACHE_LOG_DIR}/access.log combined
               SSLEngine on
               SSLCertificateFile      /etc/apache2/ssl/domain.crt
               SSLCertificateKeyFile /etc/apache2/ssl/domain.key
               <FilesMatch "\.(cgi|shtml|phtml|php)$">
                               SSLOptions +StdEnvVars
               </FilesMatch>
               <Directory /usr/lib/cgi-bin>
                               SSLOptions +StdEnvVars
               </Directory>
       </VirtualHost>
 </IfModule>


Habilitamos el site con SSL.

pi@BERRY-02:~$ sudo a2ensite default-ssl.conf

Para aplicar los cambios debemos reiniciar el servicio de apache2.

pi@BERRY-02:~$ sudo service apache2 restart


Balanceo de las páginas web - HAProxy

Instalación y configuración HAProxy

Con los gestores de contenido ya operativos, el siguiente paso será configurar el balanceo de carga hacia ellos. Para ello instalaremos el paquete HAProxy ejecutando el siguiente comando en la BERRY-01:

pi@BERRY-01:~$ sudo apt install haproxy

Para poder iniciar el balanceador de carga, debemos entrar en el archivo /etc/default/haproxy y modificar el valor por defecto de la línea "ENABLED" por el valor 1

pi@BERRY-01:~$ sudo nano /etc/default/haproxy
...

ENABLED=1

En el archivo de configuración de HAProxy deberemos introducir los parámetros necesarios para que la BERRY-01 sea capaz de balancear la carga entre los diferentes WordPress. Además, también deberá conservar las sesiones pertinentes para que un usuario pueda iniciar sesión y no la pierda mientras navega por las diferentes páginas o realiza una compra. Para ello editaremos el archivo /etc/haproxy/haproxy.cfg

pi@BERRY-01:~$ sudo nano /etc/haproxy/haproxy.cfg
global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 10s
	user haproxy
	group haproxy
	daemon

defaults
	log	global
	mode	http
#	mode	tcp
	option	tcplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http
	
frontend woseberry 
   bind *:80
   bind *:443 ssl crt /etc/apache2/ssl/cert_new/intermediate2.pem
   default_backend apaches 

backend apaches
   balance leastconn
   cookie SRVNAME insert
   server BERRY-02 192.168.30.2:443 check cookie BERRY-02 check ssl verify none
   server BERRY-03 192.168.30.3:443 check cookie BERRY-03 check ssl verify none

Pendiente explicar archivo anterior y comprobar el errorfile.

Replicación bases de datos - Galera

3 bases de datos!

Usuario de chequeo

Por tal de que HAProxy sea capaz de comprobar que nodo MariaDB está operativo y cual está caído, deberemos crear un usuario sin contraseña. HAProxy utilizará este usuario para establecer una conexión y así mantener el nodo operativo. Para crear este usuario entraremos en la consola de MySQL en cualquiera de los nodos, como por ejemplo la BERRY-04:

pi@BERRY-04:~$ mysql -u pi -p

Una vez hayamos entrado en la consola, crearemos el usuario ejecutando el siguiente comando:

MariaDB [(none)]> CREATE USER 'haproxy'@'192.168.30.254';

El usuario se llamará haproxy para ser más identificativo y solo permitirá conectarse desde la IP donde está instalado HAProxy.

Balanceo de las bases de datos - HAProxy

global
	log /dev/log	local0
	log /dev/log	local1 notice
	chroot /var/lib/haproxy
	stats socket /run/haproxy/admin.sock mode 660 level admin
	stats timeout 10s
	user haproxy
	group haproxy
	daemon

defaults
	log	global
	mode	http
#	mode	tcp
	option	tcplog
	option	dontlognull
        timeout connect 5000
        timeout client  50000
        timeout server  50000
	errorfile 400 /etc/haproxy/errors/400.http
	errorfile 403 /etc/haproxy/errors/403.http
	errorfile 408 /etc/haproxy/errors/408.http
	errorfile 500 /etc/haproxy/errors/500.http
	errorfile 502 /etc/haproxy/errors/502.http
	errorfile 503 /etc/haproxy/errors/503.http
	errorfile 504 /etc/haproxy/errors/504.http
	
frontend woseberry 
   bind *:80
   bind *:443 ssl crt /etc/apache2/ssl/cert_new/intermediate2.pem
   default_backend apaches 

backend apaches
   balance leastconn
   cookie SRVNAME insert
   server BERRY-02 192.168.30.2:443 check cookie BERRY-02 check ssl verify none
   server BERRY-03 192.168.30.3:443 check cookie BERRY-03 check ssl verify none

################################################################################

frontend mysql
   bind 192.168.30.254:3306
   mode tcp
   default_backend databases

backend databases
   balance roundrobin
   mode tcp
   option tcpka
   option mysql-check user haproxy
   server BERRY-04 192.168.30.4:3306 check weight 1
   server BERRY-05 192.168.30.5:3306 check weight 1
   server BERRY-06 192.168.30.6:3306 check weight 1

Sincronizacíon de las uploads en WordPress - Rsync

rsync (imágenes) Pendiente script y crontab

# m h  dom mon dow   command
*/15 * * * * rsync -ahvrz /var/www/html/wp-content/uploads/* [email protected]:/var/www/html/wp-content/uploads