Vamos a instalar WordPress en un VPS recién contratado que hemos configurado con Ubuntu 20.04 como sistema operativo.
Configuración del servidor recién instalado
Lo primero que debemos hacer es actualizar el sistema operativo para asegurarnos de que tiene los ultimos paquetes de la versión que hayamos seleccionado.
sudo apt update
Preparando el entorno LAMP
WordPress es una aplicación escrita en PHP, que necesita un entorno de ejecución determinado, conocido como entorno LAMP, (Linux, Apache, MySQL y PHP). Un sistema operativo (Linux), un servidor de aplicaciones web (Apache), una base de datos (MySQL) y un lenguaje de scripting (PHP).
Instalación entorno LAMP
sudo apt install apache2
Una vez terminada la instalación, tendrá que ajustar la configuración de su cortafuegos para permitir el tráfico HTTP. UFW tiene diferentes perfiles de aplicación que puedes aprovechar para conseguirlo. Para listar todos los perfiles de aplicación de UFW disponibles actualmente, puede ejecutar:
sudo ufw app list
Verás un resultado como este:
Available applications: Apache Apache Full Apache Secure OpenSSH
Por ahora, es mejor permitir sólo las conexiones en el puerto 80, ya que se trata de una instalación fresca de Apache y todavía no tiene un certificado TLS/SSL configurado para permitir el tráfico HTTPS en su servidor.
sudo ufw allow in "OpenSSH"
Activamos el Firewall para activar la seguridad de nuestro servidor y evitar así que haya peticiones a otros puertos que no sean los que el firewall tenga permitidos, en este caso hemos habilitado la comunicación por el puerto 22, que es el destinado a la conexión ssh.
Permite tambien la conexión por el puerto 80, que es el que usa el servidor web apache en comunicaciones http.
sudo ufw allow in "Apache"
Activamos el firewall
sudo ufw enable
Comprobamos como progresa la configuración de nuestro firewall.
sudo ufw status
Y tendrás una respuesta similar a esta.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Apache ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Apache (v6) ALLOW Anywhere (v6)
Puedes hacer una comprobación puntual de inmediato para verificar que todo ha ido según lo previsto visitando la dirección IP pública de tu servidor en tu navegador web.
http://direccion_ip_de_tu_servidor
Instalando Mysql
Ahora que tienes un servidor web en funcionamiento, necesitas instalar el sistema de base de datos para poder almacenar y gestionar los datos de tu sitio. MySQL es un popular sistema de gestión de bases de datos utilizado en entornos PHP.
sudo apt install mysql-server
Cuando te pida confirmación presiona “Y” y luego ENTER.
Cuando la instalación haya finalizado, te recomiendo ejecutar un script de seguridad que viene preinstalado con MySQL. Este script eliminará algunas configuraciones inseguras por defecto y bloqueará el acceso a su sistema de base de datos.
Inicia el script interactivo ejecutando:
sudo mysql_secure_installation
A la pregunta
VALIDATE PASSWORD PLUGIN can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD plugin? Press y|Y for Yes, any other key for No:
Respondemos que NO y ponemos una contraseña para el usuario *root de mysql
Ante la pregunta:
Remove anonymous users? (Press y|Y for Yes, any other key for No) :
Responde Yes
Ante la pregunta:
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) :
Responde Yes
Ante la pregunta:
By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) :
Responde Yes
Ante la pregunta:
Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) :
Responde Yes
Una vez instalado comprueba que puedes acceder a mysql
sudo mysql -u root -p
Y sal con el comando:
exit;
Instalar PHP
Tienes Apache instalado para servir tu contenido y MySQL instalado para almacenar y gestionar tus datos. PHP es el componente de nuestra configuración que procesará el código para mostrar el contenido dinámico al usuario final.
Además del paquete php, necesitarás php-mysql, un módulo PHP que permite a PHP comunicarse con bases de datos basadas en MySQL. También necesitará libapache2-mod-php para que Apache pueda manejar archivos PHP. Los paquetes principales de PHP se instalarán automáticamente como dependencias.
Para instalar estos paquetes:
sudo apt install php libapache2-mod-php php-mysql
Una vez terminada la instalación, puede ejecutar el siguiente comando para confirmar su versión de PHP:
php -v
La respuesta debería ser algo similar a esto:
Output PHP 7.4.3 (cli) (built: Jul 5 2021 15:13:35) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.3, Copyright (c), by Zend Technologies
En este punto, tu pila LAMP está completamente operativa, pero antes de que puedas probar tu configuración con un script PHP, es mejor que configures un “host virtual” en Apache adecuado para mantener los archivos y carpetas de tu sitio web. Lo haremos en el siguiente paso.
Creación de un alojamiento virtual para su sitio web
Crea una carpeta llamada “laboratorio” dentro del directorio que Apache ha creado como directorio raíz para las aplicaciones web. El texto que resalto en Azul deberías cambiarlo por el nombre de tu sitio web
sudo mkdir /var/www/html/laboratorio
A continuación, abra un nuevo archivo de configuración en el directorio sites-available de Apache utilizando su editor de línea de comandos preferido. En este caso, usaremos el editor de texto ‘nano’. Sustituye el nombre de laboratorio.charliealonso.com por tu propio dominio o subdominio.
sudo nano /etc/apache2/sites-available/laboratorio.charliealonso.com.conf
Copia este texto dentro del fichero que acabas de crear:
<VirtualHost *:80> ServerName laboratorio.charliealonso.com ServerAlias laboratorio.charliealonso.com ServerAdmin webmaster@localhost DocumentRoot /var/www/html/laboratorio <Directory /var/www/html/laboratorio/> AllowOverride All </Directory> ErrorLog ${APACHE_LOG_DIR}/laboratorio_error.log CustomLog ${APACHE_LOG_DIR}/laboratorio_access.log combined </VirtualHost>
Fíjate en la palabras en negrita y sustituye estas palabras por tu propio dominio, nombre de la carpeta que hayas creado para tu y el nombre de los ficheros log para tenerlos identificados en caso de que en un mismo servidor quieras instalar varios sitios web.
Habilita el host virtual en apache
sudo a2ensite laboratorio.charliealonso.com
Prueba la configuración de Apache antes de recargar el servicio
sudo apache2ctl configtest
Recarga la configuración de Apache
sudo systemctl reload apache2
Instalar Certificados SSL
Vamos a instalar certificado Let’s Encrypt, que es un servicio de certificación SSL de software libre, que certifica mas de 260 millones de web actualmente y que se puede actualizar de forma automática usando el programador de tareas de Linux.
Si no tienes un nombre de dominio para tu web y vas a probar tu instalación con la dirección IP, no instales los certificados.
Para instalar los certificados ejecuta el siguiente comando:
sudo apt install certbot
Ahora instala el plugin de Apache para el certbot que instalar los certificados
sudo apt install python3-certbot-apache
Ejecuta el comando para solicitar el certificado
sudo certbot --apache
Esta secuencia de comandos te solicitará que responda a una serie de preguntas para configurar tu certificado SSL. Primero, te solicitará una dirección de correo electrónico válida. Esta dirección se utilizará para las notificaciones de renovación y los avisos de seguridad:
Saving debug log to /var/log/letsencrypt/letsencrypt.log Plugins selected: Authenticator apache, Installer apache Enter email address (used for urgent renewal and security notices) (Enter 'c' to cancel): tu@correo_valido
Después de proporcionar una dirección de correo electrónico válida, presiona ENTER
para continuar con el siguiente paso. Luego, te solicitará que confirmes si aceptas las condiciones de servicio de Let’s Encrypt. Puede confirmar pulsando A
y, luego, ENTER
:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Please read the Terms of Service at https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must agree in order to register with the ACME server at https://acme-v02.api.letsencrypt.org/directory - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (A)gree/(C)ancel: A
A continuación, te solicitará que confirmes si deseas compartir tu dirección de correo electrónico con Electronic Frontier Foundation para recibir noticias y otra información. Si no deseas suscribirte a su contenido, escribe ‘N
‘. De lo contrario, escribe ‘Y
‘. Luego, presiona ENTER
para continuar con el siguiente paso.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: N
En el siguiente paso te mostrará una lista con los dominios que haya configurados en este servidor y debes seleccionar el dominio que quieras certificar, pulsando el numero del dominio y ENTER, en el caso de querer certificar varios dominios, escribe sus números separados por comas.
Which names would you like to activate HTTPS for? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: laboratorio.charliealonso.com 2: dominio.com 3: www.dominio.com - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate numbers separated by commas and/or spaces, or leave input blank to select all options shown (Enter 'c' to cancel):
Verás un resultado como este:
Obtaining a new certificate Performing the following challenges: http-01 challenge for your_domain http-01 challenge for www.your_domain Enabled Apache rewrite module Waiting for verification... Cleaning up challenges Created an SSL vhost at /etc/apache2/sites-available/your_domain-le-ssl.conf Enabled Apache socache_shmcb module Enabled Apache ssl module Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf Enabling available site: /etc/apache2/sites-available/your_domain-le-ssl.conf Deploying Certificate to VirtualHost /etc/apache2/sites-available/your_domain-le-ssl.conf
A continuación, te solicitará que selecciones si deseas que el tráfico de HTTP se redirija a HTTPS o no. En la práctica, esto significa que cuando alguien visite tu sitio web a través de canales no cifrados (HTTP), lo redirigirá automáticamente a la dirección HTTPS de su sitio web. Selecciona la opción 2
para habilitar el redireccionamiento o 1
si deseas mantener HTTP y HTTPS como métodos de acceso al sitio web separados.
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: No redirect - Make no further changes to the webserver configuration. 2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for new sites, or if you're confident your site works on HTTPS. You can undo this change by editing your web server's configuration. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Con este paso, se completa la configuración de Certbot y se te presentarán los comentarios finales sobre tu certificado nuevo e información sobre dónde localizar los archivos generados y cómo probar tu configuración utilizando una herramienta externa que analiza la autenticidad del certificado:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://your_domain and https://www.your_domain You should test your configuration at: https://www.ssllabs.com/ssltest/analyze.html?d=your_domain https://www.ssllabs.com/ssltest/analyze.html?d=www.your_domain - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your_domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your_domain/privkey.pem Your cert will expire on 2020-07-27. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - Your account credentials have been saved in your Certbot configuration directory at /etc/letsencrypt. You should make a secure backup of this folder now. This configuration directory will also contain certificates and private keys obtained by Certbot so making regular backups of this folder is ideal. - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le
Activar HTTPS en el firewall
Como hemos activado y direccionado el trafico para que vaya encriptado por SLL en https, debemos activar los puertos para https en el firewall, el puerto para https es el 443, pero como tenemos apache lo activamos con la aplicacion para ufw “Apache Full”:
sudo ufw allow "Apache Full"
Verificar la renovación automática de Certbot
Los certificados de Let’s Encrypt son válidos únicamente por noventa días. Este período de validez se utiliza para alentar a los usuarios a automatizar su proceso de renovación de certificados, así como para garantizar que los certificados mal utilizados o las claves robadas expiren lo antes posible.
El paquete certbot
que instalamos se encarga de las renovaciones al incluir una secuencia de comandos en /etc/cron.d
, que gestiona un servicio systemctl
denominado certbot.timer
. Esta secuencia de comandos se ejecuta dos veces al día y renovará de forma automática cualquier certificado que caduque en treinta o menos días.
Para verificar el estado de este servicio y asegurarse de que esté activo y en ejecución, puede utilizar lo siguiente:
sudo systemctl status certbot.timer
Verás un resultado similar a este:
certbot.timer - Run certbot twice daily Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled) Active: active (waiting) since Tue 2020-04-28 17:57:48 UTC; 17h ago Trigger: Wed 2020-04-29 23:50:31 UTC; 12h left Triggers: ● certbot.service Apr 28 17:57:48 fine-turtle systemd[1]: Started Run certbot twice daily.
Para salir de la pantalla de resultado anterior pulsa la letra q(quit) para volver a la consola.
Para probar el proceso de renovación, puede hacer un simulacro con certbot
:
sudo certbot renew --dry-run
Instalar WordPress
Creación de una base de datos de MySQL y un usuario para WordPress
El primer paso que daremos es preparatorio. WordPress utiliza MySQL para administrar y almacenar el sitio y la información del usuario. Ya instalamos MySQL, pero debemos crear una base de datos y un usuario para que use WordPress.
Para comenzar, inicie sesión en la cuenta root (administrado) de MySQL emitiendo este comando (tenga en cuenta que este no es el usuario root de su servidor):
mysql -u root -p
En la base de datos, crea una base de datos exclusiva para WordPress. Puedes ponerle el nombre que quieras, pero usaremos el nombre WordPress en esta guía. Cree la base de datos para WordPress escribiendo los siguientes comandos uno a uno en la consola de comandos de MySQL. Resalto en azul el texto que deberías cambiar por tus propios datos
CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
CREATE USER 'wordpressuser'@'%' IDENTIFIED WITH mysql_native_password BY 'contraseña';
GRANT ALL ON wordpress.* TO 'wordpressuser'@'%';
FLUSH PRIVILEGES;
EXIT;
Instalación de extensiones de PHP adicionales
Actualiza el sistema
sudo apt update
instala los módulos requeridos
sudo apt install php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip
Reinicia el servicio apache para activar los módulos que acabas de instalar
sudo systemctl restart apache2
Descarga WordPress
Sitúate en el directorio temporal del servidor
cd /tmp
descarga el código fuente. Esto lo vamos a hacer con una erramienta que se llama curl, un navegador por linear de comando, normalmente viene instalado en ubuntu de base, si no fuera asi, puedes instalarlo con el siguiente comando
sudo apt install curl
y despues…
curl -O https://wordpress.org/latest.tar.gz
descomprimelo
tar xzvf latest.tar.gz
crea el archivo .htaccess
touch /tmp/wordpress/.htaccess
copia la plantilla de configuración al fichero config.php
cp /tmp/wordpress/wp-config-sample.php /tmp/wordpress/wp-config.php
crea el directorio para actualizaciones de WordPress
mkdir /tmp/wordpress/wp-content/upgrade
copia la aplicación WordPress a la carpeta web para el proyecto
sudo cp -a /tmp/wordpress/. /var/www/html/laboratorio
cambia los permisos de la carpeta web
sudo chown -R www-data:www-data /var/www/html/base
sudo find /var/www/html/base/ -type d -exec chmod 750 {} \;
sudo find /var/www/html/base/ -type f -exec chmod 640 {} \;
consigue los código para securizar tu instalación
curl -s https://api.wordpress.org/secret-key/1.1/salt/
Editar el fichero de configuración de WordPress
sudo nano /var/www/html/base/wp-config.php
Y cambiamos el nombre de la base de datos, el nombre de usuario y su contraseña, además de las claves de seguridad que hemos obtenido antes.
. . . // ** 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', 'wordpressuser' ); /** MySQL database password */ define( 'DB_PASSWORD', 'password' ); /** MySQL hostname */ define( 'DB_HOST', 'localhost' ); /** 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', '' ); define('AUTH_KEY', 'qG/SN^B?SPs#wM__9aNd a?0r/r?JtnT/DY@R:H%b~Gu;-{-3oI#OoYq^O?RUR)q'); define('SECURE_AUTH_KEY', '/YYz6hR;-r3;9B`#9hF0KXh#{s]DU8@BEY+kNQX]S1;re4P*N2P?vw|JMNpqJp^#'); define('LOGGED_IN_KEY', '84Y3A:7V]+aA08EfWNkt0G/me}&<?)w)iwt7aC6SrRB&>MGI-9j^ts4lFoN0w6yx'); define('NONCE_KEY', 'qt%ng]D>Ei[q/h+ZXn}O}f,SAq9-h<,l?nR3ZNQl(.+WzO2Pe~T|]ip`S.qT(e9v'); define('AUTH_SALT', '1j|.l,.HPbIfX9G<nvUK6u4c8e6&3{i?Q^KR(t7<BI_F0w~WPAaE>aDjgQr(&CJ.'); define('SECURE_AUTH_SALT', '3^qa.YLX^yAo3nX6N6]![;%g6x4(72N-#jPn$F4>F#X+RO9K00bse&E{mw$GolWi'); define('LOGGED_IN_SALT', '%9e1q8_ri;7V3w8|cEN%nuis,mte||;2I~$i!Y_qWV>-m,]*B~hpSXN6H% 2/o(d'); define('NONCE_SALT', '@{#k[*1tR p[2!$.vk0V3=Aa{:j6 MWqgTnBy8&.gX8X-7[~AhCpPf6AYC_eunh'); . . .
Añade al final del fichero config la siguiente línea
define('FS_METHOD', 'direct');
Salva el fichero con la combinación de teclas CTRL+O y sal del editor con CTRL+X
En este punto ya tienes instalado WordPress y solo tienes que terminar la instalación via web, como ya tenemos instalado el Host virtual con el dominio y el certificado SSL si escribes tea linea en tu navegador:
https://laboratorio.charliealonso.com
Te mostrará esta ventana, seleccionas el idioma y rellenas el formulario que te aparece a continuación.
Así de fácil ha sido instalar tu WordPress en un Servidor Virtual Privado VPS en internet, si no dispones de ninguno, puede contratar estos servidores por un precio realmente económico tanto en OVH como en CONTABO en este ultimo encontraras VPS mejor equipados a un precio realmente asequible en torno a 4€/mes
¡Que tengas un Ingenioso día!
Charlie Alonso
Si necesitas ayuda con estas configuraciones, Suscribete a mi servicio de asesoramiento y consulta lo que necesites y si no quieres ponerte manos a la obre y prefieres que lo haga yo por ti, contrata mis micro-servicios de implantación.