Notas de Luis

¡Esta es una revisión vieja del documento!


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. Para no saturar tu disco de 38GB, 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/.

computing/web/wordpress_install.1783281874.txt.gz · Última modificación: por alfabeto