Me he decidido a contratar un VPS en Digital Ocean, a ver si de una vez por todas en mi escaso tiempo libre, puedo ir desarrollando un portfolio y aprendiendo cosas nuevas. Vamos a ver un listado de la configuración de un VPS desde cero, partiendo de una instalación limpia de Ubuntu 16.04. Vayamos por partes:
Configuración inicial del servidor
En este apartado hablaremos de la configuración inicial básica para que nuestro VPS sea más seguro. Lo primero de todo es conectarnos a nuestro servidor, para ello utilizaremos ssh para establecer conexión remota por consola, con el usuario root, hasta que creemos otro usuario. Podemos conectarnos desde la consola de nuestro sistema operativo (Mac, Linux), o utilizar alguna utilidad como Putty, que es un cliente SSH gratuito y archiconocido para Windows. Para conectarnos deberemos saber la dirección IP pública de nuestro servidor y ejecutar el siguiente comando:
ssh root@your_server_ip
Al ser la primera conexión, veremos un mensaje informándonos que no se puede asegurar la autenticidad de la conexión, escribiremos yes para establecer conexión:
The authenticity of host '1XX.XXX.XXX.XXX' can't be established. ECDSA key fingerprint is SHA256:71mD5o12895hg7tu85lPFDY1khktRcuPnsfCQFrTaK0. Are you sure you want to continue connecting (yes/no)?
Y se nos solicitará cambiar la contraseña root por seguridad. El usuario root tiene todos los privilegios y no es una buena idea hacer un uso regular de él ya que por accidente podemos ejecutar acciones destructivas e irreversibles. Por este motivo, el siguiente paso será crear otro usuario para conectarnos normalmente con él, para ello ejecutamos el siguiente comando y contestamos unas sencillas preguntas:
adduser mike
Tras crear nuestro nuevo usuario, le otorgaremos permisos de super usuario para poder ejecutar comandos con privilegios de root anteponiendo la palabra sudo.
usermod -aG sudo mike
Abriremos una nueva terminal, y probaremos a conectar con nuestro nuevo usuario para verificar que podemos hacer login correctamente:
ssh mike@your_server_ip
Todo servidor web que se precie debe contar con un Firewall, hay muchas opciones, una de las más sencillas y que viene ya incluida en Ubuntu es UFW. Con UFW podremos controlar qué servicios tienen acceso a la conexión. Para ver la lista de aplicaciones registradas en el firewall, ejecutamos el siguiente comando:
sudo ufw app list
Obteniendo como resultado:
Available applications: OpenSSH
Es muy importante que permitamos el acceso a OpenSSH, de lo contrario la próxima vez que vayamos a conectarnos no podremos, algo que no debe ocurrir. Para ello añadimos OpenSSH:
sudo ufw allow OpenSSH
Y sólo después de esto activaremos el firewall:
bashsudo ufw enable
En cualquier momento podemos comprobar los aplicaciones que hemos permitido o denegado a través del comando:
bashsudo ufw status
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
A partir de ahora será necesario que en futuras aplicaciones y/o servicios instalados, permitamos que realice conexiones añadiéndolas a ufw.
Instalación de LEMP
LEMP son las siglas que indican un servidor con sistema operativo Linux, Nginx como servidor web, PHP como procesador dinámico y MySQL como base de datos para el backend. Algo muy común por ejemplo a la hora de tener una página en WordPress. Vamos a ver como instalar en nuestro VPS estos paquetes:
Instalar Nginx
Nginx es un servidor web de código abierto, uno de los más usados en el mundo junto con Apache. Cada uno tiene sus pros y sus contras, yo he optado por Nginx. Antes de nada, actualizaremos el repositorio apt de nuestro servidor, y posteriormente instalaremos nginx:
sudo apt-get update
sudo apt-get install nginx
Una vez instalado se inicia el servicio automáticamente, acto seguido deberemos registrar nginx en ufw:
sudo ufw allow 'Nginx HTTP'
sudo ufw status
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere Nginx HTTP ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) Nginx HTTP (v6) ALLOW Anywhere (v6)
Hecho esto, ya solo deberemos acceder a la dirección IP pública de nuestro VPS para ver la página de bienvenida de nginx.
Instalar MySQL
Para instalarlo simplemente ejecutamos:
sudo apt-get install mysql-server
Nos pedirá una contraseña para el usuario root. Una vez instalado es altamente recomendable ejecutar un script de seguridad para eliminar configuraciones inseguras, usuarios de ejemplo y bases de datos de prueba.
sudo mysql_secure_installation
Tan sólo hay que seguir el asistente introduciendo el carácter y
para contestar que sí.
Instalar PHP
Nginx por defecto no cuenta con procesamiento para PHP. Para ello deberemos instalar php-fpm
. Tecleamos en la terminal:
sudo apt-get install php-fpm php-mysql
A continuación editaremos la configuración de PHP para hacerla más segura:
sudo nano /etc/php/7.0/fpm/php.ini
Pulsando F6, buscaremos la siguiente cadena: “cgi.fix_pathinfo”. Pondremos su valor en 0 para desactivarlo, ya que con esta configuración activada podría permitirse a un usuario malintencionado ejecutar scripts a los que normalmente no debería tener acceso. Cerramos, guardamos y reiniciamos el servicio:
sudo systemctl restart php7.0-fpm
Habilitar PHP en Nginx
Con Nginx podemos tener distintas configuraciones de servidor para distintos sitios (dominios, subdominios…). Inicialmente solo tendremos un sitio, llamado default. Vamos a habilitar PHP editando el fichero default, además de algunas configuraciones de seguridad:
sudo nano /etc/nginx/sites-available/default
Añadiremos index.php
como posible entrada por defecto de un directorio, podremos modificar server_name
, para poder acceder a través de dominio en lugar de nuestra IP pública, que es la que vendrá por defecto. Habilitaremos PHP con las líneas marcadas en rojo y evitaremos el procesamiento de archivos .htaccess
por motivos de seguridad.
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html index.php; # server_name tudominio.com; server_name 1XX.XX.XX.XX; location / { try_files $uri $uri/ =404; } # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php7.0-fpm.sock; } # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # location ~ /\.ht { deny all; } }
Cerramos, guardamos el fichero y haremos un test para verificar que no hay ningún error de sintaxis en la configuración de Nginx:
bashsudo nginx -t
Si no hay errores, reiniciamos el servicio para que pueda aplicarse la nueva configuración:
bashsudo systemctl reload nginx
Para finalizar, iremos a la carpeta /var/www/html y crearemos un fichero index.php, con el siguiente contenido:
<?php
phpinfo();
?>
Ahora simplemente accediendo a nuestra dirección IP pública o dominio, deberemos ver una página con toda la configuración de PHP. Cuando hayamos verificado que está funcionando, borraremos el fichero y ya tendremos nuestro servidor LEMP con la configuración inicial para poder hacer cosas.