Hice una versión simplificada en este enlace. Si quieresbrincarte los comentarios de aqui, sigue siendo valido el contenido pero el markdown es más resumido.
https://github.com/AlfonsoOrozcoAguilarnoNDA/snippetsMIT/blob/main/instalar_LEMP_debian13.md
El cliente Usan wordpress bajo Nginx pero no hay apache, lo vi por los puertos.
Podría tratar de levantar un proxy inverso.
nadie dijo que no pusiera apache en el nginx… Nginx como «Reverse Proxy» recibe el tráfico (puerto 80/443). Es rapidísimo entregando imágenes y manejando el SSL (Certbot) por ataques de DDOS. En general no importa porque ni usan imagenes y casi no tienen DDOS por cloudflare.
la idea es que Apache procesa el WordPress/PHP (puerto 8080). Así mantiene la compatibilidad total con los plugins de WordPress y archivos .htaccess
Pero…
No. Para fines de concepto hay que usar pruebas duras.
Objetivo : Demostrar que montar un servidor a mano no es un misterio, y que no debería ser un cuello de botella ni una excusa para depender ciegamente de AWS/Azure.
Palabra Clave: Reproducibilidad
Entorno: Debian 13
Paso 1: actualización y seguridad basica.
# Actualizar el sistema
apt update && apt upgrade -y # Instalar herramientas esenciales
apt install -y ufw curl git vim htop sudo build-essential
Paso 2 Configurar firewall
- ufw default deny incoming
- ufw default allow outgoing
- ufw allow ssh
- ufw allow http
- ufw allow https
- ufw enable
Paso 3 base de datos mariadb, no queremos modo estricto, solo seguro de datos.
- apt install -y mariadb-server
- mariadb-secure_installation o mysql-secure_installation
- Si no jala, es porque esmodo puro debian y no es ubuntu. a manita. Anexo 1 que está hasta abajo.
Paso 4 Configurar El usuario de Mariadb y crear seis bases de datos
- mariadb -u root -p (va a pedir laclave nueva del anexo)
- — Crear las 6 bases de datos
CREATE DATABASE IF NOT EXISTS db_app_principal;
CREATE DATABASE IF NOT EXISTS db_reserva_1;
CREATE DATABASE IF NOT EXISTS db_reserva_2;
CREATE DATABASE IF NOT EXISTS db_reserva_3;
CREATE DATABASE IF NOT EXISTS db_reserva_4;
CREATE DATABASE IF NOT EXISTS db_reserva_5; - — Crear el usuario normal (no root)
- — Sustituye ‘usuario_web’ y ‘TuClaveSegura’ por lo que prefieras
CREATE USER ‘usuario_web’@’localhost’ IDENTIFIED BY ‘TuClaveSegura’;
yo uso adminsql y una clave diferente de las anteriores asi que ya van tres, root, mariadb root y adminsql
— Dar permisos específicos al usuario sobre sus bases de datos
GRANT ALL PRIVILEGES ON db_app_principal.* TO ‘usuario_web’@’localhost’;
GRANT ALL PRIVILEGES ON db_reserva_1.* TO ‘usuario_web’@’localhost’;
GRANT ALL PRIVILEGES ON db_reserva_2.* TO ‘usuario_web’@’localhost’;
GRANT ALL PRIVILEGES ON db_reserva_3.* TO ‘usuario_web’@’localhost’;
GRANT ALL PRIVILEGES ON db_reserva_4.* TO ‘usuario_web’@’localhost’;
GRANT ALL PRIVILEGES ON db_reserva_5.* TO ‘usuario_web’@’localhost’;
— Aplicar cambios y salir
FLUSH PRIVILEGES;
EXIT;
Paso 5 Configurar Php
apt install -y php8.4-fpm php8.4-mysql php8.4-curl php8.4-bcmath php8.4-xml \
php8.4-mbstring php8.4-zip php8.4-gd php8.4-intl
# Reiniciar PHP-FPM
systemctl restart php8.4-fpm
systemctl enable php8.4-fpm
Siempre recomiendo bcmath, xml y curl como modulos / extensiones.
php-curl: Indispensable para que el servidor pueda hacer peticiones externas (como verificar licencias o conectar con APIs de pago).-
php-bcmath: Maneja aritmética de precisión arbitraria. Sin esto, algunos cálculos financieros en PHP pueden dar errores de redondeo. Indispensable en factura electrónica -
php-xml: Necesario para Tina CMS y cualquier sistema que use estructuras de datos XML o RSS.
opcional :
nano /etc/php/8.4/fpm/php.ini
Busca estas líneas y ajústalas:
-
memory_limit = 256M -
upload_max_filesize = 64M -
post_max_size = 64M -
max_execution_time = 300
Paso 6 Nginx
- apt install -y nginx
- mkdir -p /var/www/tu-dominio.com/public_html
# Le damos la propiedad al usuario web de Nginx
chown -R www-data:www-data /var/www/tu-dominio.com
chmod -R 755 /var/www/tu-dominio.com - nano /etc/nginx/sites-available/tu-dominio.com (mejor que usar propio que el default)
- dentro de nano
- server {
listen 80;
server_name tu-dominio.com www.tu-dominio.com;
root /var/www/tu-dominio.com/public_html;
index index.php index.html index.htm;# Logs específicos para este proyecto
access_log /var/log/nginx/tu-dominio.access.log;
error_log /var/log/nginx/tu-dominio.error.log;location / {
# Esto permite que los permalinks de WordPress y Tina CMS funcionen
try_files $uri $uri/ /index.php?$args;
}# Procesamiento de PHP 8.4
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}# Denegar acceso a archivos .htaccess (por seguridad, aunque usemos Nginx)
location ~ /\.ht {
deny all;
}# Optimización para archivos estáticos (React/Imágenes)
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
expires max;
log_not_found off;
}
}
- server {
Activación y Prueba de Fuego
Para activar este sitio, creamos un enlace simbólico hacia la carpeta de sitios activos y reiniciamos:
Bash
# Activar el sitio
ln -s /etc/nginx/sites-available/tu-dominio.com /etc/nginx/sites-enabled/
# Desactivar el sitio default para evitar conflictos
rm /etc/nginx/sites-enabled/default
# PROBAR que la sintaxis sea correcta (Paso vital)
nginx -t
# Si dice que todo está OK, recargamos
systemctl reload nginx
paso 6.1 puente de php y nginx
- nano /var/www/tu-dominio.com/public_html/test.php
- escribe algo cualquiera
- despues dejas un echo «<h1>prueba</h1>» o puedes dejar un phpinfo pero no lo recomiendo…;
PASO 7 certbot
- apt install -y certbot python3-certbot-nginx
- certbot –nginx -d tu-dominio.com -d www.tu-dominio.com
- certbot renew –dry-run
Todo esto tomó 56 minutos incluyendo tiempo de comer recalentado.
Nota Importante sobre Puertos SSH en México:
Cambio de puerto SSH (con precaución en México):
Aunque cambiar el puerto SSH del estándar 22 a uno no convencional (como 2222, 2244, etc.) es una práctica de seguridad recomendada internacionalmente, en México puede ser problemático. Muchas dependencias de gobierno, instituciones bancarias y redes corporativas bloquean estos puertos no estándar por política de seguridad. Si tu cliente necesita acceder desde oficinas gubernamentales, bancos o redes empresariales mexicanas, es probable que solo el puerto 22 esté permitido en sus firewalls.
Alternativas más seguras sin cambiar puerto:Deshabilitar login de root: PermitRootLogin no
Solo autenticación por llaves SSH: PasswordAuthentication no
Fail2ban activo: Bloquea IPs después de 3-5 intentos fallidos
Limitar usuarios permitidos: AllowUsers tu_usuario
Configurar VPN: Si realmente necesitas seguridad extra, mejor usar WireGuard o OpenVPNSi decides cambiar el puerto de todas formas, prueba primero antes de cerrar tu sesión SSH actual. Abre una segunda terminal y verifica que puedes conectarte al nuevo puerto. Si no funciona desde ciertas ubicaciones, tendrás que volver al puerto 22.
bash# Configuración SSH segura SIN cambiar puerto (recomendado para México)
nano /etc/ssh/sshd_config# Cambiar/agregar estas líneas:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
AllowUsers tu_usuario# Guardar y reiniciar
systemctl restart sshd
Experiencia real: He visto casos donde servidores con puerto SSH no estándar quedan inaccesibles desde oficinas de SAT, IMSS, o sucursales bancarias, generando emergencias operativas cuando el administrador está en esas ubicaciones.
Anerxo 1 mariadb
1. Cambiar la clave de root (Pon una clave segura entre las comillas)
ALTER USER ‘root’@’localhost’ IDENTIFIED VIA mysql_native_password USING PASSWORD(‘TuClaveSegura’);— 2. Eliminar usuarios anónimos
DELETE FROM mysql.user WHERE User=»;— 3. Bloquear acceso remoto al root
DELETE FROM mysql.user WHERE User=’root’ AND Host NOT IN (‘localhost’, ‘127.0.0.1’, ‘::1′);— 4. Borrar la base de datos de prueba
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db=’test’ OR Db=’test\\_%’;— 5. Recargar privilegios para que los cambios surtan efecto
FLUSH PRIVILEGES;— 6. Salir
EXIT;