نشر تطبيق Node.js: دليل PM2 و Nginx
دليل شامل لنشر تطبيقات Node.js على VPS. تثبيت Node.js عبر nvm، مدير العمليات PM2، وكيل Nginx العكسي، شهادة SSL وإدارة متغيرات البيئة.
ما هو CDN، إعداد Cloudflare CDN المجاني، تهيئة رؤوس ذاكرة التخزين المؤقت في Nginx، ضغط gzip/brotli، تحسين الصور ودليل رؤوس cache-control.
سرعة موقعك الإلكتروني أمر بالغ الأهمية لتجربة المستخدم وتصنيفات SEO. يمكن لـ CDN (شبكة توصيل المحتوى) وتحسين الملفات الثابتة أن يقللا بشكل كبير من أوقات تحميل الصفحات. يغطي هذا الدليل أساسيات CDN وإعداد Cloudflare وتهيئة ذاكرة التخزين المؤقت في Nginx وتقنيات الضغط.
CDN (شبكة توصيل المحتوى) هي بنية تحتية شبكية تُوزّع المحتوى الثابت (الصور، CSS، JavaScript، الفيديو) على خوادم حول العالم وتخدم المستخدمين من أقرب خادم.
فوائد CDN:
يوفر Cloudflare CDN وحماية DDoS وشهادة SSL في خطته المجانية.
يفحص Cloudflare سجلات DNS الموجودة تلقائياً:
A @ 203.0.113.50 Proxied (سحابة برتقالية)
A www 203.0.113.50 Proxied (سحابة برتقالية)
CNAME api api.example.com DNS only (سحابة رمادية)
خيار "Proxied" (السحابة البرتقالية) يوجّه الحركة عبر Cloudflare ويوفر CDN + حماية DDoS. "DNS only" (السحابة الرمادية) يؤدي فقط تحليل DNS.
غيّر nameservers عند مسجّل النطاق إلى القيم التي يوفرها Cloudflare:
ns1.cloudflare.com
ns2.cloudflare.com
SSL/TLS: اختر وضع Full (strict)
Caching:
Speed:
server {
listen 80;
server_name example.com;
root /var/www/mysite;
# ملفات HTML - بدون تخزين مؤقت
location ~* \.html$ {
add_header Cache-Control "no-cache, must-revalidate";
}
# CSS و JavaScript - تخزين مؤقت طويل للملفات ذات الإصدارات
location ~* \.(css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# الصور
location ~* \.(jpg|jpeg|png|gif|ico|webp|avif|svg)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Vary "Accept-Encoding";
}
# ملفات الخطوط
location ~* \.(woff|woff2|ttf|eot|otf)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header Access-Control-Allow-Origin "*";
}
# نقاط نهاية API - بدون تخزين مؤقت
location /api/ {
add_header Cache-Control "no-store, no-cache";
proxy_pass http://localhost:3000;
}
}
يضغط Gzip الملفات النصية (HTML، CSS، JS) ويقلل حجم النقل بنسبة 60-80%.
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml
image/svg+xml
font/truetype
font/opentype;
}
يوفر Brotli ضغطاً أفضل بنسبة 15-25% من gzip ويدعمه المتصفحات الحديثة.
# تثبيت وحدة Brotli
sudo apt install libnginx-mod-brotli -y
http {
brotli on;
brotli_comp_level 6;
brotli_static on;
brotli_types
text/plain
text/css
application/json
application/javascript
image/svg+xml;
}
sudo nginx -t && sudo systemctl reload nginx
# اختبار الضغط
curl -H "Accept-Encoding: br" -I https://example.com
# يجب أن يظهر: Content-Encoding: br
يوفر تنسيق WebP أحجام ملفات أصغر بنسبة 25-35% مقارنةً بـ JPEG و PNG.
# تثبيت أداة cwebp
sudo apt install webp -y
# تحويل ملف واحد
cwebp -q 80 image.jpg -o image.webp
# تحويل دفعي
for f in /var/www/mysite/images/*.jpg; do
cwebp -q 80 "$f" -o "${f%.jpg}.webp"
done
map $http_accept $webp_suffix {
default "";
"~*webp" ".webp";
}
server {
location ~* \.(jpg|jpeg|png)$ {
add_header Vary Accept;
try_files $uri$webp_suffix $uri =404;
}
}
| نوع المحتوى | Cache-Control | الوصف |
|---|---|---|
| HTML | no-cache | دائماً حديث |
| CSS/JS (مع hash) | public, immutable, max-age=31536000 | سنة واحدة |
| الصور | public, max-age=31536000 | سنة واحدة |
| استجابات API | no-store | لا تخزين مؤقت أبداً |
استخدم Chrome DevTools > تبويب Network لاختبار رؤوس ذاكرة التخزين المؤقت. تحقق من قيم Cache-Control و ETag و Age في رؤوس الاستجابة.
تكامل CDN وتحسين الملفات الثابتة يحسّنان أداء موقعك بشكل ملحوظ. استخدام Cloudflare CDN المجاني للتوزيع العالمي، ورؤوس ذاكرة التخزين المؤقت في Nginx للتخزين المؤقت في المتصفح، وgzip/brotli للضغط، وWebP لتحسين الصور معاً يمكن أن يقلل أوقات تحميل الصفحات بشكل كبير.
اختر وضع 'Full (strict)' في إعدادات SSL/TLS في Cloudflare. تأكد من أن الخادم يحتوي على شهادة SSL صالحة (Let's Encrypt). الوضع 'Flexible' غير آمن؛ الاتصال بين الخادم و Cloudflare غير مشفّر.
في Cloudflare Dashboard > Caching > Purge Cache يمكنك مسح كل ذاكرة التخزين المؤقت أو عناوين URL محددة. لذاكرة التخزين المؤقت FastCGI في Nginx استخدم 'sudo rm -rf /var/cache/nginx/fastcgi/*'. لمسح ذاكرة التخزين المؤقت للمتصفح اضغط Ctrl+Shift+R.
تحقق بالأمر 'curl -H "Accept-Encoding: gzip" -I https://example.com'. يجب أن تظهر الاستجابة 'Content-Encoding: gzip'. بدلاً من ذلك، تحقق من قيمة Content-Encoding في Chrome DevTools > Network > Response Headers.
يرسل Cloudflare IP الحقيقي في رأس CF-Connecting-IP. في Nginx، حدّد نطاقات IP لـ Cloudflare بتوجيه 'set_real_ip_from' وأضف 'real_ip_header CF-Connecting-IP;'. هذا يتيح لك رؤية IP المستخدم الحقيقي في ملفات السجل وتطبيقك.
دليل شامل لنشر تطبيقات Node.js على VPS. تثبيت Node.js عبر nvm، مدير العمليات PM2، وكيل Nginx العكسي، شهادة SSL وإدارة متغيرات البيئة.
دليل شامل لنشر تطبيقات PHP على VPS. مقارنة LAMP و LEMP، إعداد Apache/Nginx + PHP-FPM + MySQL، تهيئة المضيف الافتراضي وإدارة إصدارات PHP.
دليل تثبيت وتحسين WordPress على VPS. إعداد LEMP Stack، إعدادات wp-config.php، صلاحيات الملفات، SSL، تحسين أداء OPcache وتعزيز الأمان.