Skip to content

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/www

Usaremos 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 adicional

Comandos esenciales ​

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 sale

Buscar ​

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 h

Pipes 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.txt

Sistema 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 usa

Paquetes 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 usan

Servicios 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 hora

Usuarios 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 carpeta

Error 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úmeroSignificadoUso típico
755dueño todo; grupo y otros leer/entrarcarpetas web
644dueño leer/escribir; resto solo leerarchivos web
775dueño y grupo todocarpetas donde la app escribe (uploads, caché)
600solo el dueño lee/escribellaves SSH, .env
777todos todonunca 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/misitio

Ejemplo: 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/public

Buena 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 ​

  1. Crea la estructura ~/practica/sitio/{css,js,img} con un solo comando y un index.html dentro de sitio.
  2. ¿Qué número de permisos le das a: (a) un .env, (b) un script deploy.sh que solo tú ejecutas, (c) la carpeta storage de Laravel?
  3. 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
  1. (a) 600 (o 640 con grupo www-data si la app lo lee), (b) 700, (c) 775 con grupo www-data.
bash
sudo grep "denied" /var/log/nginx/error.log | tail -n 20

Resumen ​

  • 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.
  • apt instala software; systemctl controla servicios; journalctl muestra sus logs.
  • Trabaja con un usuario normal + sudo; agrega grupos con usermod -aG.
  • Permisos típicos: carpetas 755, archivos 644, secretos 600, nunca 777.
  • Siguiente: SSH y llaves.

Academia Web — aprende, copia y construye.