Tema
Linux para servidores
Más del 90% de los servidores web del mundo usan Linux. No necesitas ser experto, pero sí dominar un puñado de comandos para moverte, editar configuraciones, revisar logs y entender los permisos. Esta lección es tu kit de supervivencia.
Concepto
En un servidor no hay ventanas ni mouse: todo se hace escribiendo comandos en una terminal (shell, normalmente bash). Cada comando tiene la forma:
txt
comando -opciones argumentos
ls -la /var/wwwUsaremos Ubuntu Server, la distribución más común en VPS. Para practicar sin servidor puedes usar WSL en Windows (wsl --install), una máquina virtual o un VPS barato.
Estructura de directorios
txt
/ raíz de todo el sistema
├── etc/ configuraciones (nginx, apache2, ssh, mysql…)
├── var/
│ ├── www/ sitios web (por convención)
│ └── log/ logs del sistema y servicios
├── home/ carpetas de los usuarios (/home/erick)
├── root/ carpeta del superusuario
├── usr/ programas instalados
├── tmp/ temporales (se borra al reiniciar)
└── opt/ software adicionalComandos esenciales
Navegación y archivos
bash
pwd # ¿en qué carpeta estoy?
ls -la # listar todo (incluye ocultos) con detalles
cd /var/www # entrar a una carpeta
cd .. # subir un nivel
cd ~ # ir a tu carpeta personal
mkdir -p proyectos/demo # crear carpetas (con -p crea las intermedias)
touch index.html # crear archivo vacío
cp origen.txt copia.txt # copiar archivo
cp -r carpeta/ copia/ # copiar carpeta completa
mv viejo.txt nuevo.txt # mover o renombrar
rm archivo.txt # borrar archivo
rm -r carpeta/ # borrar carpeta (¡sin papelera!)Cuidado con rm
Linux no tiene papelera. rm -rf borra sin preguntar. Revisa dos veces la ruta antes de dar Enter, sobre todo si usas sudo.
Ver y editar archivos
bash
cat archivo.txt # mostrar contenido completo
less /var/log/syslog # ver archivo largo (q para salir, / para buscar)
head -n 20 archivo.log # primeras 20 líneas
tail -n 50 archivo.log # últimas 50 líneas
tail -f /var/log/nginx/error.log # seguir el log en tiempo real (Ctrl+C para salir)
nano /etc/hosts # editor sencillo: Ctrl+O guarda, Ctrl+X saleBuscar
bash
grep "error" app.log # líneas que contienen "error"
grep -ri "password" /etc/nginx/ # buscar en carpeta, sin distinguir mayúsculas
find /var/www -name "*.php" # buscar archivos por nombre
find /var/www -type f -mtime -1 # archivos modificados en las últimas 24 hPipes y redirección
El símbolo | pasa la salida de un comando a otro; > guarda en archivo (sobrescribe) y >> agrega al final.
bash
# Las 10 IPs que más visitan tu sitio
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# Guardar la lista de paquetes instalados
dpkg -l > paquetes.txt
# Agregar una línea a un archivo
echo "nueva línea" >> notas.txtSistema y recursos
bash
df -h # espacio en disco
du -sh /var/www/* # cuánto pesa cada carpeta
free -h # memoria RAM
uptime # tiempo encendido y carga
htop # monitor interactivo de procesos (sudo apt install htop)
ps aux | grep node # buscar procesos
kill 1234 # terminar proceso por PID (kill -9 si no responde)
ss -tulpn # qué puertos están escuchando y qué programa los usaPaquetes con apt
bash
sudo apt update # actualizar la lista de paquetes
sudo apt upgrade -y # instalar actualizaciones
sudo apt install nginx git # instalar programas
sudo apt remove nginx # desinstalar
sudo apt autoremove # limpiar dependencias que ya no se usanServicios con systemctl y logs con journalctl
bash
sudo systemctl status nginx # ¿está corriendo?
sudo systemctl start nginx # iniciar
sudo systemctl stop nginx # detener
sudo systemctl restart nginx # reiniciar
sudo systemctl reload nginx # recargar configuración sin cortar conexiones
sudo systemctl enable nginx # arrancar automáticamente al encender
sudo journalctl -u nginx -n 50 # últimas 50 líneas del servicio
sudo journalctl -u nginx -f # en tiempo real
sudo journalctl --since "1 hour ago" # todo lo de la última horaUsuarios y grupos
Cada persona o servicio tiene un usuario. El usuario root puede todo; por seguridad trabajarás con un usuario normal que usa sudo cuando necesita privilegios.
bash
whoami # ¿con qué usuario estoy?
sudo adduser maria # crear usuario (pide contraseña y datos)
sudo usermod -aG sudo maria # agregarlo al grupo sudo (administrador)
sudo usermod -aG www-data maria # agregarlo al grupo del servidor web
groups maria # ver sus grupos
su - maria # cambiar a ese usuario
sudo deluser --remove-home maria # borrar usuario y su carpetaError común
usermod -G sin la a reemplaza todos los grupos del usuario. Usa siempre -aG (append).
Permisos
Al hacer ls -l verás algo así:
txt
-rw-r--r-- 1 erick www-data 1024 oct 18 10:00 index.php
drwxr-xr-x 2 erick www-data 4096 oct 18 10:00 imagenes
│└┬┘└┬┘└┬┘ └─┬─┘ └──┬───┘
│ │ │ │ │ └ grupo dueño
│ │ │ │ └ usuario dueño
│ │ │ └ permisos de "otros"
│ │ └ permisos del grupo
│ └ permisos del dueño
└ tipo: - archivo, d directorio, l enlace- r (read) = 4: leer
- w (write) = 2: escribir
- x (execute) = 1: ejecutar archivo / entrar a carpeta
Se suman por bloque: rwx = 7, rw- = 6, r-x = 5, r-- = 4.
| Número | Significado | Uso típico |
|---|---|---|
| 755 | dueño todo; grupo y otros leer/entrar | carpetas web |
| 644 | dueño leer/escribir; resto solo leer | archivos web |
| 775 | dueño y grupo todo | carpetas donde la app escribe (uploads, caché) |
| 600 | solo el dueño lee/escribe | llaves SSH, .env |
| 777 | todos todo | nunca en producción |
bash
chmod 644 index.php # numérico
chmod 755 imagenes/
chmod u+x deploy.sh # simbólico: agrega ejecución al dueño
chmod -R g+w storage/ # recursivo: escritura al grupo
sudo chown erick:www-data index.php # cambiar dueño y grupo
sudo chown -R erick:www-data /var/www/misitioEjemplo: preparar la carpeta de un sitio
Así se deja una carpeta web correctamente: tú eres dueño (para subir archivos) y el servidor web (www-data) puede leer y escribir solo donde hace falta.
bash
# 1. Crear la carpeta del sitio
sudo mkdir -p /var/www/misitio/public
# 2. Tú como dueño, www-data como grupo
sudo chown -R $USER:www-data /var/www/misitio
# 3. Permisos base: carpetas 755, archivos 644
find /var/www/misitio -type d -exec chmod 755 {} \;
find /var/www/misitio -type f -exec chmod 644 {} \;
# 4. Carpeta donde la app sube archivos: el grupo puede escribir
mkdir -p /var/www/misitio/public/uploads
chmod 775 /var/www/misitio/public/uploads
# 5. Comprobar
ls -la /var/www/misitio/publicBuena práctica
Aprende a usar Tab para autocompletar rutas y comandos, y la flecha arriba o Ctrl+R para buscar comandos anteriores. Ahorrarás horas y evitarás errores de dedo.
Ejercicios
- Crea la estructura
~/practica/sitio/{css,js,img}con un solo comando y unindex.htmldentro desitio. - ¿Qué número de permisos le das a: (a) un
.env, (b) un scriptdeploy.shque solo tú ejecutas, (c) la carpetastoragede Laravel? - Muestra las 20 últimas líneas del log de errores de Nginx que contengan la palabra
denied.
Ver solución
bash
mkdir -p ~/practica/sitio/{css,js,img} && touch ~/practica/sitio/index.html- (a)
600(o640con grupo www-data si la app lo lee), (b)700, (c)775con grupowww-data.
bash
sudo grep "denied" /var/log/nginx/error.log | tail -n 20Resumen
- La configuración vive en
/etc, los sitios en/var/www, los logs en/var/log. - Domina:
ls,cd,cp,mv,rm,cat,tail -f,grep,find,nano. aptinstala software;systemctlcontrola servicios;journalctlmuestra sus logs.- Trabaja con un usuario normal +
sudo; agrega grupos conusermod -aG. - Permisos típicos: carpetas 755, archivos 644, secretos 600, nunca 777.
- Siguiente: SSH y llaves.