Instalar WordPress con Ubuntu 18.04, NGINX, MariaDB y PHP 7.4

Tabla de Contenido

Parte A: Mantener Cloudflare Nameservers activo

Usaremos Cloudflare DNS  para obtener el certificado Let’s Encrypt Wildcard SSL.  Completa este paso primero para disfrutar de una migración con cero tiempo de inactividad.

Comprobar actual Nameservers

  • Encuentra tu actual Nameservers en dnschecker.org/#NS/example.com
  • Si ves que está usando el Hosting anterior o el predeterminado NS del registro de dominio, entonces debes reemplazarlo con Cloudflare.

Habilitar Cloudflare DNS

  1. Crea una nueva cuenta en Cloudflare account
  2. Agrega tu dominio
  3. Verifica DNS records
  4. Actualiza NS.

Parte B: Prepara el Ubuntu Server 18.04.3 LTS

Ubuntu logo

1. Regístrate en Vultr y obtén $100 crédito gratis (válido por 30 días) 

Como alguien que ha probado muchas Compañías de servidores Cloud, mi experiencia dice que no te equivocarás eligiendo Vultr. Las personas que trabajan en su team son genuinas y realmente preocupadas cuando se trata de soporte y servicio.  

vultr

⚡ Rendimiento

  • NVME / SSD
  • 3.7 GHz CPU
  • Hasta 5Gbps Velocidad de Red.
  • Centro de Datos en América, Europa, Asia, Australia
  • IPV6 listo

💡 Características

  • Dashboard amigable para principiantes
  • Snapshot en un click
  • Respaldo automático (Pagado)
  • Cloud Firewall gratis
  • Protección DDoS  (Pagado)
  • 100% Virtualización KVM

⚙ Soporte

  • PayPal/Tarjeta
  • 24/7 Soporte (ticket)
  • Documentación

2. Crear un nuevo Servidor VPS

Para empezar simplemente haz click en el botón +

Deploy New Server

3. Elegir un Servidor de Alta Frecuencia

Choose Server

Selecciona Computación de Alta Frecuencia para obtener la experiencia mas rápida. Usa almacenamiento 3.7 GHz CPU y NVME.

CPU Speed
Velocidad CPU

4. Elegir la ubicación del Servidor

Elige la ubicación del servidor que esté cerca de tu audiencia objetivo. 

Tip: Si estás implementando deploying a static WordPress on BunnyCDN Storage, selecciona Alemania para una experiencia de carga más rápida.

location

5. Seleccionar Ubuntu 18.04×64 OS

Esta es una versión compatible a largo plazo. Es compatible con la mayoría de los paquetes que vamos a instalar.  

Operating System

6. Elegir un tamaño de Servidor

server size

El plan de $6/mensual es excelente para comenzar un blog nuevo. Puedes mejorar el plan en cualquier momento que lo necesites.

Tip: Si estás migrando, revisa el tamaño de la instalación total en Site Health info.

7. Habilitar IPV6 y Respaldo

Ignora Startup Script. Esta opción no es obligatoria. 👇

startup script

8. Agregar una clave SSH

Se recomienda realizar este paso opcional para una mayor seguridad.

Add SSH key
  1. Haz click en Botón Agregar para agregar una nueva clave SSH y enviar tu 🔒Public key.
  2. Genera claves usando el método siguiente según tu Sistema Operativo. 
  • Descarga la aplicación PuTTy .
  • Busca PuTTygen en el menú inicio
  • Haz click en el botón Generate y pasa el puntero de mouse
  • Copia la Public key y proporciónala a Vultr
  • Ingresa key passphrase (frase de contraseña)
  • Graba la 🔑Clave Privada en un lugar seguro.
  • Esto se puede usar para iniciar sesión en SSH o SFTP. 
  • Ejecuta: ssh-keygen -t rsa. Para una clave 4096-bit más segura, ejecuta: ssh-keygen -t rsa -b 4096
  • Presiona enter cuando se te pregunte dónde deseas guardar la clave (se guardará en la ubicación predeterminada).
  • Ingresa una passphrase (frase de contraseña) para tu clave.
  • Ejecuta cat ~/.ssh/id_rsa.pub – esto le dará a tu clave el formato apropiado para pegarlo en el panel de control. 
  • Asegúrate de respaldar el archivo ~/.ssh/id_rsa. Esto no se puede recuperar si se pierde.

