كلاود
أدلة

إعداد Nginx: دليل شامل من الصفر

كلاود|٢٤ يناير ٢٠٢٦|5 دقائق قراءة|٦٣٧ مشاهدة
إعداد Nginx: دليل شامل من الصفر

Server blocks، SSL، gzip، caching، reverse proxy — كل إعداد Nginx تحتاجه. نشرح مع ملفات تكوين جاهزة.

لماذا nginx؟

nginx (يُنطق "engine-x") هو خادم ويب ووكيل عكسي (Reverse Proxy) يتصدر قائمة أكثر خوادم الويب استخداماً عالمياً. يخدم أكثر من 30% من مواقع الإنترنت — بما فيها Netflix وAirbnb وDropbox. يتميز بأداء عالٍ واستهلاك ذاكرة منخفض مقارنة بـ Apache، خاصة مع الاتصالات المتزامنة العالية.

التثبيت

# Ubuntu/Debian
sudo apt update
sudo apt install nginx -y

# التشغيل والتفعيل
sudo systemctl start nginx
sudo systemctl enable nginx

# التحقق من الحالة
sudo systemctl status nginx

# التحقق من الإصدار
nginx -v

هيكل الملفات

/etc/nginx/
├── nginx.conf # الإعدادات الرئيسية
├── conf.d/ # إعدادات إضافية
├── sites-available/ # المواقع المتاحة
├── sites-enabled/ # المواقع المفعّلة (روابط رمزية)
├── snippets/ # مقاطع قابلة لإعادة الاستخدام
└── mime.types # أنواع الملفات

الإعدادات الرئيسية (nginx.conf)

# ملف: /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
worker_rlimit_nofile 65535;

events {
 worker_connections 4096;
 multi_accept on;
 use epoll;
}

