====== 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/''.