{"id":58,"date":"2025-04-07T20:33:29","date_gmt":"2025-04-08T00:33:29","guid":{"rendered":"https:\/\/juredev.com\/blog\/?p=58"},"modified":"2025-04-07T20:33:29","modified_gmt":"2025-04-08T00:33:29","slug":"guia-facil-configura-tu-servidor-web-con-nginx-php-8-2-y-mariadb-en-debian-12","status":"publish","type":"post","link":"https:\/\/juredev.com\/blog\/2025\/04\/guia-facil-configura-tu-servidor-web-con-nginx-php-8-2-y-mariadb-en-debian-12\/","title":{"rendered":"Gu\u00eda F\u00e1cil: Configura tu Servidor Web con Nginx, PHP 8.2 y MariaDB en Debian 12"},"content":{"rendered":"\n<p>\u00bfQuieres montar tu propio servidor web en Debian 12 con Nginx, PHP y MariaDB? En esta gu\u00eda te explico c\u00f3mo hacerlo paso a paso, de manera sencilla y pr\u00e1ctica. Est\u00e1 pensada para quienes est\u00e1n empezando con servidores Linux y buscan un entorno b\u00e1sico para probar ideas o experimentar, antes de dar el salto a algo m\u00e1s serio como un servidor en producci\u00f3n. Adem\u00e1s, te dejo algunos consejos para mejorar el rendimiento y la seguridad. \u00a1Manos a la obra!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conceptos Clave<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Servidor Web (Nginx):<\/strong> Escucha lo que piden los navegadores y les env\u00eda p\u00e1ginas web, ya sean archivos simples o din\u00e1micos.<\/li>\n\n\n\n<li><strong>Base de Datos (MariaDB):<\/strong> Guarda y organiza datos, como los usuarios de una app o los posts de un blog.<\/li>\n\n\n\n<li><strong>PHP-FPM (PHP 8.2):<\/strong> El motor que permite a Nginx ejecutar c\u00f3digo PHP. Usaremos la versi\u00f3n 8.2, que viene con Debian 12, para crear p\u00e1ginas que se adapten a lo que necesitas.<\/li>\n\n\n\n<li><strong>HTTP y HTTPS:<\/strong> HTTP mueve la informaci\u00f3n en la web. HTTPS hace lo mismo, pero cifrado, para que nadie esp\u00ede tus datos.<\/li>\n<\/ul>\n\n\n\n<p>Con esto en mente, \u00a1est\u00e1s listo para avanzar!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 1: Mant\u00e9n tu Sistema al D\u00eda<\/h2>\n\n\n\n<p>Primero, asegura que tu Debian 12 est\u00e9 actualizado. Abre la terminal y escribe:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo apt update\nsudo apt upgrade -y\n<\/code><\/p>\n\n\n\n<p><code>update<\/code> refresca la lista de paquetes disponibles, y <code>upgrade<\/code> instala las \u00faltimas versiones de lo que ya tienes. El <code>-y<\/code> dice \u00abs\u00ed\u00bb a todo autom\u00e1ticamente, para que sea m\u00e1s r\u00e1pido.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 2: Instala Nginx, tu Servidor Web<\/h2>\n\n\n\n<p>Nginx es ligero, r\u00e1pido y perfecto para empezar. Inst\u00e1lalo con:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo apt install nginx -y\n<\/code><\/p>\n\n\n\n<p>Cuando acabe, comprueba que funciona: abre tu navegador y escribe la IP de tu servidor (la de tu VPS o m\u00e1quina). Si ves \u00abWelcome to Nginx!\u00bb, \u00a1vas por buen camino!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 3: A\u00f1ade MariaDB para tus Datos<\/h2>\n\n\n\n<p>MariaDB es ideal para almacenar la informaci\u00f3n de tus proyectos. Inst\u00e1lala as\u00ed:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo apt install mariadb-server -y\n<\/code><\/p>\n\n\n\n<p>Despu\u00e9s, asegura su instalaci\u00f3n con:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo mysql_secure_installation\n<\/code><\/p>\n\n\n\n<p>Te pedir\u00e1 cosas como poner una contrase\u00f1a para el usuario root, eliminar cuentas an\u00f3nimas, desactivar accesos remotos innecesarios y borrar una base de datos de prueba. Responde \u00abs\u00ed\u00bb a casi todo; es un paso r\u00e1pido y esencial.<\/p>\n\n\n\n<p><strong>Crea una Base de Datos y un Usuario<\/strong><\/p>\n\n\n\n<p>Prepara una base de datos para tus aplicaciones. Entra a MariaDB con:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo mariadb\n<\/code><\/p>\n\n\n\n<p>Y ejecuta estos comandos (personaliza nombres y contrase\u00f1as):<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nCREATE DATABASE mi_base_de_datos;\nCREATE USER 'mi_usuario'@'localhost' IDENTIFIED BY 'mi_contrase\u00f1a';\nGRANT ALL PRIVILEGES ON mi_base_de_datos.* TO 'mi_usuario'@'localhost';\nFLUSH PRIVILEGES;\nEXIT;\n<\/code><\/p>\n\n\n\n<p>Esto crea una base de datos (<code>mi_base_de_datos<\/code>) y un usuario (<code>mi_usuario<\/code>) con acceso solo a ella. \u00a1Lista para usar!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 4: Conecta Nginx con PHP 8.2<\/h2>\n\n\n\n<p>Para manejar p\u00e1ginas din\u00e1micas, instala PHP-FPM 8.2 y el m\u00f3dulo para MariaDB:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo apt install php8.2-fpm php8.2-mysql -y\n<\/code><\/p>\n\n\n\n<p>Ahora, configura Nginx para procesar archivos PHP. Abre el archivo por defecto:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo nano \/etc\/nginx\/sites-available\/default\n<\/code><\/p>\n\n\n\n<p>Busca (o a\u00f1ade) la secci\u00f3n location <code>~ \\.php$<\/code> y aseg\u00farate de que quede as\u00ed, usando el socket de PHP 8.2:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nlocation ~ \\.php$ {\n    include snippets\/fastcgi-php.conf;\n    # Aseg\u00farate que esta l\u00ednea apunta al socket de tu versi\u00f3n de PHP\n    fastcgi_pass unix:\/run\/php\/php8.2-fpm.sock;\n    # A\u00f1ade estas l\u00edneas si no existen dentro del bloque location\n    # include fastcgi_params;\n    # fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;\n}\n<\/code><\/p>\n\n\n\n<p>Nota: A veces, las l\u00edneas <code>include fastcgi_params;<\/code> y <code>fastcgi_param SCRIPT_FILENAME...<\/code> son necesarias si no est\u00e1n incluidas por defecto en <code>snippets\/fastcgi-php.conf<\/code><\/p>\n\n\n\n<p>Guarda (Ctrl+O, Enter, Ctrl+X en Nano) y reinicia los servicios:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo systemctl restart nginx\nsudo systemctl restart php8.2-fpm\n<\/code><\/p>\n\n\n\n<p>Esto hace que Nginx pase los archivos PHP a PHP-FPM 8.2 por un \u00absocket\u00bb, un canal interno que los conecta.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 5: Prueba que Todo Funciona<\/h2>\n\n\n\n<p>Vamos a verificar que todo est\u00e1 bien. Crea un archivo de prueba:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo nano \/var\/www\/html\/info.php\n<\/code><\/p>\n\n\n\n<p>Pega esto:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\n&lt;?php\nphpinfo();\n?&gt;\n<\/code><\/p>\n\n\n\n<p>Guarda y cierra. En tu navegador, visita http:\/\/\/info.php. Si aparece una p\u00e1gina con detalles de PHP (busca \u00abPHP Version 8.2.x\u00bb), \u00a1funciona perfecto!<\/p>\n\n\n\n<p><strong>Cuidado:<\/strong> Este archivo muestra info sensible. B\u00f3rralo con <code>sudo rm \/var\/www\/html\/info.php<\/code> cuando termines, sobre todo si esto pasa de ser un experimento.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Paso 6: Cuida la Seguridad<\/h2>\n\n\n\n<p>Tu servidor ya est\u00e1 listo, pero prot\u00e9gelo con estos consejos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Firewall:<\/strong> Usa <code>ufw<\/code> para limitar el tr\u00e1fico. Por ejemplo, permite solo SSH (puerto 22), HTTP (80) y HTTPS (443):<\/li>\n<\/ul>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo ufw allow 22\nsudo ufw allow 80\nsudo ufw allow 443\nsudo ufw enable\n<\/code><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Actualizaciones:<\/strong> Ejecuta <code>sudo apt update &amp;&amp; sudo apt upgrade -y<\/code> cada cierto tiempo para mantener todo al d\u00eda.<\/li>\n\n\n\n<li><strong>Contrase\u00f1as:<\/strong> Usa contrase\u00f1as fuertes y \u00fanicas para root, usuarios y bases de datos.<\/li>\n\n\n\n<li><strong>HTTPS:<\/strong> A\u00f1adir cifrado es clave (te lo explico m\u00e1s abajo).<\/li>\n\n\n\n<li><strong>Fail2ban:<\/strong> Inst\u00e1lalo con <code>sudo apt install fail2ban -y<\/code> para bloquear ataques de fuerza bruta. Su configuraci\u00f3n b\u00e1sica ya es \u00fatil.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Virtual Hosts en Nginx<\/h2>\n\n\n\n<p>\u00bfQuieres varios sitios web (como un blog y una tienda)? Usa virtual hosts para separarlos. Crea un archivo en <code>\/etc\/nginx\/sites-available\/<\/code> (por ejemplo, <code>misitio.conf<\/code>), configura tu sitio (incluye el bloque PHP si lo usas) y haz un enlace simb\u00f3lico:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo ln -s \/etc\/nginx\/sites-available\/misitio.conf \/etc\/nginx\/sites-enabled\/\n<\/code><\/p>\n\n\n\n<p>Comprueba que todo est\u00e9 bien con <code>sudo nginx -t y<\/code> reinicia Nginx:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo systemctl restart nginx\n<\/code><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Sugerencias Extra para Mejorar tu Servidor<\/h2>\n\n\n\n<p><strong>Dale un Impulso a PHP-FPM<\/strong><\/p>\n\n\n\n<p>Ajusta PHP-FPM para que rinda mejor. Edita <code>\/etc\/php\/8.2\/fpm\/pool.d\/www.conf<\/code> y prueba con:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>pm = dynamic<\/code> (o <code>static<\/code> para un n\u00famero fijo, o <code>ondemand<\/code> para ahorrar recursos).<\/li>\n\n\n\n<li><code>pm.max_children = 5<\/code> (Nota: Este valor es bajo, ideal para pruebas con poca RAM. Aum\u00e9ntalo seg\u00fan tu servidor si esperas m\u00e1s tr\u00e1fico.)<\/li>\n\n\n\n<li><code>pm.start_servers = 2<\/code> <em>(solo con <code>dynamic<\/code>)<\/em><\/li>\n\n\n\n<li><code>pm.min_spare_servers = 1<\/code> <em>(solo con <code>dynamic<\/code>)<\/em><\/li>\n\n\n\n<li><code>pm.max_spare_servers = 3<\/code> <em>(solo con <code>dynamic<\/code>)<\/em><\/li>\n<\/ul>\n\n\n\n<p>Reinicia PHP-FPM para aplicar los cambios:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo systemctl restart php8.2-fpm\n<\/code><\/p>\n\n\n\n<p><strong>A\u00f1ade HTTPS con Let\u2019s Encrypt<\/strong><\/p>\n\n\n\n<p>Para que tu sitio use HTTPS, instala Certbot:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo apt install certbot python3-certbot-nginx -y\n<\/code><\/p>\n\n\n\n<p><strong>Requisito:<\/strong> Necesitas un dominio registrado (como tusitio.com) apuntando a la IP p\u00fablica de tu servidor v\u00eda DNS.<\/p>\n\n\n\n<p>Pide un certificado (reemplaza <code>tu_dominio<\/code> con tu nombre de dominio real):<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo certbot --nginx -d tu_dominio\n<\/code><\/p>\n\n\n\n<p>Sigue las instrucciones (elige redirigir HTTP a HTTPS si quieres). Verifica la renovaci\u00f3n autom\u00e1tica:<\/p>\n\n\n\n<p><code style=\"background-color:black;color:white;padding:10px 5px;border-radius:3px;white-space:pre;font-family:monospace;display:block;overflow-x:auto;\">\nsudo certbot renew --dry-run\n<\/code><\/p>\n\n\n\n<p>Si todo va bien, tu sitio estar\u00e1 cifrado y seguro.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u00a1Y Listo!<\/h2>\n\n\n\n<p>Montar un servidor con Nginx, PHP 8.2 y MariaDB en Debian 12 es m\u00e1s f\u00e1cil de lo que parece. Con estos pasos tienes un entorno funcional para probar aplicaciones PHP o aprender c\u00f3mo funciona todo. A\u00f1ade las mejoras y medidas de seguridad que necesites, y tendr\u00e1s una base s\u00f3lida para tus experimentos o futuros proyectos.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00bfQuieres montar tu propio servidor web en Debian 12 con Nginx, PHP y MariaDB? En esta gu\u00eda te explico c\u00f3mo hacerlo paso a paso, de manera sencilla y pr\u00e1ctica. Est\u00e1 pensada para quienes est\u00e1n empezando con servidores Linux y buscan un entorno b\u00e1sico para probar ideas o experimentar, antes de dar el salto a algo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[24],"class_list":["post-58","post","type-post","status-publish","format-standard","hentry","category-guia","tag-linux"],"_links":{"self":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/58","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/comments?post=58"}],"version-history":[{"count":0,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/posts\/58\/revisions"}],"wp:attachment":[{"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/media?parent=58"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/categories?post=58"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/juredev.com\/blog\/wp-json\/wp\/v2\/tags?post=58"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}