http {
 # أساسيات
 sendfile on;
 tcp_nopush on;
 tcp_nodelay on;
 types_hash_max_size 2048;
 server_tokens off; # إخفاء إصدار nginx
 client_max_body_size 100M;

 # MIME Types
 include /etc/nginx/mime.types;
 default_type application/octet-stream;

 # تسجيل الوصول
 access_log /var/log/nginx/access.log;
 error_log /var/log/nginx/error.log;

 # ضغط Gzip
 gzip on;
 gzip_vary on;
 gzip_proxied any;
 gzip_comp_level 5;
 gzip_min_length 256;
 gzip_types
 text/plain
 text/css
 text/xml
 text/javascript
 application/json
 application/javascript
 application/xml
 application/rss+xml
 image/svg+xml;

 # Timeouts
 keepalive_timeout 65;
 client_body_timeout 12;
 client_header_timeout 12;
 send_timeout 10;

 # تضمين إعدادات المواقع
 include /etc/nginx/conf.d/*.conf;
 include /etc/nginx/sites-enabled/*;
}

إعداد موقع مع PHP (Laravel)

# ملف: /etc/nginx/sites-available/example.com

server {
 listen 80;
 listen [::]:80;
 server_name example.com www.example.com;
 root /var/www/example.com/public;
 index index.php index.html;

 # تسجيل خاص بالموقع
 access_log /var/log/nginx/example.com.access.log;
 error_log /var/log/nginx/example.com.error.log;

 # أمان
 location ~ /\.(?!well-known) {
 deny all;
 }

 location ~* \.(env|log|git)$ {
 deny all;
 }

 # الملفات الثابتة
 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
 expires 30d;
 add_header Cache-Control "public, immutable";
 access_log off;
 }

 # Laravel Routing
 location / {
 try_files $uri $uri/ /index.php?$query_string;
 }

 # PHP-FPM
 location ~ \.php$ {
 fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
 fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
 include fastcgi_params;
 fastcgi_buffer_size 128k;
 fastcgi_buffers 4 256k;
 fastcgi_busy_buffers_size 256k;
 fastcgi_read_timeout 300;
 }
}

تفعيل الموقع:

# إنشاء رابط رمزي
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

# التحقق من صحة الإعدادات
sudo nginx -t

# إعادة التحميل
sudo systemctl reload nginx

إعداد SSL مع Let's Encrypt

# تثبيت Certbot
sudo apt install certbot python3-certbot-nginx -y

# الحصول على شهادة
sudo certbot --nginx -d example.com -d www.example.com

# التجديد التلقائي (يُضاف تلقائياً عبر cron/systemd)
sudo certbot renew --dry-run

إعدادات SSL المحسّنة

server {
 listen 443 ssl http2;
 listen [::]:443 ssl http2;
 server_name example.com www.example.com;

 # شهادات SSL
 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

 # بروتوكولات وخوارزميات
 ssl_protocols TLSv1.2 TLSv1.3;
 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
 ssl_prefer_server_ciphers off;

 # OCSP Stapling
 ssl_stapling on;
 ssl_stapling_verify on;

 # Session Cache
 ssl_session_cache shared:SSL:10m;
 ssl_session_timeout 1d;
 ssl_session_tickets off;

 # رؤوس الأمان
 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
 add_header X-Content-Type-Options "nosniff" always;
 add_header X-Frame-Options "SAMEORIGIN" always;
 add_header X-XSS-Protection "1; mode=block" always;
 add_header Referrer-Policy "strict-origin-when-cross-origin" always;

 root /var/www/example.com/public;
 index index.php;

 # ... باقي الإعدادات كما في الأعلى
}

# إعادة توجيه HTTP إلى HTTPS
server {
 listen 80;
 listen [::]:80;
 server_name example.com www.example.com;
 return 301 https://$host$request_uri;
}

الوكيل العكسي (Reverse Proxy)

لتوجيه الطلبات لتطبيق يعمل على منفذ محدد (Node.js، Python، إلخ):

server {
 listen 80;
 server_name api.example.com;

 location / {
 proxy_pass http://127.0.0.1:3000;
 proxy_http_version 1.1;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection 'upgrade';
 proxy_set_header Host $host;
 proxy_set_header X-Real-IP $remote_addr;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto $scheme;
 proxy_cache_bypass $http_upgrade;
 proxy_read_timeout 90;
 }
}

تحديد معدل الطلبات (Rate Limiting)

# في كتلة http (nginx.conf)
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login_limit:10m rate=3r/m;

# في كتلة server
server {
 # API — 10 طلبات في الثانية
 location /api/ {
 limit_req zone=api_limit burst=20 nodelay;
 proxy_pass http://127.0.0.1:8000;
 }

 # صفحة تسجيل الدخول — 3 محاولات في الدقيقة
 location /login {
 limit_req zone=login_limit burst=5;
 try_files $uri /index.php?$query_string;
 }
}

التخزين المؤقت (Caching)

# في كتلة http
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=app_cache:10m max_size=1g inactive=60m;

# في كتلة location
location /api/public/ {
 proxy_cache app_cache;
 proxy_cache_valid 200 10m;
 proxy_cache_valid 404 1m;
 proxy_cache_use_stale error timeout updating http_500;
 add_header X-Cache-Status $upstream_cache_status;
 proxy_pass http://127.0.0.1:8000;
}

مواقع متعددة على سيرفر واحد

# الموقع الأول
server {
 listen 80;
 server_name site1.com;
 root /var/www/site1/public;
 # ...
}

# الموقع الثاني
server {
 listen 80;
 server_name site2.com;
 root /var/www/site2/public;
 # ...
}

# API على نطاق فرعي
server {
 listen 80;
 server_name api.site1.com;
 location / {
 proxy_pass http://127.0.0.1:8080;
 }
}

أوامر الإدارة الأساسية

# اختبار الإعدادات
sudo nginx -t

# إعادة التحميل (بدون توقف)
sudo systemctl reload nginx

# إعادة التشغيل الكامل
sudo systemctl restart nginx

# عرض الإعدادات الفعلية
sudo nginx -T

# عرض السجلات
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/nginx/access.log

تصحيح الأخطاء الشائعة

الخطأ السبب المحتمل الحل
502 Bad Gateway PHP-FPM لا يعمل sudo systemctl restart php8.3-fpm
403 Forbidden صلاحيات خاطئة chown -R www-data:www-data /var/www
413 Request Entity Too Large حجم الرفع محدود زيادة client_max_body_size
504 Gateway Timeout العملية تأخذ وقتاً طويلاً زيادة fastcgi_read_timeout

nginx على كلاود

سيرفرات كلاود (cloud.net.sa) تأتي بنظام Ubuntu نظيف وصلاحية root — ثبّت nginx واضبط إعداداتك بالكامل. مع أقراص SSD سريعة وزمن استجابة 8ms من الرياض، تحصل على أداء عالٍ لمواقعك وتطبيقاتك.

ابدأ بسيرفر VPS من كلاود بسعر يبدأ من أسعار تنافسية — الأسعار والباقات وأعدّ nginx لاستضافة عدة مواقع على سيرفر واحد بكفاءة عالية.


ابدأ الآن

تبي تجرب بنفسك؟ اختر باقة الاستضافة المناسبة أو صمم سيرفرك الخاص بالمواصفات اللي تبيها.

مشاركة