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