Linux & Hosting SysAdmin наръчник
От „сайтът не работи“ до мониторинг с Grafana. Мисли по слоеве, измервай, не гадай. Всички команди могат да се копират с едно кликване.
1SysAdmin mindset
„Сайтът ми не работи.“ Не започваш с:
systemctl restart nginx
Първо мислиш по слоеве и проверяваш слой по слой:
DNS
↓
IP
↓
Routing
↓
Firewall
↓
Port 80/443
↓
Nginx/Apache
↓
PHP-FPM/Application
↓
Database
↓
Disk/RAM/CPU
↓
Logs
Пример
DNS наред ли е?
dig example.com
HTTP работи ли?
curl -I https://example.com
Има ли процес на 443?
ss -lntp | grep ':443'
Nginx жив ли е?
systemctl status nginx
Конфигурацията правилна ли е?
nginx -t
Какво казват логовете?
journalctl -u nginx -n 100
2Как се четат Linux командите
Да вземем:
ls -lah
| Част | Значение |
|---|---|
ls | командата |
-l | опция (подробен списък) |
-a | опция (и скритите файлове) |
-h | опция (human-readable размери) |
Следователно ls -lah е комбинация от няколко опции. Много команди имат:
command --help
man command
Например:
man ls
ls --help
-r или --delete, не го използвай на production сляпо.3Работа с файлове и директории
Къде се намирам?
pwd
/root
Какво има тук?
ls
ls -lah
drwxr-xr-x 5 root root 4.0K Oct 4 10:20 .
drwxr-xr-x 20 root root 4.0K Oct 4 09:00 ..
-rw-r--r-- 1 root root 12K Oct 4 10:15 config.txt
-lпоказва подробности.-aпоказва и скритите файлове.-hпоказва размерите удобно:4.0K,20M,1.2G
Смяна на директория
cd /var/log # към директория
cd .. # назад
cd ~ # home
cd - # последната директория
Създаване
mkdir test # директория
touch test.txt # файл
Копиране
cp test.txt backup.txt
cp -r site site_backup # директория
Преместване / преименуване
mv file.txt /tmp/
mv old.txt new.txt
Изтриване
rm file.txt
rm -r directory
rm -rf directory # МНОГО ОПАСНО
rm -rf без да си сигурен какъв е пътят. Преди това:
pwd
ls -lah4💾 Disk space — df
Една от най-важните команди в hosting.
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 100G 91G 9G 92% /
Колони: Size, Used, Avail, Use%, Mounted on.
Какво означава -h?
h = human-readable. Без него (df) виждаш 102400000. С df -h получаваш 100G, 91G, 9G — много по-удобно.
5🧬 Inodes — df -i
Много важно за hosting.
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 6553600 6550000 3600 100% /
Може да имаш 200 GB диск, 50 GB използвани, 150 GB свободни — и въпреки това да не можеш да създадеш файл. Защо? Защото inodes са свършили.
Какво е inode?
Грубо казано: inode е структура, която описва файл. Всеки файл използва inode. Ако имаш 10 милиона малки файла, inodes могат да свършат, въпреки че файловете заемат малко място.
Често причинители
- cache
- sessions
- mail queues
- temporary files
- application logs
- милиони малки файлове
6📦 du — кой изяжда диска?
du -sh /home/*
2.4G /home/user1
85G /home/user2
12G /home/user3
Тук вече виждаш кой user изяжда диска.
Какво значи -sh?
-ssummary — покажи обобщена стойност.-hhuman-readable —12K,500M,4.2G
Кои директории са най-големи?
du -xhd1 /home | sort -hr
90G /home
60G /home/customer1
20G /home/customer2
8G /home/customer3
Целият root filesystem
du -xhd1 / | sort -hr | head -20
100G /
70G /var
20G /home
5G /usr
2G /opt
Вече знаеш къде да копаеш.
7🔎 Намиране на големи файлове
Файлове над 1 GB:
find /home -xdev -type f -size +1G -ls
Друг вариант — най-големите 20:
find /home -xdev -type f -printf '%s %p\n' | sort -nr | head -20
8934212345 /home/user/public_html/backup.sql
4212345678 /home/user/logs/debug.log
2123456789 /home/user/backup.tar.gz
Защо това е важно? Стъпка по стъпка
df -h # / е 95%
du -xhd1 / | sort -hr # /var = 70G
du -xhd1 /var | sort -hr # /var/lib = 50G, /var/log = 15G
du -xhd1 /var/log | sort -hr
И така постепенно намираш виновника.
8🔍 find
Една от най-важните SysAdmin команди.
По име
find /home -name "config.php"
find /var/log -type f -name "*.log"
По тип
find /home -type f # само файлове
find /home -type d # само директории
По размер
find /home -type f -size +100M
find /home -type f -size +1G
По време
find /home -type f -mtime +30 # по-стари от 30 дни
find /var/log -type f -mmin -60 # променени през последните 60 минути
9🚫 2>/dev/null
Ще го срещаш постоянно. Linux има три стандартни потока:
| № | Поток |
|---|---|
0 | stdin |
1 | stdout |
2 | stderr |
find / -name "*.log"
може да даде:
find: '/proc/...': Permission denied
find: '/root/...': Permission denied
Това са грешки към stderr. Можеш да ги скриеш:
find / -name "*.log" 2>/dev/null
2> означава „пренасочи stderr“, а /dev/null — „изхвърли го“.
10🔀 Redirection
| Целта | Команда |
|---|---|
| stdout към файл (презаписва) | ls -lah > output.txt |
| Добавяне към файл | ls -lah >> output.txt |
| Само errors във файл | command 2> errors.txt |
| Скриване на errors | command 2>/dev/null |
| stdout и stderr във файл | command > output.txt 2>&1 |
| Изхвърляне на всичко | command > /dev/null 2>&1 |
11📄 cat, less, head, tail
Целият файл
cat file.txt
Голям файл
less file.txt
В less: /ERROR търсене · n следващо съвпадение · q изход.
Начало и край
head -20 file.txt # първите 20 реда
tail -50 file.txt # последните 50
Live log
tail -f /var/log/nginx/error.log
12🔎 grep
grep "ERROR" app.log # търсене
grep -i "error" app.log # case-insensitive
grep -n "timeout" app.log # с номера на редовете
grep -r "listen" /etc/nginx/ # рекурсивно
grep -v "200" access.log # всичко БЕЗ даден текст
13🔗 Pipes |
Едно от най-важните неща в Linux.
command1 | command2
Резултатът от първата команда става вход за втората. Например:
ps aux | grep nginx
journalctl -u nginx | grep -i error
df -h | grep '/dev'
Така комбинираш малки инструменти.
14🔢 wc
wc = word count.
wc -l access.log # редове
wc -w file.txt # думи
wc -c file.txt # bytes
125438 access.log
Значи: 125438 реда.
15🔤 sort
sort names.txt
sort -n numbers.txt # числово
sort -r names.txt # обратно
sort -nr numbers.txt # числово обратно
16🔢 uniq
Ако имаме:
apple
apple
banana
banana
banana
orange
uniq дава apple banana orange, а uniq -c дава:
2 apple
3 banana
1 orange
uniq брои само съседни еднакви редове. Затова често: sort | uniq -c17✂️ cut
cut -d: -f1 /etc/passwd
-d:delimiter е:-f1вземи първото поле
18⭐ Класическа команда за top IP адреси
При access log:
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
Да я разбием:
awk '{print $1}'— взима първото поле (обикновено IP).sort— ги групира.uniq -c— ги брои.sort -nr— най-голямото число първо.head -20— първите 20.
15000 203.0.113.10
9200 198.51.100.20
7100 192.0.2.50
19🧮 awk
Супер мощен за logs.
awk '{print $1}' access.log
awk '{print $1, $7, $9}' access.log
$1— IP$7— URL$9— HTTP status
Зависи от конкретния log format.
Само 500 errors
awk '$9 >= 500 {print $0}' access.log
20📝 sed
sed -n '1,20p' file.txt # диапазон от редове
sed -n '/ERROR/p' app.log # търсене
sed 's/old/new/g' file.txt # замяна (показва резултата)
sed -i 's/old/new/g' file.txt # директна промяна на файла
21⚙️ Процеси
ps aux # всички процеси
ps aux --sort=-%cpu | head -15 # най-много CPU
ps aux --sort=-%mem | head -15 # най-много RAM
top # live информация
htop # ако е инсталиран
pgrep -a nginx # намери процес
pidof nginx
22🧠 RAM
free -h
total used free
Mem: 32Gi 20Gi 2Gi
Swap: 4Gi 1Gi 3Gi
23🔥 CPU и Load
uptime
load average: 2.10, 1.80, 1.50
Това са средно натоварване за 1 минута, 5 минути, 15 минути. За CPU cores:
nproc
Ако имаш 8 cores и load 2 — всичко е наред. Load 20 е съвсем друга история.
24🌐 ip addr
ip addr
ip -br addr
1: lo:
inet 127.0.0.1/8
2: eth0:
inet 203.0.113.10/32
3: eth1:
inet 10.10.3.20/16
lo
Loopback127.0.0.1 — самият сървър към себе си.eth0
Обикновено external/public interface. Може да има няколко IP адреса (.10, .11, .12).eth1
Може да е private/internal мрежа:10.x.x.x, 172.16.x.x, 192.168.x.xКакво значи /32?
203.0.113.10/32 означава маска 255.255.255.255 — адресът е host route. В cloud/hosting среда това е напълно възможна конфигурация при routed networking.
25🛣️ ip route
ip route
default via 203.0.113.1 dev eth0 src 203.0.113.10 metric 100
10.10.0.0/16 dev eth1 src 10.10.3.20 metric 101
| Част | Значение |
|---|---|
default via 203.0.113.1 dev eth0 | Ако нямаш по-специфичен маршрут, прати traffic през този gateway. |
10.10.0.0/16 dev eth1 | Трафикът към 10.10.x.x отива през eth1 (private network). |
src 203.0.113.10 | Предпочитан source IP. |
metric 100 | При конкуриращи се маршрути помага за избора. По-ниска стойност = по-предпочитана. |
26⭐ ip route get
Една от най-полезните networking команди:
ip route get 8.8.8.8
8.8.8.8 via 203.0.113.1 dev eth0 src 203.0.113.10
Вече знаеш кои gateway, interface и source IP ще бъдат използвани.
27🔌 ss
Основната команда за портове.
ss -tulnp
| Флаг | Значение |
|---|---|
-t | TCP |
-u | UDP |
-l | listening |
-n | numeric (без DNS resolution) |
-p | process |
Тоест: покажи TCP/UDP listening портове, без DNS resolution, и кой процес ги използва.
ss -lntp # само TCP listening
ss -lntp | grep ':443' # HTTPS
ss -lntp | grep ':80' # HTTP
ss -lntp | grep ':22' # SSH
28📡 ping
ping -c 4 1.1.1.1
Проверява ICMP connectivity.
curl често е по-полезен за web troubleshooting.29🌍 curl
curl -I https://example.com # headers
curl -v https://example.com # verbose
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com # само status code
200
30DNS с dig
dig example.com
dig +short example.com # само IP
dig @1.1.1.1 example.com # друг DNS server
Последното е много полезно, ако подозираш DNS propagation/resolver проблем.
31🔐 SSH
ssh user@server
ssh -p 2222 user@server # друг порт
ssh -v user@server # debug
scp file.txt user@server:/tmp/ # файл към сървър
32🚚 rsync
rsync -avh ./site/ user@server:/var/www/site/
Много полезен за deployment и backups.
rsync --delete може да изтрие destination файлове. Преди production deployment разбери точно какво ще се синхронизира.33🧩 systemctl
systemctl status nginx # провери service
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl reload nginx
systemctl enable nginx # autostart
systemctl disable nginx
systemctl --failed # failed services
34📰 journalctl
journalctl -u nginx -n 100 # последните 100 реда
journalctl -u nginx -f # live
journalctl -u nginx --since "1 hour ago" # последния час
journalctl -p err..alert -b # errors от текущия boot
35🔐 Permissions
ls -l
-rwxr-xr--
Имаме owner, group, others и стойности: r = 4, w = 2, x = 1.
| Число | Права | Използване |
|---|---|---|
644 | rw-r--r-- | Обикновен файл |
755 | rwxr-xr-x | Директории и executable scripts |
600 | rw------- | Private/secret файлове |
700 | rwx------ | Private directory/script |
36chmod
chmod 644 file.txt
chmod 755 script.sh
37chown
chown user:group file.txt
chown -R user:group /var/www/site # рекурсивно
/var, / или /home може да направи сериозен проблем.38SELinux
getenforce
sestatus
ls -Z /var/www # context
ausearch -m AVC -ts recent # SELinux denials
Режимът може да бъде Enforcing.
setenforce 0 само защото нещо не работи. Първо разбери какво точно блокира SELinux.39📦 Package management
Debian / Ubuntu
apt update
apt install nginx
apt upgradeRHEL / Rocky / Alma
dnf install nginx
dnf update
dnf search nginxПърво виж OS:
cat /etc/os-release
40📦 tar
tar -czf backup.tar.gz /etc/nginx/ # създаване
tar -tzf backup.tar.gz # проверка
tar -xzf backup.tar.gz # разархивиране
41⏰ Cron
crontab -l # покажи
crontab -e # редакция
Пример:
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
Всеки ден в 02:00 изпълни backup script-а.
┌──────── минута (0-59)
│ ┌────── час (0-23)
│ │ ┌──── ден от месеца (1-31)
│ │ │ ┌── месец (1-12)
│ │ │ │ ┌ ден от седмицата (0-7)
│ │ │ │ │
0 2 * * * команда
42🔍 lsof
lsof -i :443 # кой държи порт 443?
lsof /var/log/nginx/error.log # кой държи файл?
lsof +L1 # deleted but still open files
df -h → 100%, а du → не показва къде е мястото. Тогава lsof +L1 може да покаже:
nginx 1234 root 5w REG ... /var/log/big.log (deleted)
Процесът още държи файла отворен.43🌐 Nginx
nginx -t # проверка на конфигурацията
systemctl status nginx
ss -lntp | grep ':443' # порт
tail -f /var/log/nginx/error.log # error log
tail -f /var/log/nginx/access.log # access log
44🌐 Apache
systemctl status httpd # RHEL-like
systemctl status apache2 # Debian/Ubuntu
apachectl configtest # config test
45🐘 PHP-FPM
systemctl status php-fpm
systemctl status php8.2-fpm # зависи от версията
ps aux | grep '[p]hp-fpm' # процеси
ss -lx | grep php # sockets
46🚨 502 Bad Gateway
Много често:
Nginx
↓
PHP-FPM
Nginx казва „502 Bad Gateway“. Проверяваш:
systemctl status php-fpm
ss -lx | grep php
tail -n 100 /var/log/nginx/error.log
journalctl -u php-fpm -n 100
Възможни причини
- PHP-FPM down
- wrong socket
- wrong permissions
- too many workers
- application crash
- resource exhaustion
47🚨 504 Gateway Timeout
Proxy/gateway чака upstream, но не получава отговор навреме.
Nginx → PHP → Application → MySQL
Може да е:
- slow database query
- application stuck
- backend overloaded
- network issue
- timeout too short
tail -f /var/log/nginx/error.log
и после application/database logs.
48🗄️ MySQL / MariaDB
systemctl status mysql # или mariadb
mysql -u root -p
Вътре в MySQL:
SHOW DATABASES;
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
49🐳 Docker
docker ps # работещи container-и
docker ps -a # всички
docker images # images
docker logs container # logs
docker logs -f container # live logs
docker logs --tail 200 container # последните 200
docker inspect container
docker exec -it container sh # влизане вътре
docker stats # resource usage
docker restart container
50🐳 Docker troubleshooting
Ако container не работи:
docker ps -a
docker logs --tail 200 container
docker inspect container
docker stats
В inspect гледаш: Exit code · Mounts · Environment · Network · Ports · Restart policy. А docker stats е за CPU/RAM.
51🐳 Docker Compose
docker compose ps # services
docker compose logs # logs
docker compose logs -f app # конкретен service
docker compose up -d # стартиране
docker compose restart app # restart
docker compose down # спиране
52📊 Grafana
Grafana е предимно visualization + dashboards + alerts. Може да показва данни от Prometheus, Loki, Elasticsearch/OpenSearch, InfluxDB.
┌──────────────┐
│ Grafana │
└──────┬───────┘
│
┌──────────┴──────────┐
│ │
Prometheus Loki
│ │
Metrics Logs
│ │
Node Exporter Log Agent
│ │
Linux Server
53📈 Prometheus
Prometheus събира metrics: CPU, RAM, Disk, Network, HTTP requests, Latency, Load, Container metrics. Node Exporter обикновено предоставя Linux host metrics.
Linux Server
↓
Node Exporter
↓
Prometheus
↓
Grafana
54📜 Loki
Loki е ориентиран към logs: Nginx, Application, Docker и System logs.
Server
↓
Log Agent
↓
Loki
↓
Grafana
Така можеш да имаш в един dashboard CPU, RAM, Disk, HTTP latency — и едновременно Nginx errors, Application errors, Docker logs.
55🔥 Firewall
# firewalld
firewall-cmd --state
firewall-cmd --list-all
firewall-cmd --list-ports
# nftables
nft list ruleset
# UFW
ufw status verbose
56👤 Users
whoami # кой съм аз?
id username # информация за user
who # кой е login-нат
w # по-подробно
last # последни login-и
57🖥️ Server information
hostname
hostnamectl # подробности
uname -a # kernel
cat /etc/os-release # OS
lscpu # CPU
lsblk # disk
free -h # RAM
nproc # CPU cores
58🐚 Bash scripting
Най-прост script:
#!/usr/bin/env bash
echo "Hello"
Пример с loop:
#!/usr/bin/env bash
for f in /var/log/*.log; do
echo "Processing: $f"
done
Проверка дали Nginx работи:
if systemctl is-active --quiet nginx; then
echo "nginx is running"
else
echo "nginx is DOWN"
fi
Това вече е началото на automation.
59$? — exit code
След команда:
echo $?
Ако получиш 0, обикновено означава success. Например:
systemctl is-active nginx
echo $?
60🚨 Incident: Disk Full
Клиентите започват да получават errors.
df -h
df -i
du -xhd1 / | sort -hr | head -20
# ако /var е голям:
du -xhd1 /var | sort -hr
# ако /var/log:
du -xhd1 /var/log | sort -hr
find /var/log -type f -size +1G -ls
# ако df и du не съвпадат:
lsof +L1
61🚨 Incident: Website Down
dig +short example.comip route get 1.1.1.1curl -Iv https://example.comss -lntp | grep ':443'systemctl status nginxnginx -tjournalctl -u nginx -n 100tail -n 100 /var/log/nginx/error.log
systemctl restart nginx и да се надяваш.62🚨 Incident: Server е бавен
uptime
free -h
top
ps aux --sort=-%cpu | head -15
ps aux --sort=-%mem | head -15
df -h
df -i
При нужда:
iostat
vmstat
63🚨 Incident: SSH не работи
От твоя компютър:
ping server
ssh -v user@server
На server-а, ако имаш console:
ss -lntp | grep ':22'
systemctl status sshd
journalctl -u sshd -n 100
После firewall. Мислиш:
DNS
↓
Network
↓
Port 22
↓
sshd
↓
Firewall
↓
Authentication
64🚨 Incident: много заявки от един IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -20
След това:
grep '^203.0.113.10 ' access.log | tail -100
Гледаш: какви URL-и? колко заявки? какви status codes? Crawler? Customer? Attack? Monitoring?
65🧠 Най-важните „опасни“ команди
Тези винаги ги проверявай два пъти:
rm -rf
chmod -R
chown -R
rsync --delete
kill -9
systemctl restart
firewall-cmd ...
nft ...
…и всякакви команди със * или /.
66🛠️ Правило за production
Преди промяна:
- Провери къде си:
pwd - Виж файла:
ls -lah - Направи backup:
cp config.conf config.conf.bak - Провери конфигурацията:
nginx -t - После reload:
systemctl reload nginx - Провери резултата:
systemctl status nginx - Гледай logs:
journalctl -u nginx -n 50
67🧭 Универсална troubleshooting схема
ПРОБЛЕМ
│
▼
Какво точно?
│
┌─────────┴─────────┐
▼ ▼
Network Local
│ │
DNS? Process?
Route? Service?
Firewall? Disk?
Port? RAM?
│ CPU?
▼ │
Service Logs
│
▼
Application
│
▼
Database
И почти винаги:
1. Observe
Наблюдавай2. Measure
Измери3. Isolate
Изолирай4. Change
Промени5. Verify
Провери68📚 Какво да учиш след Linux basics
За да станеш сериозен SysAdmin/Hosting Admin:
Ниво 1 — Linux
- filesystem
- permissions
- processes
- systemd
- logs
- packages
- Bash
Ниво 2 — Networking
- TCP/IP
- DNS
- routing
- ports
- firewalls
- HTTP/HTTPS
- TLS
- NAT
Ниво 3 — Hosting
- Nginx
- Apache
- PHP-FPM
- MySQL/MariaDB
- Redis
- DNS
- SSL
Ниво 4 — Automation
- Bash
- Git
- Ansible
- cron
- CI/CD
Ниво 5 — Containers
- Docker
- Docker Compose
- Docker networking
- Volumes
- Registries
Ниво 6 — Monitoring
- Prometheus
- Grafana
- Node Exporter
- Loki
- Alerting
Ниво 7 — Infrastructure
- Cloud
- OpenStack
- AWS
- Azure
- Terraform
- Kubernetes
🏆Най-важният Cheat Sheet
Disk
df -h
df -i
du -sh /home/*
du -xhd1 / | sort -hrГолеми файлове
find /home -xdev -type f -size +1G -ls
find /home -xdev -type f -printf '%s %p\n' | sort -nr | head -20Processes
ps aux
top
free -h
uptimeNetwork
ip -br addr
ip route
ip route get 8.8.8.8Ports
ss -lntp
ss -tulnp
lsof -i :443DNS
dig example.com
dig +short example.comHTTP
curl -I https://example.com
curl -v https://example.comServices
systemctl status nginx
systemctl --failedLogs
journalctl -u nginx -n 100
journalctl -u nginx -fPermissions
ls -l
chmod
chownDocker
docker ps
docker ps -a
docker logs
docker inspect
docker statsDocker Compose
docker compose ps
docker compose logs
docker compose up -dDeleted files
lsof +L1🧠Най-важното нещо
🌐 Сайтът не работи?
dig · curl · ss · systemctl · nginx -t · journalctl💾 Дискът е пълен?
df -h · df -i · du · find · lsof +L1🐢 Сървърът е бавен?
uptime · free · top · ps · df · iostat🐳 Container-ът не работи?
docker ps -a · docker logs · docker inspect · docker statsИ постепенно ще започнеш да гледаш на сървъра не като на 1000 различни команди, а като на една система:
INTERNET
│
DNS
│
▼
IP / ROUTE
│
FIREWALL
│
▼
PORT 80/443
│
▼
NGINX / APACHE
│
▼
PHP / APP
│
▼
MYSQL / REDIS
│
▼
FILESYSTEM
│
┌───────────┼───────────┐
▼ ▼ ▼
CPU RAM DISK
│ │ │
└───────────┼───────────┘
▼
LOGS
│
▼
MONITORING
Prometheus / Grafana / Loki