====== Instalación de Wordpress ======
===== Instalar PHP =====
Instalar PHP 8.4 mediante el repositorio de Ondrej
(el estándar de facto en Ubuntu para tener versiones recientes de PHP),
ya que es la versión más estable y compatible actualmente con WordPress y sus plugins.
sudo apt update
sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.4-fpm php8.4-mysql php8.4-xml php8.4-mbstring php8.4-curl php8.4-zip php8.4-gd php8.4-intl -y
===== Instalar mariadb =====
sudo apt install mariadb mycli
CREATE DATABASE wordpress_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'TU_CONTRASEÑA_SEGURA';
CREATE USER 'ubuntu'@'localhost' IDENTIFIED BY 'TU_CONTRASEÑA_SEGURA';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wp_user'@'localhost';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'ubuntu'@'localhost';
FLUSH PRIVILEGES;
EXIT;
===== Instalar wordpress =====
Instalamos en pruebawewelinapmu.my.to, haciendo copia de lo existente.
cd /tmp
wget https://es.wordpress.org/latest-es_ES.tar.gz
tar -xzf latest-es_ES.tar.gz
sudo mv /var/www/pruebaewelinapmu /var/www/pruebaewelinapmu_flask_backup
sudo mv wordpress /var/www/pruebaewelinapmu
sudo chown -R www-data:www-data /var/www/pruebaewelinapmu
sudo find /var/www/pruebaewelinapmu -type d -exec chmod 755 {} \;
sudo find /var/www/pruebaewelinapmu -type f -exec chmod 644 {} \;
rm latest-es_ES.tar.gz
===== Configuramos nginx - wordpress =====
Editamos el fichero ''/etc/nginx/sites-available/pruebaewelinapmu''.
server {
listen 80;
server_name pruebaewelinapmu.my.to;
root /var/www/pruebaewelinapmu;
index index.php index.html;
access_log /var/log/nginx/pruebaewelinapmu.access.log;
error_log /var/log/nginx/pruebaewelinapmu.error.log;
# Detectar si el reverse proxy (gimli) envía HTTPS
set $fastcgi_https off;
if ($http_x_forwarded_proto = https) {
set $fastcgi_https on;
}
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param HTTPS $fastcgi_https;
}
# Denegar acceso a archivos ocultos (como .htaccess)
location ~ /\.ht {
deny all;
}
# Denegar acceso a archivos sensibles de WordPress
location ~* /(?:xmlrpc\.php|wp-config\.php|readme\.html|license\.txt) {
deny all;
}
}
Recargar nginx.
sudo nginx -t
sudo systemctl reload nginx
===== Instalación dentro de Wordpress =====
* Plantilla: Astra
* Plugin: Starter templates
* Plugin: WP Super Cache
* Plugin: Wordfence security
* Yoast SEO
* WPForms Lite
===== Ajustamos permisos =====
Ajustamos permisos para poder usar el usuario 'ubuntu'.
cd /var/www/pruebaewelinapmu
sudo find -type d -exec chmod -v g+rwx {} \;
sudo find -type f -exec chmod -v g+rw {} \;
===== Eliminamos WP-CRON =====
Por defecto, WordPress ejecuta sus tareas programadas
(comprobar actualizaciones, publicar entradas programadas, limpiar la basura, etc.)
cada vez que un visitante carga la página. Esto consume recursos de PHP y CPU innecesarios.
En un servidor con 1 solo núcleo como faramir, lo ideal es desactivar ese comportamiento
y que sea el sistema operativo (mediante cron) quien ejecute estas tareas en segundo plano
cada 15 minutos. Además, al ejecutarlo por CLI, evitamos que pase por Nginx, ahorrando más recursos.
sudo vim /var/www/pruebaewelinapmu/wp-config.php
Busca la línea que dice ''/* That's all, stop editing! Happy publishing. */'' y añade esta línea justo encima:
define('DISABLE_WP_CRON', true);
Guarda y cierra el archivo.
sudo crontab -u www-data -e
*/15 * * * * cd /var/www/pruebaewelinapmu && /usr/bin/php8.4 wp-cron.php > /dev/null 2>&1
===== Backups =====
Vamos a crear un script en Bash que haga un volcado de la base de datos
y comprima los archivos. El script mantendrá solo los últimos 7 días de backups.
Además, excluiremos la carpeta de caché de WP Super Cache para no gastar
tiempo ni espacio comprimiendo archivos temporales.
==== Crear un archivo de credenciales seguras para MariaDB ====
Para que el script pueda hacer el volcado de la base de datos sin exponer
la contraseña en texto plano en el propio script ni en los logs del sistema,
crearemos un archivo .my.cnf en el usuario root.
Creamos el ficheero ''/root/.my.cnf'', pegando el siguiente contenido
(sustituyendo TU_CONTRASEÑA_SEGURA por la que creaste durante la instalación
[client]
user = wp_user
password = TU_CONTRASEÑA_SEGURA
host = localhost
Lo protejemos.
sudo chmod 600 /root/.my.cnf
==== Crear el script de backup ====
Creamos el fichero ''wp_backup.sh''.
#!/bin/bash
# Copia de seguridad de ficheros y base de datos de wordpress de
# pruebaewelinapmu
# Se retienen 7 ficheros de cada tipo, en el directorio
# /var/backups/wordpress
# Variables
FECHA=$(date +%Y-%m-%d_%H%M%S)
DIR_BACKUP="/var/backups/wordpress"
DIR_WP="/var/www/pruebaewelinapmu"
DB_NAME="wordpress_db"
RETENCION=7
# Crear directorio de backup si no existe
mkdir -p $DIR_BACKUP
# 1. Volcar la base de datos
# mysqldump --defaults-file=/root/.my.cnf $DB_NAME > $DIR_BACKUP/db_$FECHA.sql
# 2. Comprimir archivos de WordPress (excluyendo la caché)
tar --exclude='pruebaewelinapmu/wp-content/cache' \
-C /var/www/ \
-czpf $DIR_BACKUP/files_$FECHA.tar.gz \
pruebaewelinapmu
# 3. Borrar backups anteriores a los días de retención
find $DIR_BACKUP -name "db_*.sql" -mtime +$RETENCION -exec rm {} \;
find $DIR_BACKUP -name "files_*.tar.gz" -mtime +$RETENCION -exec rm {} \;
echo "Backup completado: $FECHA"
==== Programarlo diariamente ====
Lo añadimos al ''/etc/crontab'' o lo enlazamos directamente
en el directorio de cron diario del sistema,
para que se ejecute todos los días a las 6:15 AM:
sudo ln -s /usr/local/bin/wp-backup.sh /etc/cron.daily/wp-backup
Los ficheros de backup van a ''/var/backups/wordpress/''.