BALANCEAR WORDPRESS

Por donde empezar

 

Para nuestro escenario hemos adquirido 2 vps y un balanceador en OVH, las vps desplegadas son Ubuntu 18.04. En este post no hablaremos del balanceador en si, ya que cada proveedor de servicios utiliza dashboards y tecnologías diferentes por lo tanto nos centramos en las vps que estarán detrás.

Lo primero que realizamos es cambiar la password de root de cada VPS para que sean idénticas y no volvernos locos.

Autorizamos a root a hacer login por ssh:

nano /etc/ssh/sshd_config

buscamos root y donde pone PermitRootLogin lo cambiamos a yes, también para las siguientes configuraciones que haremos nos aseguramos en este fichero de configurar lo siguiente.

RSAAuthentication yes

PubkeyAuthentication yes

StrictModes yes

Reiniciamos el servicio

service sshd restart

Editamos el fichero /etc/hosts de todos los servidores para que apunte a todos los que no sea el mismo con un nombre corto ejemplo vps1,vps2,vps3,….quedando

ip.ip.ip.ip vps1

ip.ip.ip.ip vps2

ip.ip.ip.ip vps3

Generamos una clave ssh en todas las vps con:

ssh-keygen

Copiamos esa clave a todos los hosts que hayamos añadido en el fichero hosts:

ssh-copy-id root@vps1

ssh-copy-id root@vps2

ssh-copy-id root@vps3

ssh-copy-id ….

Como hemos activado el StrictModes a yes necesitamos establecer los permisos de la ruta $HOME/.ssh/authorized_keys. Este fichero debe tener permisos 600 y el directorio .ssh debe tener permisos 700, esto es una manera de securizar para asegurarse de que las claves públicas no están comprometidas, se puede dejar también en no y no habría que realizar este paso pero sería menos seguro, ya puestos vamos afinando puntos.

chmod 600 ~/.ssh/authorized_keys

chmod 700 ~/.ssh/

Una vez tenemos hecho todo el tema de autenticación y como en cualquier otro despliegue primero actualizamos todas las vps, todo lo que sean tareas comunes podríamos utilizar alguna herramienta, yo por ejemplo en Linux utilizo Asbru puesto que nos permite crear un cluster de servidores y todos los comandos que ejecutemos en una consola se verán reflejadas en las demás, como buen optimizador de tiempo cuanto menos escriba mejor jeje.


apt update -y

apt upgrade -y

Empezamos a instalar:

apt install apache2 libapache2-mod-fastcgi -y

Dependiendo de vuestra distribución es posible que tengáis que descargarlo, por ejemplo para Ubuntu 18.04, recordando como siempre en nuestros posts que lo que vaya a ser basura lo hagamos en /tmp y si no existe el comando anterior no instalara apache2 y tendremos que volver a instalaro

cd /tmp && wget http://mirrors.kernel.org/ubuntu/pool/multiverse/liba/libapache-mod-fastcgi/libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb

apt install apache2 && dpkg -i libapache2-mod-fastcgi_2.4.7~0910052141-1.2_amd64.deb; sudo apt install -f

Puede que la versión de php que quieres utilizar tampoco esté en los repositorios de la distribución a utilizar, si es así por ejemplo para Debian y Ubuntu

apt install software-properties-common -y

add-apt-repository ppa:ondrej/php

apt update

Como nota en Centos/RHEL instalar los repo de fedoraproject y remi

Ahora cada cual que instale la versión php-fpm correspondiente para su proyecto y sus módulos necesarios, en nuestro caso para un wordpress utilizamos la versión 7.2 y los siguientes módulos, en caso de querer por ejemplo la versión php7.3 sustituir 7.2 por 7.3 en toda la línea siguiente.

apt-get install php7.2 php7.2-fpm php7.2-mysql php7.2-mbstring php7.2-curl php7.2-dom php7.2-gd php7.2-xml php7.2-xmlrpc php7.2-zip php7.2-soap php7.2-intl php7.2-common php7.2-bcmath php7.2-imagick -y

Habilitamos Apache y SSH en el firewall y lo activamos:

ufw allow in "Apache Full"

ufw allow in "Apache"

ufw allow in "OpenSSH"

ufw enable

Activamos lo instalado y algún módulo más de apache:

a2enmod proxy_fcgi setenvif actions alias rewrite