Seleccionar tu clave SSH

Siguiendo estos pasos adjuntarás tu public key a tu nueva Instance. Así podrás iniciar sesión en SSH usando contraseña de texto sin formato y clave SSH, ambos.

select SSH public key

9. Link regla Web Firewall a Server Instance

Firewall
  1. Haz click en Manage y crea un nuevo Firewall Group.
  2. Permitir TCP puerto 22 para SSH. 80 para HTTP y 443 HTTPS para IPV4 y IPV6 reglas, ambos.
  3. Una vez hecho, link el Firewall group a tu Instance.
firewall status
Acepta conexión TCP desde 22, 80, 443 solamente
Link Firewall Group
Link regla firewall a nueva instance

10. Ingresar Hostname y label click Deploy Now

Ahora verás instalación en progreso

Instance Installing

15. Ir a página New Instance

Copia la dirección IP, nombre de usuario y contraseña. Tu puerto predeterminado es 22.

16. Desactivar contraseña de Inicio de Sesión.

Por razones de seguridad es recomendable desactivar la contraseña de autenticación y permitir solo autenticación basada en clave. 

  1. Edita la configuracion del archivo nano /etc/ssh/sshd_config
  2. Encuentra (CTRL + W) y busca PasswordAuthentication
  3. Cambia el valor de Si a No
  4. Para guardar escribe CTRL + O
  5. Reinicia el servicio SSH usando el comando sudo service ssh restart
Desactivar contraseña de autenticación

Para una próxima vez, puedes usar SSH solo vía clave como se muestra en el video.

Para Linux o Mac, usa Terminal con un comando como el siguiente

ssh root@192.168.1.1 -p 22 -i id_rsa

Esta es suficiente explicación para temas básicos.  Ahora apuraré el proceso original  para implementar WordPress en LEMP stack.

Parte C. Deploy WordPress en LEMP Stack

1. Actualización de repositorios 

Escribe el siguiente comando y presiona la tecla enter

sudo apt update && sudo apt upgrade -y && sudo apt dist-upgrade && sudo apt autoclean && sudo apt autoremove -y && reboot

 

wget -qO update https://gulshankumar.net/update && chmod +x update
./update

2. Instalar MariaDB con seguridad

Inicia sesión de nuevo e ingresa el siguiente comando

sudo apt install mariadb-server -y && sudo mysql_secure_installation

Responde las preguntas siguientes

  • Ingresa la contraseña actual para root (enter for none): Presiona la tecla Enter.
  • Establecer root contraseña? [Y/n]: Presiona la tecla Enter.
  • Nueva contraseña: Escribe tu contraseña, puedes usar Dashlane para generarla. Haz click derecho para pegar.
  • Reingresa la nueva contraseña: Vuelve a escribir tu contraseña.

Una vez que crees exitosamente tu contraseña, verás 

Password updated successfully!
Reloading privilege tables..
... Success!

También necesitas responder las siguientes preguntas

Remover usuarios anónimos? [Y/n]: Presiona Y enter Disallow root login remotely? [Y/n]: Presiona Y enter Remove test database and access to it? [Y/n]: Presiona Y enter Reload privilege tables now? [Y/n]: Presiona Y enter

3. Crear una nueva Base de Datos para WordPress

Inicia sesión en MySQL, presiona la tecla Enter cuando solicite la contraseña.

mysql -u root -p

