إعداد 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 لاستضافة عدة مواقع على سيرفر واحد بكفاءة عالية.
ابدأ الآن
تبي تجرب بنفسك؟ اختر باقة الاستضافة المناسبة أو صمم سيرفرك الخاص بالمواصفات اللي تبيها.