a2enconf php7.2-fpm

a2enmod http2 headers cache cache_disk expires proxy_https2 ssl

systemctl restart apache2

systemctl start apache-htcacheclean

Cambiamos el mpm prefork a event para conseguir mayor rendimiento y recargamos Apache:

a2dismod mpm_prefork

a2enmod mpm_event

systemctl reload apache2

Comprobamos que el MPM no esté en prefork, si pone Server MPM: y vacío está bien

apache2 -V

Editamos el fichero de direcciones de apache:

nano /etc/apache2/mods-enabled/dir.conf

en el escribimos lo siguiente:

DirectoryIndex index.php index.cgi index.pl index.html index.xhtml index.htm

Creamos el siguiente fichero:

nano /etc/apache2/sites-available/web.conf

con el siguiente contenido, hay que sustituir el servidorN por el número que toque, además del documentroot donde estarán ubicados los archivos de la web y los logs para identificar dicha web en caso de tener más sites en el mismo server, en nuestro caso utilizaremos /var/www/html, como vamos a utilizar lsyncd y su home será /var/www, no activar ningún site en raiz por seguridad, ya que el directorio .ssh de www-data estará en /var/www

ServerName servidorN.dominioweb.com

DocumentRoot /var/www/html/

<Directory "/var/www/html">

Options Indexes FollowSymLinks MultiViews

AllowOverride All

Require all granted

ErrorLog ${APACHE_LOG_DIR}/dominioweb_error.log

CustomLog ${APACHE_LOG_DIR}/dominioweb_access.log combined

RewriteEngine on

RewriteCond %{SERVER_NAME} =servidorN.dominioweb.com

RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]

Creamos el siguiente fichero para ssl:

nano /etc/apache2/sites-available/webssl.conf

con el siguiente contenido

ServerAdmin [email protected]

DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/dominioweb_error.log

CustomLog ${APACHE_LOG_DIR}/dominioweb-access.log combined

SSLEngine on

SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem

SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

<FilesMatch "\.(cgi|shtml|phtml|php)$">

SSLOptions +StdEnvVars

SSLOptions +StdEnvVars

Habilitamos los sitios y desactivamos el de por defecto

a2ensite web webssl && a2dissite 000-default && systemctl reload apache2

Pasamos a editar los ficheros de config de php:

nano /etc/apache2/mods-enabled/mpm_event.conf

Lo configuramos así para un servidor con un 1 core y 2 gb de ram, hay muchos tutoriales en la web por lo que no entraremos en detalle pero hay que ajustarlo para sacar el mejor rendimiento:

ServerLimit 16

StartServers 4

MinSpareThreads 25

MaxSpareThreads 75

ThreadLimit 64

ThreadsPerChild 25

MaxRequestWorkers 150

MaxConnectionsPerChild 0

Cambiamos la configuración del php7.2-fpm para ampliar algunos límites y no tener problemas en la instalación de wordpress:

nano /etc/php/7.2/fpm/php.ini

Buscamos las siguientes líneas y las dejamos con estos valores o al gusto del consumidor:

upload_max_filesize = 64M

post_max_size = 70M

max_execution_time = 300

Reiniciamos Apache y PHP

service apache2 restart

service php7.2-fpm restart

Subimos el fichero de wordpress por scp a uno de los servidores en /var/www/ en nuestro caso

scp wordpress.zip root@vps1:/var/www/

o utilizamos wget desde /var/www/ para descargar la última versión

wget https://es.wordpress.org/latest-es_ES.zip

Instalamos unzip si no lo tuviéramos instalado

apt install unzip -y

Lo descomprimimos estando en la ruta del servidor /var/www:

unzip latest-es_ES.zip

y lo movemos a html que es donde apuntan nuestros sites

rm -rf html

mv wordpress html

Instalamos wordpress y cambiamos la propiedad y permisos de todos los ficheros dentro de la carpeta utilizando las buenas prácticas de wordpress estando en la carpeta /var/www/html:

cd /var/www/html

chown www-data:www-data -R /var/www/html

find . -type d -exec chmod 755 {} \;

find . -type f -exec chmod 644 {} \;

chmod 600 wp-config.php

Creamos el fichero index2.html en cada servidor, nos servirá como sonda para saber que el servidor está levantado:

