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