Cómo instalar Nginx con PHP y MariaDB (LEMP Stack) con Opcache, Redis y Let’s Encrypt en Fedora 32
Una pila de software LEMP es un grupo de software de código abierto que se instala conjuntamente para permitir que un servidor albergue sitios web y aplicaciones. Es un acrónimo de Linux, servidor ENginx, MySQL(usando MariaDB) y PHP.
En esta guía, instalarás una pila LEMP en un servidor basado en Fedora 32. También instalaremos phpMyAdmin, Redis, Opcache y Let’s Encrypt SSL.
Requisitos previos
Un servidor con Fedora 32.
Un usuario sudo no root.
Asegúrate de que todo está actualizado.
$ sudo dnf upgrade
Pocos paquetes que necesite tu sistema.
$ sudo dnf install wget curl nano -y
Algunos de estos paquetes pueden estar ya instalados en tu sistema.
Desactiva SELinux.
$ sudo setenforce 0
Configurar el cortafuegos
El primer paso es configurar el cortafuegos. El servidor Fedora viene con el cortafuegos Firewalld preinstalado.
Comprueba si el cortafuegos se está ejecutando.
$ sudo firewall-cmd --state
Deberías obtener la siguiente salida.
running
Configura la zona por defecto del cortafuegos como pública.
$ sudo firewall-cmd --set-default-zone=public
Comprueba los servicios/puertos permitidos actualmente.
$ sudo firewall-cmd --zone=public --permanent --list-services
Debería mostrar la siguiente salida.
dhcpv6-client mdns ssh
Permite los puertos HTTP y HTTPS.
$ sudo firewall-cmd --zone=public --permanent --add-service=http $ sudo firewall-cmd --zone=public --permanent --add-service=https
Vuelve a comprobar el estado del cortafuegos.
$ sudo firewall-cmd --zone=public --permanent --list-services
Deberías ver una salida similar.
dhcpv6-client http https mdns ssh
Vuelve a cargar el cortafuegos.
$ sudo systemctl reload firewalld
Instala PHP
Fedora 32 viene por defecto con PHP 7.4 pero para tener un repositorio de PHP actualizado, añadiremos el repositorio REMI.
Instala el repositorio REMI que es el repositorio oficial de Fedora para instalar paquetes PHP.
$ sudo dnf -y install https://rpms.remirepo.net/fedora/remi-release-32.rpm
Activa el repositorio remi
y desactiva el repositorio remi-modular
. Esto habilita el repositorio necesario para instalar los paquetes de PHP 7.4.
$ sudo dnf config-manager --set-enabled remi $ sudo dnf config-manager --set-disabled remi-modular
Instala PHP 7.4 junto con algunos paquetes adicionales.
$ sudo dnf install -y php-cli php-fpm php-mysqlnd
Comprueba si PHP funciona correctamente.
$ php --version
Deberías ver una salida similar.
PHP 7.4.6 (cli) (built: May 12 2020 08:09:15) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
Instalar MariaDB
MariaDB es un sustituto directo de MySQL, lo que significa que los comandos para ejecutar y hacer funcionar MariaDB son los mismos que los de MySQL.
Fedora 32 incluye por defecto MariaDB 10.4, que es la última versión estable disponible en este momento, así que la utilizaremos.
Para instalar MariaDB ejecuta el siguiente comando.
$ sudo dnf install mariadb-server -y
Comprueba si MariaDB se ha instalado correctamente.
$ mysql --version
Deberías ver la siguiente salida.
mysql Ver 15.1 Distrib 10.4.12-MariaDB, for Linux (x86_64) using EditLine wrapper
Activa e inicia el servicio MariaDB.
$ sudo systemctl enable mariadb $ sudo systemctl start mariadb
Ejecuta el siguiente comando para realizar la configuración por defecto, como dar una contraseña de root, eliminar los usuarios anónimos, no permitir el inicio de sesión de root de forma remota y eliminar las tablas de prueba.
$ sudo mysql_secure_installation
Con MariaDB 10.4, ahora se te preguntará entre utilizar la contraseña de root o el plugin unix_socket. El plugin unix_socket te permite entrar en MariaDB con tus credenciales de usuario de Linux. Se considera más seguro, aunque necesitarás un nombre de usuario/contraseña tradicional para utilizar aplicaciones de terceros como phpMyAdmin. En este tutorial nos limitaremos a utilizar el plugin unix_socket. Puedes seguir utilizando phpMyAdmin a través de cualquier usuario específico que crees para tus bases de datos.
Al pulsar Intro se elige la opción por defecto (la que está en mayúsculas, Y en este caso).
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!
In order to log into MariaDB to secure it, we'll need the current
password for the root user. If you've just installed MariaDB, and
haven't set the root password yet, you should just press enter here.
Enter current password for root (enter for none): [PRESS ENTER]
OK, successfully used password, moving on...
Setting the root password or using the unix_socket ensures that nobody
can log into the MariaDB root user without the proper authorisation.
You already have your root account protected, so you can safely answer 'n'.
Switch to unix_socket authentication [Y/n] [PRESS ENTER]
Enabled successfully!
Reloading privilege tables..
... Success!
You already have your root account protected, so you can safely answer 'n'.
Change the root password? [Y/n] [ANSWER n]
... skipping.
By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them. This is intended only for testing, and to make the installation
go a bit smoother. You should remove them before moving into a
production environment.
Remove anonymous users? [Y/n] [PRESS ENTER]
... Success!
Normally, root should only be allowed to connect from 'localhost'. This
ensures that someone cannot guess at the root password from the network.
Disallow root login remotely? [Y/n] [PRESS ENTER]
... Success!
By default, MariaDB comes with a database named 'test' that anyone can
access. This is also intended only for testing, and should be removed
before moving into a production environment.
Remove test database and access to it? [Y/n] [PRESS ENTER]
\- Dropping test database...
... Success!
\- Removing privileges on test database...
... Success!
Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] [PRESS ENTER]
... Success!
Cleaning up...
All done! If you've completed all of the above steps, your MariaDB
installation should now be secure.
Thanks for using MariaDB!
Eso es todo. La próxima vez que quieras acceder a MySQL, utiliza el siguiente comando
$ sudo mysql
Introduce tu contraseña de root cuando se te pida.
Instalar Redis
Fedora 32 contiene la v5.0.8 del paquete Redis, pero el repositorio Remi que instalamos antes para PHP lleva la última versión de Redis (v6.0.1) en el momento de escribir este tutorial.
Utiliza el siguiente comando para instalar Redis y la correspondiente extensión PHP Redis.
$ sudo dnf install redis php-redis
Activa el servicio Redis.
$ sudo systemctl enable --now redis
Configurar el servidor Redis
Vamos a realizar algunas configuraciones básicas en el servidor Redis.
Abre el archivo /etc/redis.conf
con el editor Nano.
$ sudo nano /etc/redis.conf
Si quieres que los clientes remotos se conecten a tu instancia de Redis, busca la línea bind 127.0.0.1
y cámbiala por la siguiente.
bind 0.0.0.0
También puedes cambiar el puerto por defecto en el que Redis escucha de 6379 a un valor de tu elección.
port 3458
Para configurar Redis como servidor de caché, establece los siguientes valores como se indica.
maxmemory 256mb
maxmemory-policy allkeys-lru
Esto indica a Redis que elimine cualquier clave utilizando el algoritmo LRU cuando se alcance la memoria máxima de 256MB. Puedes establecer el valor de la memoria según tus necesidades y el servidor que estés utilizando.
Puedes establecer una contraseña para que cualquier cliente que necesite Redis tenga que autenticarse primero. Para ello establece una contraseña utilizando la siguiente directiva.
requirepass <AuthPassword>
Puedes encontrar más directivas para cambiar en el archivo de configuración. Cuando hayas terminado, pulsa Ctrl + X e introduce Y cuando se te pida que guardes el archivo.
Reinicia el servidor Redis para aplicar los cambios.
$ sudo systemctl restart redis
También tendremos que añadir la regla en nuestro Firewall para permitir que Redis funcione.
$ sudo firewall-cmd --zone=public --permanent --add-port=6379/tcp $ sudo firewall-cmd --reload
Tendrás que cambiar el valor en el comando anterior para que coincida con el puerto que hayas elegido en el archivo de configuración anterior.
Instalar Nginx
Fedora 32 incluye por defecto la última versión estable de Nginx. (1.18.0).
Instala Nginx.
$ sudo dnf install nginx -y
Comprueba si funciona correctamente.
$ nginx -v
Deberías ver el siguiente resultado dependiendo de la versión de Nginx que hayas elegido instalar.
nginx version: nginx/1.18.0
Inicia y activa Nginx.
$ sudo systemctl start nginx $ sudo systemctl enable nginx
Abre la dirección IP de tu servidor en un navegador para ver la siguiente página. Esto significa que Nginx está funcionando correctamente.
Configurar Nginx
Configura los directorios donde vivirán los bloques del servidor.
$ sudo mkdir /etc/nginx/sites-available $ sudo mkdir /etc/nginx/sites-enabled
Crea el directorio donde vivirá tu sitio.
$ sudo mkdir /var/www/example.com/html -p
El uso de la directiva -p crea directorios padre que antes no existían.
Ejecuta el siguiente comando para añadir un archivo de configuración para tu sitio.
$ sudo nano /etc/nginx/sites-available/example.com.conf
Pega el siguiente código en el editor.
server {
listen *:80;
server_name example.com;
root /var/www/example.com/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
include fastcgi_params;
}
}
Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida que guardes el archivo.
Este archivo asume que vamos a alojar example.com
en el directorio /var/www/html
. Si no vas a utilizar ningún dominio y vas a configurar tu servidor para que sea accesible sólo a través de la dirección IP/localhost, tendrás que eliminar la configuración del bloque de servidor correspondiente del archivo nginx.conf
, ya que de lo contrario se estropeará el bloque de servidor que crearás.
Activa este archivo de configuración vinculándolo al directorio sites-enabled
.
$ sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
Abre el archivo /etc/nginx/nginx.conf
para editarlo.
$ sudo nano /etc/nginx/nginx.conf
Pega las siguientes líneas después de la línea include /etc/nginx/conf.d/*.conf
include /etc/nginx/sites-enabled/*.conf;
server_names_hash_bucket_size 64;
Cambia el valor de types_hash_max_size
de 2048 a 4096.
types_hash_max_size 4096;
Pulsa Ctrl + X para cerrar el editor y pulsa Y cuando se te pida guardar el archivo. Prueba la configuración de Nginx.
$ sudo nginx -t
Deberías ver la siguiente salida que indica que tu configuración es correcta.
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Vuelve a cargar el servicio Nginx.
$ sudo systemctl reload nginx
Configurar PHP-FPM
Abre el archivo /etc/php-fpm.d/www.conf
.
$ sudo nano /etc/php-fpm.d/www.conf
Necesitamos establecer el usuario/grupo Unix de los procesos PHP a nginx. Busca las líneas user=apache
y group=apache
en el archivo y cámbialas por nginx.
...
; Unix user/group of processes
; Note: The user is mandatory. If the group is not set, the default user's group
; will be used.
; RPM: apache user chosen to provide access to the same directories as httpd
user = nginx
; RPM: Keep a group allowed to write in log dir.
group = nginx
...
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando te lo pida.
Reinicia el proceso PHP-fpm.
$ sudo systemctl restart php-fpm
Para probar tu configuración de PHP, crea un archivo test.php
en la carpeta html
.
$ sudo nano /var/www/example.com/html/test.php
Añade el siguiente contenido y guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te solicite.
<?php phpinfo();
Inicia http://<yourserverip>/test.php
en tu navegador web y deberías ver lo siguiente.
Instalar phpMyAdmin
El Repositorio Remi tiene la última versión de phpMyAdmin, por lo que podemos instalarla simplemente con el siguiente comando.
$ sudo dnf install phpmyadmin
Se instala en el directorio /usr/share/phpMyAdmin
.
Configurar phpMyAdmin
Para que el servidor web Nginx encuentre y sirva correctamente los archivos de phpMyAdmin, tendremos que crear un enlace simbólico desde su ubicación real al directorio raíz de documentos de Nginx.
Para ello, ejecuta el siguiente comando.
$ sudo ln -s /usr/share/phpmyadmin /var/www/example.com/html/phpmyadmin
Tu instalación de phpMyAdmin está operativa. Para acceder a ella, sólo tienes que abrir http://example.com/phpmyadmin.
Si obtienes errores de sesión de php, ejecuta el siguiente comando para dar los permisos adecuados al directorio de sesión de PHP. Comprueba la ruta de tu sesión en el archivo test.php
que hemos creado antes. Para nosotros está en /var/lib/php/session
.
$ sudo chown -R nginx:nginx /var/lib/php/session
Por defecto, esta ubicación predeterminada debe cambiarse, ya que es la ubicación más común en la que cualquier hacker puede localizar tu instalación de phpMyAdmin. Para ello, ejecuta el siguiente comando.
$ sudo mv phpmyadmin sm123
Básicamente, hemos movido la ubicación de nuestro phpMyAdmin a la carpeta sm123
. Para acceder a ella, ahora tendrás que abrir http://example.com/sm123 en tu navegador.
Como aquí estamos utilizando unix_authentication con MySQL, no hay un usuario raíz con el que iniciar sesión a través de phpMyAdmin. Tendrás que crear primero un usuario MySQL y darle privilegios a las bases de datos para poder utilizar phpMyAdmin.
Configurar Opcache
Al instalar phpMyAdmin desde el repositorio de Remi, también se instala Opcache. En caso de que no hayas instalado phpMyAdmin y no quieras hacerlo, puedes simplemente instalar Opcache utilizando el siguiente comando.
$ sudo dnf install php-opcache
Comprueba que se ha instalado.
$ php -v PHP 7.4.5 (cli) (built: Apr 14 2020 12:54:33) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies
Para cambiar la configuración de Opcache, abre el archivo /etc/php.d/10-opcache.ini
.
$ sudo nano /etc/php.d/10-opcache.ini
Las siguientes configuraciones deberían servirte para empezar a utilizar Opcache y, en general, se recomiendan para obtener un buen rendimiento. Puedes habilitar una configuración quitando ;
delante de ella.
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=60
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
Reinicia tu servidor para aplicar la configuración.
$ sudo systemctl reload nginx
Instalar SSL a través de Let's Encrypt
El SSL se ha convertido en una parte esencial de cualquier sitio web. Aquí vamos a instalar el SSL utilizando el servicio Let's Encrypt.
Para ello, primero instala la herramienta Certbot.
$ sudo dnf install certbot-nginx
Genera los certificados.
$ sudo certbot --nginx -d example.com -d www.example.com -d phpmyadmin.example.com
Vamos a crear certificados para ambos: nuestro sitio principal y el dominio phpMyAdmin.
Si es la primera vez que ejecutas certbot en tu sistema, se te pedirá una dirección de correo electrónico y que aceptes las condiciones del servicio. También se te preguntará si aceptas compartir datos con la fundación EFF, a lo que puedes decir que no. Tras hacerlo, certbot se comunicará con los servidores de Let's Encrypt y ejecutará un reto para verificar tus dominios.
Si se realiza con éxito, se te preguntará cómo manejar las redirecciones HTTPS.
Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
Selecciona tu opción y pulsa Intro. Se crearán tus certificados y tu configuración de Nginx se actualizará con la configuración SSL.
Tus certificados están listos y ya puedes abrir tu sitio accediendo a https://example.com
Configurar la renovación automática de SSL
Este es el último paso antes de terminar este tutorial. Para renovar el SSL, utilizaremos cron.
Tenemos que añadir una entrada a Cron utilizando el editor Crontab. Para abrir el editor crontab, ejecuta el siguiente comando.
$ EDITOR=nano sudo crontab -e
EDITOR=nano
delante del comando asegura que crontab nos abra el editor Nano porque Fedora por defecto prefiere el editor VIM.
Pega la siguiente línea en la parte inferior.
. . .
25 2 * * * /usr/bin/certbot renew --quiet
La parte 25 2 * * *
de esta línea significa "ejecutar el siguiente comando a las 2:25 de la madrugada, todos los días". Puedes elegir cualquier hora.
Guarda el archivo pulsando Ctrl + X e introduciendo Y cuando se te pida.
El comando renew
para Certbot comprobará todos los certificados instalados en el sistema y actualizará los que vayan a caducar en menos de treinta días. --quiet
indica a Certbot que no emita información ni espere la entrada del usuario.
Este comando se ejecutará diariamente.
Conclusión
Eso es todo en este tutorial. Tu configuración de LEMP está completa y puedes empezar a crear y alojar tus sitios web y aplicaciones.