نصب Nginx روی اوبونتو چند دقیقه کار دارد، ولی کانفیگ درست آن چیزی است که سایت را پایدار و سریع می کند. Nginx وب سرور سبکی است که فایل های ثابت (عکس، CSS، جاوااسکریپت) را سریع می دهد، درخواست ها را به PHP-FPM می رساند و می تواند جلوی برنامه هایی مثل Node.js و Python به عنوان reverse proxy قرار بگیرد. در بسیاری از سرورها جایگزین Apache شده یا کنار آن کار می کند.
نصب و بررسی اولیه
sudo apt update
sudo apt install nginx
sudo systemctl enable --now nginx
sudo nginx -v
اگر فایروال UFW فعال است، باید پورت های وب را باز کنید:
sudo ufw allow "Nginx Full"
sudo ufw status
حالا آدرس IP سرور را در مرورگر باز کنید؛ صفحه خوش آمد Nginx باید دیده شود. اگر دیده نشد، sudo systemctl status nginx را ببینید و مطمئن شوید فایروال شبکه هم پورت 80 را باز گذاشته است.
ساختار فایل های تنظیمات
| مسیر | کاربرد |
|---|---|
| /etc/nginx/nginx.conf | تنظیمات اصلی و سراسری |
| /etc/nginx/sites-available/ | فایل تنظیمات هر سایت |
| /etc/nginx/sites-enabled/ | لینک سایت های فعال به sites-available |
| /var/log/nginx/access.log | لاگ همه درخواست ها |
| /var/log/nginx/error.log | لاگ خطاها؛ اولین جا برای عیب یابی |
| /var/www/ | محل رایج فایل های سایت |
این ساختار مخصوص اوبونتو و دبیان است. در AlmaLinux و خانواده RHEL تنظیمات سایت ها معمولاً در /etc/nginx/conf.d/ قرار می گیرد.
ساخت server block برای یک سایت
برای سایت example.com فایل زیر را بسازید:
sudo nano /etc/nginx/sites-available/example.com
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com/public;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
}
سپس فعالش کنید، تنظیمات را تست کنید و بدون قطع اتصال های موجود بارگذاری مجدد کنید:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
عادت کنید همیشه قبل از reload، nginx -t را اجرا کنید. تنظیم اشتباهی که با restart اعمال شود می تواند همه سایت های سرور را از کار بیندازد.
اتصال به PHP-FPM
Nginx خودش PHP اجرا نمی کند و درخواست را به PHP-FPM می فرستد:
sudo apt install php-fpm php-mysql
داخل server block این location را اضافه کنید (نسخه PHP را مطابق سرور خودتان بگذارید):
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
location ~ /\.ht {
deny all;
}
اگر نسخه یا مسیر سوکت درست نباشد، خطای 502 می گیرید. مسیر سوکت واقعی را با ls /run/php/ ببینید. برای سایت وردپرسی، بخش location / را با try_files $uri $uri/ /index.php?$args; عوض کنید تا لینک های زیبا کار کنند.
Nginx به عنوان reverse proxy
برای برنامه ای که روی پورت داخلی (مثلاً 3000) گوش می دهد، Nginx جلوی آن قرار می گیرد، SSL را مدیریت می کند و درخواست ها را پاس می دهد:
location / {
proxy_pass http://127.0.0.1:3000;
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;
}
برای برنامه هایی که WebSocket دارند باید هدرهای Upgrade و Connection هم پاس داده شوند. این الگو همان روشی است که برای برنامه های داکر هم استفاده می شود، که در آموزش نصب داکر هم دیده اید.
HTTPS
گواهی SSL رایگان را با Certbot بگیرید و Nginx را خودکار تنظیم کنید:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
جزئیات تمدید، ریدایرکت و خطاهای گواهی را در نصب SSL روی سرور آورده ایم.
تنظیمات کارایی
در بلوک http فایل nginx.conf یا در server block این تنظیم ها را بررسی کنید:
gzip on;
gzip_types text/css application/javascript application/json image/svg+xml;
gzip_min_length 1024;
location ~* \.(css|js|png|jpg|jpeg|webp|svg|woff2)$ {
expires 30d;
add_header Cache-Control "public";
}
- فشرده سازی gzip حجم متن ها را کم می کند. فایل های تصویری از قبل فشرده اند و فشرده کردنشان فایده ندارد.
- تعداد worker ها را با
worker_processes auto;برابر تعداد هسته های CPU بگذارید. - محدودیت اندازه آپلود را با
client_max_body_sizeتنظیم کنید. مقدار پیش فرض 1 مگابایت است و آپلود فایل بزرگ تر خطای 413 می دهد. - با
limit_reqمی شود تعداد درخواست های مشکوک از یک IP را محدود کرد.
اگر سرعت سایت شما هنوز پایین است، مشکل معمولاً در PHP، دیتابیس یا دیسک است. روش پیدا کردن علت را در افزایش سرعت سرور مجازی نوشته ایم.
خطاهای رایج
- 502 Bad Gateway: برنامه پشت Nginx (PHP-FPM یا برنامه شما) اجرا نیست یا مسیر سوکت اشتباه است. لاگ
error.logدلیل دقیق را می گوید. - 403 Forbidden: Nginx اجازه خواندن پوشه را ندارد یا فایل index وجود ندارد. مالک و مجوز پوشه های سایت را چک کنید (کاربر Nginx معمولاً www-data است).
- 404 در صفحه های داخلی وردپرس:
try_filesدرست تنظیم نشده. - 504 Gateway Timeout: برنامه برای جواب دادن زیادی طول کشیده. ابتدا علت کندی را رفع کنید و بعد در صورت لزوم timeout را بالا ببرید.
- تنظیمات اعمال نمی شود: server_name یا پورت با درخواست نمی خواند و Nginx سایت پیش فرض را نشان می دهد. دستور
nginx -Tکل تنظیمات نهایی را نشان می دهد.
load balancer ساده با upstream
Nginx می تواند ترافیک را بین چند سرور برنامه پخش کند. یک نمونه با دو سرور:
upstream app_backend {
least_conn;
server 10.10.30.11:3000;
server 10.10.30.12:3000;
server 10.10.30.13:3000 backup;
}
server {
listen 80;
location / {
proxy_pass http://app_backend;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
روش پیش فرض round-robin است. least_conn درخواست را به سروری می دهد که اتصال کمتری دارد. سرور با برچسب backup فقط وقتی استفاده می شود که بقیه از کار بیفتند. نسخه رایگان Nginx بررسی سلامت فعال ندارد و فقط شکست اتصال را تشخیص می دهد؛ برای معماری های بزرگ تر هاست پربازدید با لود بالانسینگ را ببینید.
محدود کردن درخواست ها
برای جلوگیری از حدس رمز و درخواست های بی مورد به صفحه ورود:
limit_req_zone $binary_remote_addr zone=login:10m rate=5r/m;
location = /wp-login.php {
limit_req zone=login burst=5 nodelay;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
این تنظیم هر IP را به 5 درخواست در دقیقه (با اندکی burst) محدود می کند. مقدار را متناسب با رفتار کاربران واقعی تنظیم کنید و اگر پشت CDN هستید، IP واقعی بازدیدکننده را از هدر مناسب بخوانید، وگرنه همه کاربران یک IP دیده می شوند (CDN چیست).
هدرهای امنیتی و پنهان کردن نسخه
server_tokens off;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
server_tokens off نسخه Nginx را از صفحه خطا و هدرها حذف می کند. این کار آسیب پذیری را برطرف نمی کند ولی اطلاعات رایگان به اسکنرها نمی دهد. مهم تر از آن، نسخه Nginx و PHP را به روز نگه دارید.
لاگ ها و چرخش لاگ
لاگ دسترسی و خطا به سرعت بزرگ می شوند. در اوبونتو، logrotate به صورت پیش فرض برای Nginx تنظیم شده و فایل /etc/logrotate.d/nginx آن را مشخص می کند. اگر لاگ جداگانه برای هر سایت ساخته اید، مطمئن شوید همان قاعده شامل آن ها می شود، وگرنه دیسک آرام آرام پر می شود. برای دیدن پرتکرارترین آدرس ها در لاگ:
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
و برای دیدن آدرس هایی که بیشترین درخواست را می فرستند، ستون اول (IP) را بشمارید. این بررسی ساده اگر سایت ناگهان کند شد، نشان می دهد ربات یا حمله ای در کار است یا نه.
Nginx یا Apache
| موضوع | Nginx | Apache |
|---|---|---|
| معماری | مبتنی بر رویداد؛ تعداد زیادی اتصال را با منابع کم نگه می دارد | بر پایه پردازه یا نخ برای هر اتصال (بسته به MPM)؛ منعطف ولی در بار بالا منابع بیشتری می خواهد |
| فایل .htaccess | ندارد؛ همه تنظیمات در فایل های اصلی است | دارد و بدون ری استارت قابل تغییر است |
| کاربرد رایج | reverse proxy، فایل های ثابت، سایت های پربازدید | هاست مشترک، برنامه هایی که به .htaccess وابسته اند |
| اجرای PHP | همیشه از طریق PHP-FPM | mod_php یا PHP-FPM |
بعضی سرورها هر دو را کنار هم دارند: Nginx جلو برای فایل های ثابت و SSL و Apache پشت آن برای برنامه هایی که به .htaccess نیاز دارند. اگر برنامه شما قاعده های بازنویسی آدرس را در .htaccess نوشته، هنگام رفتن به Nginx باید آن ها را به location و rewrite تبدیل کنید. کنترل پنل هایی مثل DirectAdmin و cPanel هر دو را پشتیبانی می کنند (سی پنل یا دایرکت ادمین).
به روزرسانی و تست قبل از اعمال
Nginx با به روزرسانی بسته های سیستم عامل نسخه جدید می گیرد. بعد از آن همیشه nginx -t را اجرا کنید و با systemctl reload nginx تنظیمات را بدون قطع اتصال های فعلی بارگذاری کنید. restart کامل فقط برای تغییر در ماژول ها یا پورت هایی است که reload آن ها را نمی گیرد. اگر چند سایت دارید، قبل از reload سایت پیش فرض را هم بررسی کنید که درخواست های ناشناس به سایت اصلی شما نرسد؛ یک server block با listen 80 default_server; و return 444; این کار را می کند.
نقش Nginx به عنوان reverse proxy و فرق آن با پروکسی رو به جلو در پروکسی چیست توضیح داده شده.
محل اعمال قوانین فیلتر درخواست ها را در WAF چیست ببینید.
منابع و مستندات رسمی
نصب و امن سازی پایه خود سرور را در نصب لینوکس روی سرور نوشته ایم. اگر ترجیح می دهید تنظیم Nginx، گواهی ها، کش و بهینه سازی سایت ها را کسی دیگر انجام دهد، با مدیریت سرور لینوکس شروع کنید.