Crea una nueva Base de Datos, y concede privilegios de uso al usuario con contraseña. Aquí es donde WordPress almacena toda la información de publicaciones, páginas, themes, plugin, etc.

create database wordpress;
grant all on wordpress.* to gulshan@localhost identified by '5pY8CKJxDRJEGQNkX7';
flush privileges;
exit;

Donde tu base de datos es WordPress, usuario es gulshan, contraseña es 5pY8CKJxDRJEGQNkX7

Tip: Considera el usar una única credencial de inicio de sesión.  

4. Instalar PHP 7.4, NGINX y establece Permiso

sudo add-apt-repository ppa:ondrej/php -y && apt update && apt install php7.4-fpm php7.4-common php7.4-mysql php7.4-xml php7.4-xmlrpc php7.4-curl php7.4-gd php7.4-imagick php7.4-cli php7.4-dev php7.4-imap php7.4-mbstring php7.4-soap php7.4-zip php7.4-bcmath -y &&  sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php/7.4/fpm/php.ini && systemctl restart php7.4-fpm.service &&  apt install nginx -y && chown -R www-data:www-data /var/www/ && sudo chmod -R 755 /var/www

Ajustar la configuración de PHP

La mayoría de theme y plugin sofisticados requieren una configuración PHP de alta gama para ejecutarse. Por lo tanto, debemos hacer estos cambios.

sed -i 's/memory_limit = 128M/memory_limit = 512M/g' /etc/php/7.4/fpm/php.ini
sed -i 's/post_max_size = 8M/post_max_size = 128M/g' /etc/php/7.4/fpm/php.ini
sed -i 's/max_file_uploads = 20/max_file_uploads = 30/g' /etc/php/7.4/fpm/php.ini
sed -i 's/max_execution_time = 30/max_execution_time = 900/g' /etc/php/7.4/fpm/php.ini
sed -i 's/max_input_time = 60/max_input_time = 3000/g' /etc/php/7.4/fpm/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 128M/g' /etc/php/7.4/fpm/php.ini
systemctl restart php7.4-fpm.servici

5. Instalar Wildcard Let’s Encrypt SSL Certificate

Crea el archivo cloudflare.ini en /root/.secrets/ directory

mkdir -p /root/.secrets/ && cd /root/.secrets/ && nano cloudflare.ini

Agrega el codigo de abajo y guarda usando CTRL+O y para salir usando CTRL+X

dns_cloudflare_email = "your-cloudflare-email@example.com"
dns_cloudflare_api_key = "XXXXXXXXXXXXXXXXX"

Encuentra tu e-mail de Cloudflare y Global API key en «My Profile» > API Tokens > Global API Key

Restringir su Permiso

sudo chmod 0400 /root/.secrets/cloudflare.ini

Instalar Certbot y Autenticador DNS

sudo apt-get update && sudo apt-get install software-properties-common && sudo add-apt-repository universe && sudo add-apt-repository ppa:certbot/certbot -y && sudo apt-get update && sudo apt-get install certbot python-certbot-nginx python3-certbot-dns-cloudflare

Obtener Certificado Wildcard SSL

sudo certbot certonly --dns-cloudflare --dns-cloudflare-credentials /root/.secrets/cloudflare.ini -d example.com,*.example.com --preferred-challenges dns-01

Establecer la Renovación Automática usando Cron Job

  • Escribe crontab -e
  • Escribe 1 para editor nano
  • Ingresa el siguiente comando y guarda
14 5 * * * /usr/bin/certbot renew --quiet --post-hook "/usr/sbin/service nginx reload" > /dev/null 2>&1

Test renovación

certbot renew --dry-run

6. Configurar Nginx Server Block

Esto es importante donde necesitas configurar tu dominio, cómo NGINX debe manejar tus solicitudes HTTP.

Elimina los server blocks predeterminados.

rm /etc/nginx/sites-available/default && rm /etc/nginx/sites-enabled/default