nano index2.html

Su contenido será el siguiente (hay que cambiar N por el número de servidor):

Test Ok! Servidor N

Cambiamos el dueño del archivo:

chown www-data:www-data index2.html

Instalamos wordpress como siempre y tras la instalación nos copiamos todo el contenido al otro server

rsync -r /var/www/html* vps2:/var/www/html/.

rsync -r /var/www/html* vps3:/var/www/html/.

rsync -r /var/www/html* ...:/var/www/html/.

Ahora sincronizaremos las vps con lsyncd, para ello primero lo instalamos:

apt install lsyncd -f

Creamos la carpeta /etc/lsyncd/ con el siguiente comando:

mkdir /etc/lsyncd

Creamos el fichero de configuración en esa carpeta:

nano /etc/lsyncd/lsyncd.conf.lua

con el siguiente contenido para que apunten a los servidores que queremos sincronizar cambiando el targetlist en cada nodo acorde a quien es, dejándolo algo como así:

settings {

logfile = "/var/log/lsyncd/lsyncd.log",

statusFile = "/var/log/lsyncd/lsyncd.status",

}

www_target_list = {

"vps2:/var/www/html",

"vps3:/var/www/html",

"vps4:/var/www/html"

--Ojo si añadimos más servidores el último es el único que no lleva coma al final

}

for _, server in ipairs(www_target_list) do

sync {

default.rsync,

source = "/var/www/html",

target = server,

delete = "running",

delay = 1,

exclude = { "wp-config.php", "index2.html" },

rsync = {

rsh = "ssh -l www-data -i /var/www/.ssh/id_rsa",

}

}

end

Hay que crear también la carpeta /var/log/lsyncd con el siguiente comando creamos la carpeta y los ficheros:

mkdir /var/log/lsyncd

touch /var/log/lsyncd/lsyncd.{log,status}

Después definimos una password para www-data de esta manera:

passwd www-data

Instalamos rssh:

apt-get install rssh

Editamos el fichero de configuración:

nano /etc/rssh.conf

Para quitar los comentarios de las siguientes líneas:

allowscp

allowrsync

Editamos el fichero /etc/passwd

nano /etc/passwd

y sustituimos la linea www-data por esta otra :

www-data:x:33:33:www-data:/var/www:/bin/bash

Editamos el fichero de ssh para permitir el login a www-data:

nano /etc/ssh/sshd_config

Y nos vamos abajo del todo y agregamos esta línea:

AllowUsers www-data root

Ojo si tenéis más usuarios que accedan por ssh añadirlos con espacios a continuación de root

Ahora que tenemos al usuario www-data logueable hacemos lo siguiente donde servidorN es el nombre del servidor al que queremos acceder con www-data:

su www-data

ssh-keygen

ssh-copy-id vps2

ssh-copy-id vps3

ssh-copy-id vpsx

Realizamos esto en cada servidor para poder sincronizar ficheros entre ellos y ejecutamos exit en la consola para volver a root, editamos /etc/passwd y ahora lo restringimos sustituyendo la linea donde está www-data por esta otra

www-data:x:33:33:www-data:/var/www:/usr/bin/rssh

Activamos lsync:

service lsyncd start

Comprobamos que no haya errores con:

service lsyncd status

Y creamos un fichero de prueba dentro de la carpeta para ver que se crea en el otro servidor:

touch prueba.html

Ya metidos en vereda instalamos los mailsutils:

apt install -y mailutils

Seleccionamos “Internet Site”

escribimos: dominioweb.com

Editamos el fichero /etc/postfix/main.cf

nano /etc/postfix/main.cf

Nos vamos abajo del todo y donde pone inet_interfaces = all lo sustituimos por:

inet_interfaces = loopback-only

Reiniciamos postfix:

systemctl restart postfix

Y por último los certificados, si no te quieres complicar la vida en este escenario utiliza el servicio free de cloudflare ya que es una gozada el cual nos facilita sus certificados y en los server con los autofirmados más que suficiente eligiendo la opción flexible de la parte de ssl en cloudflare, ahorrándonos trabajo y quebraderos porque hayan cambiado por ejemplo la versión de la API si utilizamos Lets encrypt.

Miguel A. Romero en colaboración TL.

Gracias por leer nuestros posts.

No hay comentarios

Comenta la entrada