راهاندازی پروکسی معکوس یکی از بنیادیترین و قدرتمندترین تکنیکها در معماری وب مدرن است. این روش به شما امکان میدهد جزئیات داخلی سرورهای بکاند خود را پنهان کنید، ترافیک را مدیریت نمایید و امنیت را افزایش دهید. Nginx، که به دلیل عملکرد بالا و مصرف کم منابع شهرت دارد، راهحل اصلی برای پیادهسازی پروکسیهای معکوس در مقیاس بزرگ است. در این راهنما، ما مراحل پیکربندی Nginx به عنوان یک پروکسی معکوس را بررسی میکنیم، از جمله راهاندازی پایه، مسیریابی پیشرفته و هدرهای امنیتی ضروری.
درک مبانی
پروکسی معکوس بین کلاینت و سرور مبدأ قرار میگیرد. وقتی یک کلاینت درخواست دادهای از دامنه شما میکند، این درخواست از طریق پروکسی مسیریابی شده و سپس به سرویس بکاند مناسب ارجاع داده میشود. این انتزاع (Abstraction) امکان بارگیری متوازن (Load Balancing)، خاتمه SSL و کشینگ را بدون افشای زیرساخت داخلی شما فراهم میکند.
برای شروع، اطمینان حاصل کنید که Nginx روی سرور شما نصب شده است. برای سیستمهای Debian/Ubuntu، میتوانید آن را با استفاده از دستورات زیر نصب کنید:
sudo apt update
sudo apt install nginx
راهاندازی پایه پروکسی معکوس
هسته اصلی پیکربندی پروکسی معکوس در دستور `proxy_pass` نهفته است. فرض کنید برنامه بکاند شما روی `localhost:3000` در حال اجراست. ما میخواهیم آن را از طریق HTTP روی پورت 80 ارائه دهیم.
فایل پیکربندی پیشفرض Nginx را باز کنید:
sudo nano /etc/nginx/sites-available/default
بلوک سرور پیشفرض را با محتوای زیر جایگزین کنید:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://localhost: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-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache_bypass $http_upgrade;
}
}
این پیکربندی تمام ترافیک ارسالی به `example.com` را به برنامه محلی شما ارجاع میدهد. دستورات `proxy_set_header` اطمینان میدهند که بکاند شما اطلاعات دقیق کلاینت را دریافت کند، که برای لاگگیری و امنیت حیاتی است.
مدیریت WebSockets و اتصالات طولانیمدت
بسیاری از برنامههای مدرن برای تبادل دادههای بلادرنگ به WebSockets تکیه میکنند. Nginx به صورت بومی از این فناوری پشتیبانی میکند، اما برای ارتقای اتصال از HTTP به WebSocket به هدرهای خاصی نیاز دارد. خطوط `proxy_set_header Upgrade $http_upgrade;` و `proxy_set_header Connection 'upgrade';` در مثال قبلی این کار را به صورت خودکار انجام میدهند. اگر برنامه شما از اتصالات HTTP طولانیمدت استفاده میکند، ممکن است بخواهید مقادیر مهلت (Timeout) را نیز افزایش دهید:
proxy_read_timeout 60s;
proxy_send_timeout 60s;
بارگیری متوازن بین چندین بکاند
یکی از بزرگترین مزایای پروکسی معکوس، بارگیری متوازن است. Nginx میتواند ترافیک را بین چندین سرور Upstream توزیع کند. یک بلوک upstream را در بخش `http` پیکربندی Nginx خود (مثلاً در `/etc/nginx/nginx.conf`) تعریف کنید:
http {
upstream my_app {
server 192.168.1.10:3000;
server 192.168.1.11:3000;
server 192.168.1.12:3000;
}
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://my_app;
}
}
به طور پیشفرض، Nginx از الگوریتم Round-Robin استفاده میکند. شما میتوانید روشهای دیگری مانند `least_conn` یا `ip_hash` را در داخل بلوک `upstream` مشخص کنید تا با الگوهای ترافیک خاص خود سازگار باشد.
امنیت و HTTPS
همیشه پروکسی معکوس خود را از طریق HTTPS ارائه دهید. از Let’s Encrypt برای دریافت یک گواهی رایگان استفاده کنید و Nginx را طوری پیکربندی کنید که ترافیک HTTP را به HTTPS هدایت کند:
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost:3000;
# ... سایر تنظیمات پروکسی ...
}
}
علاوه بر این، هدرهای امنیتی را به پاسخهای خود اضافه کنید تا از آسیبپذیریهای رایج جلوگیری شود:
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
add_header X-XSS-Protection "1; mode=block";
تست و بارگذاری مجدد پیکربندی
قبل از اعمال تغییرات، همیشه پیکربندی خود را تست کنید تا از خطاهای دستوری که ممکن است سرویس شما را از کار بیندازند، جلوگیری شود:
sudo nginx -t
sudo systemctl reload nginx
نتیجهگیری
پیکربندی Nginx به عنوان یک پروکسی معکوس مهارتی حیاتی برای هر توسعهدهنده یا مدیر سیستم است. این کار یک لایه محکم برای مدیریت ترافیک، ایمنسازی برنامههای شما و مقیاسپذیرسازی زیرساخت ارائه میدهد. با دنبال کردن مراحل تشریح شده در بالا، میتوانید یک پروکسی معکوس قابل اعتماد و کارآمد راهاندازی کنید که ستون فقرات معماری وب شما را تشکیل دهد. به یاد داشته باشید که لاگهای خود را پایش کنید و تنظیمات مهلت و بافرینگ را بر اساس رفتار برنامه خاص خود تنظیم کنید تا عملکرد بهینهای داشته باشید.