Crear un nuevo server block

cd /etc/nginx/sites-available/
nano example.com
  1. Reemplaza example.com con tu propio dominio
  2. Ingresa el código de abajo y Presiona ctrl+o para guardar y ctrl+x para salir.
server {
    listen         80;
    return 301 https://$host$request_uri;
}
server {
root /var/www/html;
index index.php index.html index.htm;
server_name .example.com;
client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
        ssl on;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:20m;
        ssl_session_timeout 20m;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;

location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}

location ~* \.php$ {
if ($uri !~ "^/uploads/") {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
}
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
}
location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
log_not_found off;
access_log off;
allow all;
}

location ~* .(css|gif|ico|jpeg|jpg|js|png)$ {
expires 1y;
log_not_found off;
}

# Enable Gzip compression.
gzip on;

# Disable Gzip on IE6.
gzip_disable "msie6";

# Allow proxies to cache both compressed and regular version of file.
# Avoids clients that don't support Gzip outputting gibberish.
gzip_vary on;

# Compress data, even when the client connects through a proxy.
gzip_proxied any;

# The level of compression to apply to files. A higher compression level increases
# CPU usage. Level 5 is a happy medium resulting in roughly 75% compression.
gzip_comp_level 5;

# Compress the following MIME types.
gzip_types
 application/atom+xml
 application/javascript
 application/json
 application/ld+json
 application/manifest+json
 application/rss+xml
 application/vnd.geo+json
 application/vnd.ms-fontobject
 application/x-font-ttf
 application/x-web-app-manifest+json
 application/xhtml+xml
 application/xml
 font/opentype
 image/bmp
 image/svg+xml
 image/x-icon
 text/cache-manifest
 text/css
 text/plain
 text/vcard
 text/vnd.rim.location.xloc
 text/vtt
 text/x-component
 text/x-cross-domain-policy;
}

Si quieres usar FastCGI Cache entonces implementa el siguiente server block en su lugar.

fastcgi_cache_path /var/www/cache levels=1:2 keys_zone=WORDPRESS:100m inactive=6h;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
fastcgi_cache_use_stale error timeout invalid_header http_500;
fastcgi_ignore_headers Cache-Control Expires Set-Cookie;

server {
    listen         80;
    return 301 https://$host$request_uri;
}
server {
root /var/www/html;
index index.php index.html index.htm;
server_name .example.com;
client_max_body_size 0;

    listen [::]:443 ssl http2 ipv6only=on;
    listen 443 ssl http2;
        ssl on;
        ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_prefer_server_ciphers on;
        ssl_session_cache   shared:SSL:20m;
        ssl_session_timeout 20m;
        ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;


set $skip_cache 0;
    if ($request_method = POST) {set $skip_cache 1;}
    if ($query_string != "") {set $skip_cache 1;}
    if ($request_uri ~* "/wp-admin/|/xmlrpc.php|/wp-.*.php|index.php|sitemap(_index)?.xml") {set $skip_cache 1;}
    if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {set $skip_cache 1;}

location / {
        try_files $uri $uri/ /index.php?$args;
}

# Pass all .php files onto a php-fpm or php-cgi server
location ~* \.php$ {
        try_files                       $uri =404;
        include                         /etc/nginx/fastcgi_params;
        fastcgi_param                   SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass                    unix:/run/php/php7.4-fpm.sock;
        fastcgi_index                   index.php;
                fastcgi_cache_bypass $skip_cache;
                fastcgi_no_cache $skip_cache;
                fastcgi_cache WORDPRESS;
                fastcgi_cache_valid 200 301 24h;
                add_header X-Cache $upstream_cache_status;

}

location = /favicon.ico {
log_not_found off;
access_log off;
}

location = /robots.txt {
log_not_found off;
access_log off;
allow all;
}

location ~* .(css|gif|ico|jpeg|jpg|js|png)$ {
expires 1y;
log_not_found off;
}

# Enable Gzip compression.
gzip on;

# Disable Gzip on IE6.
gzip_disable "msie6";

# Allow proxies to cache both compressed and regular version of file.
# Avoids clients that don't support Gzip outputting gibberish.
gzip_vary on;

# Compress data, even when the client connects through a proxy.
gzip_proxied any;

# The level of compression to apply to files. A higher compression level increases
# CPU usage. Level 5 is a happy medium resulting in roughly 75% compression.
gzip_comp_level 5;

# Compress the following MIME types.
gzip_types
 application/atom+xml
 application/javascript
 application/json
 application/ld+json
 application/manifest+json
 application/rss+xml
 application/vnd.geo+json
 application/vnd.ms-fontobject
 application/x-font-ttf
 application/x-web-app-manifest+json
 application/xhtml+xml
 application/xml
 font/opentype
 image/bmp
 image/svg+xml
 image/x-icon
 text/cache-manifest
 text/css
 text/plain
 text/vcard
 text/vnd.rim.location.xloc
 text/vtt
 text/x-component
 text/x-cross-domain-policy;
}

