Cómo montar un entorno de producción para Wordpress

Requisitos en el servidor

Instalación de Mysql [^1^].

Seguimos el post de digital ocean.

sudo apt update

sudo apt install mysql-server
## Keypress Y to confirm...

sudo systemctl start mysql.service

Proteger y asegurar la instalación de Mysql

sudo mysql

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

mysql> exit

sudo mysql_secure_installation
## Indicar a todo que y
## Proveer una contraseña strong que se genere con keePass por ejemplo

mysql -u root -p

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;

## Ahora se puede autenticar con
sudo mysql
## o
mysql -u root -p

Crear un usuario dedicado

sudo mysql
mysql> CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Query OK, 0 rows affected (0.01 sec)

Hace falta cambiar sammy y password por el usuario y la password creada en keepass. Como nota, estamos utilizando el plugin de autenticación auth_socket.

Crear una base de datos y asignar permisos al usuario

mysql> CREATE DATABASE DATABASE_NAME DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
Query OK, 1 row affected (0.03 sec)

mysql> GRANT ALL ON DATABASE_NAME.* TO 'sammy'@'localhost';
Query OK, 0 rows affected (0.02 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> exit;

$ mysql -u sammy -p

mysql> create database DATABASE_NAME;
Query OK, 1 row affected (0.01 sec)

Hace falta cambiar DATABASE_NAME y sammy. Después de crear el usuario y darle los permisos, podemos crear la base de datos a la cual tiene permisos.

Instalación inicial del servidor [^3^]

Hacer login con root y ssh

Para ello seguir la siguiente guía

Crear un usuario nuevo

ssh root@IP
adduser sammy

Crear una password segura y asignarla al usuario.

Dotar al nuevo usuario de permisos administrativos

usermod -aG sudo sammy

Crear un usuario aislado

sudo groupadd groupname
sudo useradd -g groupname -m username

Editar el fichero de sudouers para hacer que el usuario solo tenga permisos de root en su propio directorio de inicio.

sudo visudo
## buscar la línea que parezca a
%sudo ALL=(ALL:ALL) ALL
## y añadir debajo
username  ALL=(ALL:ALL) NOPASSWD: /home/username/

guardar y cerrar fichero

Configurar el firewall

ufw app list
ufw allow OpenSSH
ufw enable
ufw status

Para mirar más configuración y entender cómo funciona el firewall de ubuntu repasar [^5^].

Configurar el nuevo usuario para tener conexión

La idea es copiar los permisos de root en el nuevo usuario sammy. Más concretamente copiar el contenido del fichero ~/.ssh/authorized_keys.

rsync --archive --chown=sammy:sammy ~/.ssh /home/sammy

y probar la conexión por ssh:

ssh sammy@IP

Instalación de Nginx [^2^]

Actualizar el servidor

sudo apt update
sudo apt install nginx

Actualizar el firewall

sudo ufw app list

Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Necesitamos incluir NGINX.

sudo ufw allow 'Nginx Full'

Comprobar que NGINX está bien instalado

systemctl status nginx

 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; preset: enabled)
     Active: active (running) since Tue 2023-05-09 10:04:58 UTC; 1min 27s ago
       Docs: man:nginx(8)
    Process: 17274 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 17275 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 17359 (nginx)
      Tasks: 2 (limit: 1116)
     Memory: 2.6M
        CPU: 30ms
     CGroup: /system.slice/nginx.service
             ├─17359 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─17362 "nginx: worker process"

Crear un nuevo directorio para albergar el contenido del proyecto

## Crear un directorio con el nombre del dominio
sudo mkdir -p /var/www/your_domain/html

## Asignar la propiedad de la carpeta al usuario nuevo que creamos
sudo chown -R $USER:$USER /var/www/your_domain/html

## Dar los permisos necesarios
sudo chmod -R 755 /var/www/your_domain

## Crear una página de prueba
nano /var/www/your_domain/html/index.html

Copiar el siguiente código

<html>
    <head>
        <title>Welcome to your_domain!</title>
    </head>
    <body>
        <h1>Success!  The your_domain server block is working!</h1>
    </body>
</html>

Crear un nuevo server block en NGINX

sudo nano /etc/nginx/sites-available/your_domain

y copiar el siguiente bloque de configuración NGINX:

server {
        listen 80;
        listen [::]:80;

        root /var/www/your_domain/html;
        index index.html index.htm index.nginx-debian.html;

        server_name your_domain www.your_domain;

        location / {
                try_files $uri $uri/ =404;
        }
}

Habilitar el nuevo sitio

sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/

## Deshabilita el sitio por defecto
sudo unlink /etc/nginx/sites-enabled/default

Ajustar NGINX

sudo nano /etc/nginx/nginx.conf

descomentar la línea que indica server_names_hash_bucket_size (buscar en nano con CTRL W).

sudo nginx -t

sudo systemctl restart nginx

Instalación de PHP [^6^]

sudo apt install php8.1-fpm php-mysql

Configurar NGINX para usar PHP

sudo nano /etc/nginx/sites-available/your_domain

y copiar el siguiente código de configuración

server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
     }

    location ~ /\.ht {
        deny all;
    }

}

Comprobar que todo está bien con PHP

Escribir un script de prueba en /var/www/your_domain

<?php
phpinfo();

y navegar a http://server_domain_or_IP/info.php para verlo. Si todo está OK se debe mostrar la info de PHP del servidor.

Instalar Composer [^7^]

$ php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
$ php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
$ php composer-setup.php
$ php -r "unlink('composer-setup.php');"

$ sudo mv composer.phar /usr/local/bin/composer
$ composer --version
Composer version 2.5.5 2023-03-21 11:50:05

Referencias

[1]: Hazel Virdó, Mark Drake (2022). How To Install MySQL on Ubuntu 20.04 . https://www.digitalocean.com/community/tutorials/how-to-install-mysql-on-ubuntu-20-04

[2] Alex Garnett (2022). How To Install Nginx on Ubuntu 22.04 . https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-22-04

[3] Jamon Camisso (2022). Initial Server Setup with Ubuntu 22.04 . https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-22-04

[5]: Mitchell Anicas, Erika Heidi (2015) UFW Essentials: Common Firewall Rules and Commands . https://www.digitalocean.com/community/tutorials/ufw-essentials-common-firewall-rules-and-commands

[6]: Erika Heidi, Jeanelle Horcasitas (2022). How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu 22.04 . https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-on-ubuntu-22-04

[7] https://getcomposer.org/download/

[8] Borrar mysql . https://www.digitalocean.com/community/questions/completely-uninstall-mysql-server