پروکسی معکوس ترافیک عمومی را روی پورتهای 80 و 443 میگیرد و به برنامههایی که فقط بهصورت محلی گوش میدهند میرساند. HTTPS، چند سایت روی یک IP و یک نقطهٔ واحد برای لاگها و محدودیتها را فراهم میکند. این راهنما آن را روی VPS Linux Infrawire برای برنامههای Node.js، Python یا Docker راه میاندازد.
📋 پیشنیازها
- یک Linux VPS (Ubuntu 24.04 / Debian 12 یا AlmaLinux 9 / Rocky 9) با دسترسی SSH بهعنوان root. آدرس IP و گذرواژهٔ root در بخش مشتری است.
- دامنهٔ
example.comبا رکوردهای A/AAAA که بهVPS_IPاشاره میکنند. - برنامهای که روی یک پورت محلی گوش میدهد، مثلاً
127.0.0.1:3000.
📦 نصب Nginx
Bash# Debian / Ubuntu sudo apt update && sudo apt install -y nginx # AlmaLinux / Rocky sudo dnf install -y nginx sudo systemctl enable --now nginx
در AlmaLinux/Rocky، SELinux بهطور پیشفرض اجازهٔ اتصال Nginx به بکاندها را نمیدهد. یک بار اجازه بدهید:
Bashsudo setsebool -P httpd_can_network_connect 1
🚀 اولین برنامه پشت پروکسی
برنامهٔ شما باید روی 127.0.0.1 گوش دهد نه 0.0.0.0، تا فقط از طریق Nginx در دسترس باشد. زبان هر چه باشد الگو یکی است: node server.js روی پورت 3000، gunicorn -b 127.0.0.1:8000 app:app برای Python، یا کانتینری که با docker run -d -p 127.0.0.1:3000:80 IMAGE منتشر شده است.
فایل /etc/nginx/sites-available/example.com را بسازید (در AlmaLinux/Rocky از /etc/nginx/conf.d/example.com.conf استفاده کنید):
Nginx1server { 2 listen 80; 3 listen [::]:80; 4 server_name example.com; 5 6 location / { 7 proxy_pass http://127.0.0.1:3000; 8 proxy_http_version 1.1; 9 proxy_set_header Host $host; 10 proxy_set_header X-Real-IP $remote_addr; 11 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 12 proxy_set_header X-Forwarded-Proto $scheme; 13 } 14}
در Debian/Ubuntu آن را فعال کنید، سپس بررسی و بارگذاری مجدد کنید:
Bashsudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx
سرآیندهای X-Forwarded-* به برنامه میگویند IP واقعی کاربر چیست و آیا بازدیدکننده از HTTPS استفاده کرده است. بدون آنها برنامه فقط 127.0.0.1 را میبیند و ممکن است پیوندهای http:// بسازد. بسیاری از فریمورکها هم باید صریحاً به پروکسی اعتماد کنند (مثلاً app.set('trust proxy', 1) در Express).
🔌 پشتیبانی از WebSocket
WebSocket به سرآیندهای ارتقای HTTP نیاز دارد. در ابتدای زمینهٔ http یک map اضافه کنید (مثلاً در /etc/nginx/conf.d/websocket.conf):
Nginxmap $http_upgrade $connection_upgrade { default upgrade; '' close; }
سپس در بلاک location:
Nginxproxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;
⏱️ مهلتها و اندازهٔ بدنهٔ درخواست
مقدارهای پیشفرض 60 ثانیه و 1 مگابایت است. آنها را برای نقاط پایانی کند یا آپلود فایل تنظیم کنید:
Nginxproxy_connect_timeout 5s; proxy_read_timeout 120s; proxy_send_timeout 120s; client_max_body_size 50m;
برای WebSocket طولانیمدت، proxy_read_timeout را افزایش دهید (مثلاً 3600s) یا از برنامه بخواهید ping بفرستد.
🔒 HTTPS با Certbot
ابتدا پورتهای 80 و 443 را در فایروال باز کنید، سپس:
Bash# Debian / Ubuntu sudo apt install -y certbot python3-certbot-nginx sudo certbot --nginx -d example.com
در AlmaLinux/Rocky ابتدا sudo dnf install -y epel-release و بعد sudo dnf install -y certbot python3-certbot-nginx را اجرا کنید. Certbot گواهی را به بلاک server شما اضافه میکند، ریدایرکت HTTP به HTTPS را پیشنهاد میدهد و تمدید خودکار را نصب میکند. با این دستور بررسی کنید:
Bashsudo certbot renew --dry-run
🗂️ چند برنامه روی یک VPS
برای هر دامنه یک بلاک server بسازید، هر کدام با server_name و پورت محلی خودش:
Nginx1server { 2 listen 80; 3 server_name app1.example.com; 4 location / { proxy_pass http://127.0.0.1:3000; } 5} 6 7server { 8 listen 80; 9 server_name app2.example.com; 10 location / { proxy_pass http://127.0.0.1:8000; } 11}
سرآیندهای پروکسی را در هر بلاک تکرار کنید، سپس Certbot را با -d app1.example.com -d app2.example.com اجرا کنید. میتوانید بر اساس مسیر هم جدا کنید (location /api/ { proxy_pass http://127.0.0.1:8000/; })؛ در این حالت اسلش پایانی پیشوند را حذف میکند.
✅ آزمایش
Bashcurl -I https://example.com ss -ltnp | grep -E ':(80|443|3000)' sudo tail -f /var/log/nginx/error.log
پورت بکاند باید فقط به 127.0.0.1 متصل باشد، در حالی که Nginx روی 80 و 443 گوش میدهد.
🛠️ عیبیابی
502 Bad Gateway. برنامه متوقف است یا روی پورت دیگری اجرا میشود. با ss -ltnp بررسی کنید و آن را اجرا کنید. در AlmaLinux/Rocky، پیام Permission denied در لاگ خطا یعنی مقدار بولی SELinux بالا تنظیم نشده است.
504 Gateway Timeout. بکاند بیش از proxy_read_timeout طول میکشد. مقدار را افزایش دهید یا نقطهٔ پایانی را بهینه کنید.
WebSocket قطع میشود یا با 400/426 شکست میخورد. سرآیندهای Upgrade و Connection وجود ندارند یا proxy_http_version 1.1; نیست.
IP کاربر در لاگها اشتباه است. X-Forwarded-For ارسال میشود اما برنامه به پروکسی اعتماد نمیکند. تنظیم اعتماد را در فریمورک خود فعال کنید.
🎉 برنامههای شما اکنون پشت Nginx با HTTPS، سرآیندهای درست و جا برای هر تعداد سایتی که VPS شما تحمل کند سرو میشوند.