Para guardar, presiona CTRL+O y tecla Enter . Luego sal del editor nano usando el comando CTRL+X.

En el caso de FastCGI, necesitas usar NGINX Cache plugin para purgar Cache. Nota que tu Cache path es /var/www/cache

7. Crear links simbólicos entre dos directorios

Para activar el server block, crea links simbólicos entre dos directorios (/etc/nginx/sites-available/ and /etc/nginx/sites-enable).

Asegúrate de reemplazar example.com aquí también

ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

Test de configuración

sudo nginx -t

Reinicio y actualización

service nginx restart && systemctl restart php7.4-fpm.service && systemctl restart mysql && apt-get update && apt upgrade -y

7. Instalar WordPress

Vamos a instalar WordPress en /var/www/html directory

cd /var/www/html && wget https://wordpress.org/latest.tar.gz && tar -xvzf latest.tar.gz && mv -v wordpress/* /var/www/html && rm -rf index.nginx-debian.html latest.tar.gz wordpress && chown -R www-data:www-data /var/www/ && sudo chmod -R 755 /var/www

 

8. Apuntar DNS al nuevo IP del Servidor

  • Hay dos formas de apuntar DNS. Si estás migrando el sitio a Vultr y quieres testearlo primero localmente entonces edita tus archivos hosts y apunta ahí.

Para Windows

  • Ve a propiedades de ‪C:\Windows\System32\drivers\etc\hosts
  • Cambia permiso de «Seguridad» para el control total de tu nombre de usuario actual
  • Ahora puedes editar libremente el archivo hosts y guardarlo. 

Como ejemplo, así es como debería verse

192.168.1.1 example.com
192.168.1.1 www.example.com

Para Mac o Linux

cd && nano /etc/hosts
  • Si todo está perfecto y quieres lanzar tu sitio online, inicia sesión en Cloudflare DNS y actualiza el nuevo IP
A ---------- @ -----------> Server IPV4 address
AAAA ------- @ -----------> Server IPV6 address
CNAME ------www ----------> @

donde @ denota dominio desnudo  example.com

9. Visita tu nombre de dominio para configurar WordPress

Si deseas mantener un dominio de versión que no sea www para tu WordPress, visita la versión que no sea www más www.

https://example.com
  • Proporciona la credencial de Inicio de sesión de Base de Datos para comenzar la configuración de WordPress
  • Ejecuta la instalación
  • Completa los detalles básicos de tu nuevo sitio e instala WordPress.
  • Inicia sesión en WordPress

Recursos externos

Finalmente la instalación de WordPress ha sido completada exitosamente con LEMP. Agradezco mucho tu valioso tiempo en leer este artículo. Nos vemos en el próximo tutorial!

If you've any question related to this blog post, please ask at our Gulshan Forum.

Deja un comentario