إعداد خادم البروكسي: دليل Squid و HAProxy
Squid forward proxy، HAProxy موازن الأحمال، إنهاء SSL، قواعد ACL، التخزين المؤقت، فحوصات الصحة والتوافر العالي.
إعداد حزمة Prometheus + Grafana، Netdata، node_exporter، قواعد التنبيه، إنشاء لوحات المعلومات ومراقبة مقاييس الخادم.
مراقبة البنية التحتية للخوادم بشكل فعال أمر ضروري للكشف المبكر عن مشاكل الأداء ومنع فترات التوقف. في هذا الدليل، سنقوم بإعداد نظام شامل لمراقبة الخوادم باستخدام Prometheus و Grafana و Netdata.
Prometheus هو نظام مفتوح المصدر لجمع المقاييس والمراقبة مدعوم من Cloud Native Computing Foundation (CNCF). بفضل بنيته القائمة على السحب (Pull)، يقوم بجمع المقاييس بانتظام من الأنظمة المستهدفة عبر HTTP وتخزينها في قاعدة بيانات السلاسل الزمنية.
الميزات الرئيسية لـ Prometheus:
Node Exporter هو مُصدّر Prometheus يجمع مقاييس الأجهزة ونظام التشغيل من خوادم Linux.
# تحميل Node Exporter
cd /tmp
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar xzf node_exporter-1.7.0.linux-amd64.tar.gz
# نقل الملف التنفيذي
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
# إنشاء مستخدم
sudo useradd --no-create-home --shell /bin/false node_exporter
# ملف خدمة systemd
sudo tee /etc/systemd/system/node_exporter.service > /dev/null <<EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \\
--collector.systemd \\
--collector.processes \\
--web.listen-address=:9100
[Install]
WantedBy=multi-user.target
EOF
# بدء الخدمة
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter
# docker-compose.yml
version: '3.8'
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
التحقق من المقاييس:
curl http://localhost:9100/metrics | head -50
# docker-compose.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
- ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
- '--web.enable-lifecycle'
volumes:
prometheus_data:
# prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_timeout: 10s
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
rule_files:
- "alert_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node-exporter'
static_configs:
- targets:
- 'node-exporter:9100'
- '192.168.1.10:9100'
- '192.168.1.11:9100'
labels:
env: 'production'
aكتشف الحالات الحرجة باستخدام قواعد تنبيه Prometheus:
# prometheus/alert_rules.yml
groups:
- name: server_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "استخدام عالي لوحدة المعالجة ({{ $labels.instance }})"
description: "استخدام CPU يبلغ {{ $value | printf \"%.1f\" }}% - أعلى من 85% لمدة 5 دقائق."
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: critical
annotations:
summary: "استخدام عالي للذاكرة ({{ $labels.instance }})"
description: "استخدام الذاكرة يبلغ {{ $value | printf \"%.1f\" }}% - أعلى من 90%."
- alert: DiskAlmostFull
expr: (1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"})) * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "القرص ممتلئ تقريباً ({{ $labels.instance }})"
description: "{{ $labels.mountpoint }} استخدام القرص {{ $value | printf \"%.1f\" }}%"
- alert: InstanceDown
expr: up == 0
for: 2m
labels:
severity: critical
annotations:
summary: "الخادم غير متاح ({{ $labels.instance }})"
description: "{{ $labels.job }} الهدف غير متاح منذ دقيقتين."
# alertmanager/alertmanager.yml
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'severity']
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
receiver: 'telegram'
receivers:
- name: 'telegram'
telegram_configs:
- bot_token: 'رمز_البوت_الخاص_بك'
chat_id: معرف_المحادثة
parse_mode: 'HTML'
message: |
<b>{{ .Status | toUpper }}</b>
<b>تنبيه:</b> {{ .CommonLabels.alertname }}
<b>الخطورة:</b> {{ .CommonLabels.severity }}
<b>الخادم:</b> {{ .CommonLabels.instance }}
services:
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=كلمة_مرور_قوية123!
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
grafana_data:
# Node Exporter Full Dashboard
Dashboard ID: 1860
مصدر البيانات: Prometheus
# Docker Container Monitoring
Dashboard ID: 893
# Prometheus Stats
Dashboard ID: 2
# نسبة استخدام CPU
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# نسبة استخدام RAM
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# نسبة استخدام القرص
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100
# حركة الشبكة (بايت/ثانية)
rate(node_network_receive_bytes_total{device="eth0"}[5m])
rate(node_network_transmit_bytes_total{device="eth0"}[5m])
# وقت تشغيل النظام
node_time_seconds - node_boot_time_seconds
Netdata هي أداة مراقبة خوادم في الوقت الفعلي. التثبيت سهل للغاية ويوفر مقاييس مفصلة فوراً.
bash <(curl -Ss https://my-netdata.io/kickstart.sh)
sudo systemctl status netdata
واجهة الويب: http://عنوان_IP_الخادم:19999
version: '3.8'
services:
netdata:
image: netdata/netdata:latest
container_name: netdata
restart: unless-stopped
ports:
- "19999:19999"
cap_add:
- SYS_PTRACE
- SYS_ADMIN
security_opt:
- apparmor:unconfined
volumes:
- netdataconfig:/etc/netdata
- netdatalib:/var/lib/netdata
- netdatacache:/var/cache/netdata
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
volumes:
netdataconfig:
netdatalib:
netdatacache:
# docker-compose.monitoring.yml
version: '3.8'
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus
- prometheus_data:/prometheus
networks:
- monitoring
grafana:
image: grafana/grafana:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
depends_on:
- prometheus
networks:
- monitoring
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
ports:
- "9100:9100"
networks:
- monitoring
alertmanager:
image: prom/alertmanager:latest
container_name: alertmanager
restart: unless-stopped
ports:
- "9093:9093"
networks:
- monitoring
networks:
monitoring:
driver: bridge
volumes:
prometheus_data:
grafana_data:
docker compose -f docker-compose.monitoring.yml up -d
من خلال إعداد حزمة Prometheus + Grafana + Netdata، يمكنك مراقبة البنية التحتية الكاملة لخوادم REXE من لوحة معلومات واحدة. تتيح قواعد التنبيه الكشف الاستباقي عن المشاكل.
Prometheus مثالي لجمع المقاييس والتخزين طويل المدى مع استعلامات PromQL القوية. Netdata محسّن للمراقبة في الوقت الفعلي وسهل التثبيت جداً. أفضل نهج هو استخدام كليهما معاً: Netdata للمراقبة الفورية والكشف السريع عن المشاكل، Prometheus + Grafana لتحليل الاتجاهات طويلة المدى ولوحات المعلومات المخصصة.
انتقل إلى Dashboards → Import في واجهة Grafana. انسخ معرف لوحة المعلومات من grafana.com/grafana/dashboards (مثلاً 1860 لـ Node Exporter Full). أدخل المعرف، انقر Load، اختر مصدر بيانات Prometheus وانقر Import.
قلل فترة الاحتفاظ: '--storage.tsdb.retention.time=15d'. زد فترة الجمع (30 ثانية بدلاً من 15). فلتر المقاييس غير الضرورية باستخدام metric_relabel_configs. استخدم Admin API لحذف البيانات القديمة: 'curl -X POST http://localhost:9090/api/v1/admin/tsdb/clean_tombstones'.
أولاً تحقق من أن التنبيهات تعمل في Prometheus: http://localhost:9090/alerts. تأكد من أن Alertmanager يعمل: http://localhost:9093/#/alerts. تحقق من ملف التكوين: 'amtool check-config alertmanager.yml'. تأكد من صحة رمز البوت ومعرف المحادثة.
يجمع Node Exporter استخدام CPU والذاكرة ومساحة القرص والإدخال/الإخراج وحركة الشبكة وحمل النظام ونظام الملفات ووقت التشغيل وعدد العمليات وواصفات الملفات المفتوحة والمزيد. يمكن تفعيل جامعات إضافية: --collector.systemd و --collector.processes و --collector.tcpstat.
ثبّت Node Exporter على كل خادم (المنفذ 9100). أضف جميع الخوادم تحت scrape_configs في تكوين Prometheus. في لوحات Grafana يمكنك تصفية الخوادم حسب تسمية instance. لعدد كبير من الخوادم، يمكنك التوسع باستخدام Prometheus federation أو Thanos.
Squid forward proxy، HAProxy موازن الأحمال، إنهاء SSL، قواعد ACL، التخزين المؤقت، فحوصات الصحة والتوافر العالي.
تثبيت Nginx Proxy Manager عبر Docker، تجديد شهادات SSL تلقائياً، إضافة proxy host، قوائم الوصول، إعادة التوجيه، البث والمواقع المخصصة.
تثبيت CrowdSec، تكوين bouncer، كشف الهجمات، حظر IP، لوحة المعلومات، إدارة المجموعات والسيناريوهات.