آموزش Nginx به صورت رایگان؛ از نصب تا Reverse Proxy
اگر با سرور لینوکس، میزبانی وب یا توسعه وب کار میکنید، احتمالاً نام Nginx را زیاد دیدهاید. Nginx فقط یک Web Server ساده نیست؛ میتوان از آن بهعنوان Reverse Proxy، Load Balancer، HTTP Cache و حتی Proxy برای برخی سرویسهای دیگر استفاده کرد.
در این آموزش Nginx را از صفر شروع میکنیم و بدون نیاز به ابزارهای پیچیده، نصب، ساخت تنظیمات، اجرای یک سایت، Reverse Proxy، مدیریت سرویس و بررسی خطاها را یاد میگیریم.
برای انجام تمرینهای این مقاله میتوانید از یک سرور لینوکسی معمولی استفاده کنید. یک سرور مجازی ایران هم میتواند محیط مناسبی برای راهاندازی آزمایشگاهی Nginx، سایت شخصی یا سرویسهای داخلی باشد.

Nginx چیست؟
Nginx یک نرمافزار متنباز برای سرویسدهی HTTP و HTTPS است که میتواند نقش Web Server، Reverse Proxy، Load Balancer و Content Cache را ایفا کند. معماری Nginx مبتنی بر پردازش رویدادمحور است و معمولاً برای مدیریت تعداد زیادی اتصال همزمان عملکرد مناسبی دارد.
یکی از مزیتهای مهم Nginx این است که میتوان یک سرور را به شکلهای مختلف پیکربندی کرد. برای مثال:
- اجرای مستقیم فایلهای HTML و CSS
- قرار گرفتن جلوی یک برنامه Node.js
- قرار گرفتن جلوی PHP-FPM
- Reverse Proxy برای یک API
- توزیع درخواستها بین چند Backend
- مدیریت چند دامنه روی یک IP
- فعالسازی HTTPS
راهنمای رسمی Nginx نیز همین کاربردها، از سرو محتوای استاتیک تا Proxy و FastCGI را پوشش میدهد.
نصب Nginx روی Ubuntu
در این آموزش از Ubuntu و سیستمهای مبتنی بر Debian استفاده میکنیم.
ابتدا فهرست پکیجها را بهروزرسانی کنید:
sudo apt update
سپس Nginx را نصب کنید:
sudo apt install nginx -y
بعد از نصب، وضعیت سرویس را بررسی کنید:
sudo systemctl status nginx
اگر سرویس با موفقیت اجرا شده باشد، باید وضعیت active (running) را ببینید.
برای اطمینان بیشتر میتوانید نسخه Nginx را نیز مشاهده کنید:
nginx -v
اجرای خودکار Nginx بعد از Restart سرور
در محیط واقعی، معمولاً میخواهیم Nginx بعد از راهاندازی مجدد سرور بهصورت خودکار اجرا شود.
برای فعالکردن این قابلیت:
sudo systemctl enable nginx
و برای شروع سرویس:
sudo systemctl start nginx
دستورات اصلی مدیریت Nginx عبارتاند از:
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl restart nginx
sudo systemctl reload nginx
تفاوت reload و restart مهم است. در زمان تغییر پیکربندی، معمولاً reload انتخاب مناسبی است، چون Nginx میتواند تنظیمات جدید را بدون قطع کامل سرویس اعمال کند. Nginx قبل از اعمال تنظیمات جدید نیز ساختار پیکربندی را بررسی میکند.
فایل تنظیمات Nginx کجاست؟
در بیشتر نصبهای Ubuntu، فایل اصلی تنظیمات این مسیر است:
/etc/nginx/nginx.conf
اما تمام تنظیمات الزاماً داخل همین فایل نوشته نمیشوند.
معمولاً ساختار دایرکتوری به شکل زیر است:
/etc/nginx/
├── nginx.conf
├── sites-available/
├── sites-enabled/
├── conf.d/
├── snippets/
├── mime.types
└── modules-enabled/
فایل nginx.conf تنظیمات اصلی را در خود دارد و فایلهای دیگر میتوانند از طریق include وارد ساختار تنظیمات شوند.
برای مشاهده تنظیمات اصلی:
sudo nano /etc/nginx/nginx.conf
ساخت اولین سایت با Nginx
فرض کنید میخواهیم یک سایت ساده را روی دامنه example.com اجرا کنیم.
ابتدا یک مسیر برای فایلهای سایت ایجاد میکنیم:
sudo mkdir -p /var/www/example.com/html
سپس یک فایل HTML بسازید:
sudo nano /var/www/example.com/html/index.html
محتوای زیر را داخل آن قرار دهید:
<!DOCTYPE html>
<html lang="fa">
<head>
<meta charset="UTF-8">
<title>Nginx Test</title>
</head>
<body>
<h1>Nginx is working!</h1>
<p>این صفحه توسط Nginx سرو میشود.</p>
</body>
</html>
حالا باید یک Server Block برای دامنه ایجاد کنیم.
Server Block در Nginx چیست؟
در Nginx مفهومی شبیه Virtual Host در برخی Web Serverهای دیگر وجود دارد که در Ubuntu معمولاً با نام Server Block شناخته میشود.
فایل زیر را ایجاد کنید:
sudo nano /etc/nginx/sites-available/example.com
و این تنظیمات را قرار دهید:
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
در این تنظیمات:
listen 80 مشخص میکند Nginx روی پورت HTTP شماره ۸۰ درخواستها را دریافت کند.
server_name دامنههایی را مشخص میکند که این Server Block باید برای آنها استفاده شود.
root مسیر فایلهای سایت را تعیین میکند.
index فایل پیشفرض هنگام دسترسی به ریشه سایت را مشخص میکند.
location / نیز رفتار درخواستهای ورودی را تعریف میکند.
فعال کردن سایت
صرفاً ساختن فایل داخل sites-available کافی نیست. باید آن را فعال کنیم.
دستور زیر را اجرا کنید:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
سپس قبل از Reload کردن Nginx، حتماً Syntax تنظیمات را بررسی کنید:
sudo nginx -t
اگر همهچیز درست باشد، خروجی مشابه زیر مشاهده میکنید:
syntax is ok
test is successful
حالا تنظیمات را اعمال کنید:
sudo systemctl reload nginx
در این مرحله اگر DNS دامنه به IP سرور اشاره کند، سایت باید روی دامنه در دسترس باشد.
دستور مهم nginx -t
یکی از مهمترین دستورهایی که هنگام کار با Nginx باید یاد بگیرید:
sudo nginx -t
این دستور قبل از Reload یا Restart به شما کمک میکند متوجه شوید Syntax فایلهای تنظیمات صحیح است یا خیر.
مثلاً اگر یک ; را فراموش کرده باشید، احتمالاً Nginx خطا را در همین مرحله اعلام میکند.
بنابراین بهجای اینکه مستقیماً بعد از هر تغییر این دستور را بزنید:
sudo systemctl restart nginx
بهتر است ابتدا:
sudo nginx -t
و سپس:
sudo systemctl reload nginx
را اجرا کنید.
Reverse Proxy چیست؟
یکی از کاربردهای مهم Nginx، قرار گرفتن جلوی یک برنامه دیگر است.
فرض کنید یک برنامه Node.js روی پورت 3000 در حال اجراست:
Application
127.0.0.1:3000
کاربر نباید لزوماً مستقیماً به پورت ۳۰۰۰ متصل شود. میتوان Nginx را روی پورت ۸۰ یا ۴۴۳ قرار داد و درخواستها را به برنامه اصلی ارسال کرد.
ساختار کلی به این شکل خواهد بود:
User
|
v
Nginx
|
v
Application :3000
در این حالت Nginx نقش Reverse Proxy را دارد.
تنظیم Nginx برای Reverse Proxy
یک Server Block مانند نمونه زیر ایجاد کنید:
server {
listen 80;
server_name example.com;
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;
}
}
مهمترین خط این بخش:
proxy_pass http://127.0.0.1:3000;
است.
یعنی Nginx درخواست دریافتشده را به برنامهای که روی پورت ۳۰۰۰ در حال اجراست منتقل میکند.
Nginx بهصورت رسمی قابلیت Proxy را پشتیبانی میکند و در راهنمای خود نیز نمونهای از proxy_pass ارائه کرده است.
Nginx برای PHP چگونه کار میکند؟
Nginx بهتنهایی PHP را اجرا نمیکند.
معمولاً برای اجرای PHP در کنار Nginx از PHP-FPM استفاده میشود.
معماری به شکل زیر است:
Browser
|
v
Nginx
|
v
PHP-FPM
|
v
PHP Application
در این حالت Nginx درخواست فایلهای PHP را به PHP-FPM منتقل میکند.
یک نمونه تنظیمات رایج:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
}
البته نام Socket باید با نسخه PHP نصبشده روی سرور شما مطابقت داشته باشد.
برای مشاهده Socketهای PHP:
ls /run/php/
بررسی لاگهای Nginx
وقتی یک سایت یا Reverse Proxy مشکل دارد، اولین جایی که باید بررسی کنید لاگها هستند.
مسیر رایج لاگها:
/var/log/nginx/access.log
/var/log/nginx/error.log
برای مشاهده آخرین خطاها:
sudo tail -f /var/log/nginx/error.log
و برای مشاهده درخواستهای ورودی:
sudo tail -f /var/log/nginx/access.log
مثلاً اگر Backend از دسترس خارج شده باشد، ممکن است در error.log خطاهایی مثل connection refused مشاهده کنید.
راهنمای رسمی Nginx نیز بررسی access.log و error.log را بهعنوان یکی از راههای عیبیابی معرفی میکند.
تغییر پورت Nginx
بهصورت پیشفرض، HTTP روی پورت ۸۰ اجرا میشود.
مثلاً میتوان Server Block را به این شکل تغییر داد:
server {
listen 8080;
server_name example.com;
root /var/www/example.com/html;
index index.html;
}
بعد از ذخیره فایل:
sudo nginx -t
و سپس:
sudo systemctl reload nginx
اما اگر فایروال فعال باشد، باید پورت جدید را نیز در فایروال مجاز کنید.
اجازه دادن به HTTP و HTTPS در UFW
اگر از UFW استفاده میکنید، میتوانید HTTP و HTTPS را با دستور زیر فعال کنید:
sudo ufw allow 'Nginx Full'
برای مشاهده قوانین فعلی:
sudo ufw status
اگر فقط HTTP لازم دارید:
sudo ufw allow 'Nginx HTTP'
و برای HTTPS:
sudo ufw allow 'Nginx HTTPS'
فعال کردن HTTPS
در محیط Production بهتر است سرویسهای عمومی با HTTPS ارائه شوند.
برای این کار معمولاً از گواهی TLS استفاده میشود. در اکوسیستم لینوکس، ترکیب Nginx و Let’s Encrypt یکی از روشهای رایج برای فعالسازی HTTPS است.
بعد از فعال شدن HTTPS، ساختار سرویس تقریباً به این صورت خواهد بود:
Client
|
HTTPS :443
|
v
Nginx
|
v
Backend
در پروژههای واقعی، Nginx میتواند وظایفی مانند Termination اتصال TLS، Reverse Proxy و مسیریابی درخواستها را بر عهده بگیرد.
چند تنظیم کاربردی Nginx برای Production
وقتی Nginx را روی سرور واقعی اجرا میکنید، صرفاً بالا آمدن صفحه کافی نیست. بهتر است تنظیمات را متناسب با سرویس خود بررسی کنید.
برای مثال:
server_tokens off;
میتواند نمایش نسخه Nginx در برخی پاسخهای خطا را محدود کند.
برای فعال کردن فشردهسازی:
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml;
برای فایلهای Static نیز میتوان Cache-Control تعریف کرد:
location ~* \.(jpg|jpeg|png|gif|css|js|svg|webp)$ {
expires 7d;
add_header Cache-Control "public";
}
البته تنظیمات Cache باید متناسب با نوع سایت انجام شود. اگر فایلهای CSS و JavaScript با محتوای جدید بدون تغییر نام یا نسخه منتشر میشوند، Cache طولانی میتواند باعث نمایش نسخه قدیمی در مرورگر شود.
استفاده از Nginx روی VPS
Nginx روی منابع سختافزاری مختلف قابل اجراست و برای بسیاری از پروژههای کوچک و متوسط نیازی به سرور بسیار قدرتمند ندارد.
برای یادگیری و تست میتوانید یک VPS لینوکسی تهیه کنید و تمام مراحل این مقاله را روی آن اجرا کنید. مثلاً یک سرور مجازی ایران برای آزمایش تنظیمات Nginx، اجرای Web Server، Reverse Proxy یا سرویسهای داخلی گزینهای عملی است.
البته در محیط Production فقط CPU و RAM مهم نیستند. نوع دیسک، کیفیت شبکه، پایداری اتصال، تنظیمات فایروال، سیستمعامل و معماری برنامه نیز روی نتیجه نهایی تأثیر دارند.
عیبیابی مشکلات رایج Nginx
خطای ۵۰۲ Bad Gateway
اگر از Reverse Proxy استفاده میکنید و با خطای:
502 Bad Gateway
مواجه شدید، ابتدا Backend را بررسی کنید.
برای مثال اگر برنامه باید روی پورت ۳۰۰۰ اجرا شود:
curl http://127.0.0.1:3000
اگر برنامه پاسخ ندهد، مشکل احتمالاً در Backend است، نه در Nginx.
بعد لاگ را بررسی کنید:
sudo tail -50 /var/log/nginx/error.log
خطای ۴۰۳ Forbidden
خطای ۴۰۳ معمولاً میتواند به مجوزهای فایل و دایرکتوری یا تنظیمات Nginx مربوط باشد.
ابتدا وضعیت فایلها را بررسی کنید:
ls -lah /var/www/example.com/html
همچنین مطمئن شوید Nginx به مسیر موردنظر دسترسی دارد.
خطای ۴۰۴ Not Found
اگر Nginx فایل موردنظر را پیدا نمیکند، مقدار root و ساختار URL را بررسی کنید:
root /var/www/example.com/html;
بعد مطمئن شوید فایل واقعاً در همین مسیر وجود دارد:
ls -lah /var/www/example.com/html
بررسی کامل تنظیمات Nginx
برای نمایش نسخه:
nginx -v
برای تست Syntax:
sudo nginx -t
برای نمایش تنظیمات Compile شده:
nginx -V
برای مشاهده وضعیت سرویس:
sudo systemctl status nginx
و برای مشاهده لاگ سرویس:
sudo journalctl -u nginx
این چند دستور در زمان عیبیابی بسیار کاربردی هستند.
نکات امنیتی مهم برای Nginx
راهاندازی Web Server فقط نصب نرمافزار نیست. چند نکته ساده میتواند سطح امنیت سرویس را بهتر کند.
اول، سیستمعامل را بهروز نگه دارید:
sudo apt update
sudo apt upgrade
دوم، سرویسهای غیرضروری را روی اینترنت عمومی باز نگذارید.
سوم، Backend را ترجیحاً روی 127.0.0.1 اجرا کنید، مگر اینکه واقعاً نیاز داشته باشید از شبکه دیگری مستقیماً به آن متصل شوید.
مثلاً:
127.0.0.1:3000
برای بسیاری از کاربردهای Reverse Proxy مناسبتر از این است:
0.0.0.0:3000
همچنین Ruleهای فایروال را دقیق بررسی کنید و فقط پورتهایی را باز بگذارید که واقعاً موردنیاز هستند.
جمعبندی دستورات مهم Nginx
اگر بخواهیم مهمترین دستورات این آموزش را یکجا داشته باشیم:
# نصب
sudo apt update
sudo apt install nginx -y
# وضعیت سرویس
sudo systemctl status nginx
# شروع
sudo systemctl start nginx
# توقف
sudo systemctl stop nginx
# راهاندازی مجدد
sudo systemctl restart nginx
# اعمال تنظیمات جدید
sudo systemctl reload nginx
# بررسی تنظیمات
sudo nginx -t
# نمایش نسخه
nginx -v
# مشاهده لاگ خطا
sudo tail -f /var/log/nginx/error.log
# مشاهده لاگ درخواستها
sudo tail -f /var/log/nginx/access.log
مسیر یادگیری بعدی Nginx
بعد از یادگیری مباحث این مقاله، بهتر است سراغ مفاهیم زیر بروید:
- Reverse Proxy پیشرفته
- Load Balancing
- HTTPS و TLS
- PHP-FPM
- Cache در Nginx
- Rate Limiting
- امنیت Headerها
- مدیریت چندین دامنه
- Nginx در Docker
- Nginx در معماری Microservices
وقتی این مفاهیم را روی یک سرور واقعی تمرین کنید، Nginx خیلی سریع از یک فایل تنظیمات مبهم به ابزاری قابلکنترل برای مدیریت ترافیک تبدیل میشود. برای محیطهای آزمایشی و سرویسهای داخلی نیز میتوانید از یک سرور مجازی ایران استفاده کنید و تنظیمات مختلف را بدون نیاز به خرید سرور اختصاصی تست کنید.
برای مطالعه بیشتر، مستندات رسمی Nginx نیز مرجع مناسبی برای بررسی Directiveها، Server Name، Reverse Proxy، HTTPS و سایر قابلیتهای این وبسرور است:
https://nginx.org/en/docs/
سوالات متداول
Nginx چیست؟
Nginx یک نرمافزار متنباز برای سرویسدهی HTTP و HTTPS است که میتواند نقش Web Server، Reverse Proxy، Load Balancer و Content Cache را ایفا کند. معماری Nginx مبتنی بر پردازش رویدادمحور است و معمولاً برای مدیریت تعداد زیادی اتصال همزمان عملکرد مناسبی دارد.