تقریباً هر سرویس وب جدی، از یک سایت وردپرسی تا یک API یا n8n، پشت یک Reverse Proxy اجرا میشود. Reverse Proxy سرور واسطی است که درخواست کاربران را دریافت میکند و به سرویس مناسب در پشت صحنه میرساند. در این مقاله توضیح میدهیم Reverse Proxy چیست، چه تفاوتی با Forward Proxy دارد، چه کاربردهایی دارد و چطور یک Reverse Proxy درست با Nginx راهاندازی کنیم.
فهرست مطالب
Reverse Proxy چیست؟
Reverse Proxy سروری است که در جلوی یک یا چند سرویس قرار میگیرد. کاربران فقط با Reverse Proxy ارتباط دارند؛ Reverse Proxy درخواست را بررسی میکند، به سرویس مناسب در پشت (Backend یا Upstream) میفرستد و پاسخ را به کاربر برمیگرداند. از دید کاربر، فقط یک سایت وجود دارد؛ او نمیداند پشت آن یک سرویس است یا ده سرویس، و IP و پورت داخلی آنها را نمیبیند.
تفاوت Reverse Proxy و Forward Proxy
| ویژگی | Forward Proxy | Reverse Proxy |
|---|---|---|
| طرف چه کسی است؟ | کاربر (کلاینت) | سرور |
| چه کسی را پنهان میکند؟ | کاربران را از سرورها | سرورها را از کاربران |
| کاربرد رایج | کنترل و فیلتر دسترسی کاربران یک سازمان به اینترنت، کش | انتشار سرویسها، HTTPS، توزیع بار، امنیت |
| چه کسی تنظیمش میکند؟ | کاربر یا مدیر شبکه کاربران | مدیر سرور |
۷ کاربرد Reverse Proxy
- مدیریت HTTPS (SSL Termination): گواهی SSL یک جا روی Reverse Proxy نصب و تمدید میشود و سرویسهای پشت آن لازم نیست درگیر TLS شوند.
- انتشار چند سرویس روی یک IP: بر اساس نام دامنه یا مسیر، درخواستها به سرویسهای مختلف میروند؛ مثلاً
example.comبه وردپرس،n8n.example.comبه n8n و/apiبه یک API. - پنهان کردن سرویسهای داخلی: سرویسها فقط روی
127.0.0.1یا شبکه خصوصی گوش میدهند و از اینترنت مستقیماً قابل دسترسی نیستند. - توزیع بار (Load Balancing): تقسیم درخواستها بین چند سرور برای ظرفیت و تحمل خرابی بیشتر.
- کش: نگهداری پاسخهای تکراری و کاهش بار سرویس اصلی.
- امنیت و کنترل دسترسی: محدودیت نرخ، محدودیت IP، احراز هویت ساده و WAF در یک نقطه.
- فشردهسازی و HTTP/۲ و HTTP/۳: بهینهسازی ارتباط با کاربر بدون تغییر در اپلیکیشن.
ابزارهای رایج
- Nginx: رایجترین انتخاب؛ سریع، سبک و همهکاره.
- Caddy: پیکربندی بسیار ساده و دریافت و تمدید خودکار گواهی SSL.
- Traefik: مناسب محیطهای Docker و Kubernetes با کشف خودکار سرویسها.
- HAProxy: متخصص توزیع بار با کارایی بسیار بالا.
- Apache: با ماژول mod_proxy نقش Reverse Proxy را هم ایفا میکند. مقایسه وبسرورها در LiteSpeed یا Apache.
CDNها هم در واقع Reverse Proxyهای توزیعشده جهانی هستند.
پیکربندی Reverse Proxy با Nginx
فرض کنید یک اپلیکیشن روی پورت ۳۰۰۰ همان سرور اجرا میشود و میخواهید آن را روی app.example.com با HTTPS منتشر کنید:
server {
listen 80;
server_name app.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name app.example.com;
ssl_certificate /etc/letsencrypt/live/app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/app.example.com/privkey.pem;
client_max_body_size 20m;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
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_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
}
}
گواهی را با Certbot بگیرید و پیکربندی را بررسی و اعمال کنید:
sudo certbot certonly --nginx -d app.example.com
sudo nginx -t && sudo systemctl reload nginx
اپلیکیشن باید فقط روی 127.0.0.1:3000 گوش دهد، نه روی همه رابطها. نمونههای واقعی این الگو را در نصب n8n روی VPS و ساخت API سازگار با OpenAI ببینید.
هدرهای مهم و IP واقعی کاربر
Host: نام دامنه درخواست را به اپلیکیشن منتقل میکند.X-Forwarded-ForوX-Real-IP: IP واقعی کاربر؛ بدون آن، اپلیکیشن همه درخواستها را از ۱۲۷.۰.۰.۱ میبیند.X-Forwarded-Proto: به اپلیکیشن میگوید کاربر با HTTPS وصل شده تا لینکها و ریدایرکتها را درست بسازد.UpgradeوConnection: برای WebSocket.
اپلیکیشن باید تنظیم شود که فقط از Reverse Proxy مورد اعتماد این هدرها را بپذیرد؛ در غیر این صورت مهاجم میتواند IP خود را جعل کند.
توزیع بار بین چند سرور
upstream app_backend {
least_conn;
server 10.0.0.11:3000 max_fails=3 fail_timeout=30s;
server 10.0.0.12:3000 max_fails=3 fail_timeout=30s;
}
server {
# ... بخش SSL مانند مثال قبل
location / {
proxy_pass http://app_backend;
}
}
Nginx درخواستها را به سروری با کمترین اتصال فعال میفرستد و سروری که پاسخ ندهد را موقتاً کنار میگذارد. سرورهای پشتی بهتر است از طریق شبکه خصوصی به Reverse Proxy وصل باشند. اگر اپلیکیشن نشست کاربر را در حافظه محلی نگه میدارد، نشستها را در Redis یا دیتابیس مشترک ذخیره کنید.
اشتباههای رایج
- باز ماندن پورت سرویس پشتی روی اینترنت: کل فایده Reverse Proxy از بین میرود. با Docker مراقب باشید؛ پورتهای منتشرشده از UFW عبور میکنند. توضیح در امنیت Docker.
- فراموش کردن X-Forwarded-Proto: باعث حلقه ریدایرکت یا لینکهای http در سایت HTTPS میشود.
- Timeout کوتاه: برای عملیات طولانی یا پاسخهای جریانی،
proxy_read_timeoutرا افزایش دهید و برای Streaming،proxy_buffering offرا تنظیم کنید. - محدودیت حجم آپلود: مقدار پیشفرض
client_max_body_sizeفقط ۱ مگابایت است و آپلودهای بزرگتر با خطای ۴۱۳ رد میشوند.
سوالات متداول
بهترین نرمافزار Reverse Proxy کدام است؟
Nginx برای بیشتر کاربردها؛ Caddy برای سادگی و SSL خودکار؛ Traefik برای محیطهای Docker؛ و HAProxy برای توزیع بار در مقیاس بالا.
آیا Reverse Proxy سرعت را کم میکند؟
سربار آن بسیار ناچیز است و با کش، فشردهسازی و HTTP/۲، معمولاً سرعت کلی را افزایش میدهد.
تفاوت Reverse Proxy و Load Balancer چیست؟
Load Balancer یکی از کاربردهای Reverse Proxy است. هر Load Balancer لایه ۷ یک Reverse Proxy است، اما Reverse Proxy لزوماً بار را بین چند سرور تقسیم نمیکند.
آیا CDN همان Reverse Proxy است؟
CDN یک Reverse Proxy توزیعشده در نقاط مختلف جهان است که روی کش و تحویل محتوا از نزدیکترین نقطه تمرکز دارد.
پیکربندی و مدیریت وبسرورها
سرویسهای خود را روی سرورهای مجازی تراست هاست پشت Reverse Proxy منتشر کنید؛ برای پیکربندی پیشرفته هم خدمات مدیریت سرور در دسترس است.