فارسی (Farsi)
€EUR

راه‌اندازی پروکسی معکوس Nginx روی Linux VPS

3 min
سرور مجازی (VPS/VDS)

پروکسی معکوس ترافیک عمومی را روی پورت‌های 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 به بک‌اندها را نمی‌دهد. یک بار اجازه بدهید:

Bash
sudo 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 استفاده کنید):

Nginx
1server { 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 آن را فعال کنید، سپس بررسی و بارگذاری مجدد کنید:

Bash
sudo 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):

Nginx
map $http_upgrade $connection_upgrade { default upgrade; '' close; }

سپس در بلاک location:

Nginx
proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade;

⏱️ مهلت‌ها و اندازهٔ بدنهٔ درخواست

مقدارهای پیش‌فرض 60 ثانیه و 1 مگابایت است. آن‌ها را برای نقاط پایانی کند یا آپلود فایل تنظیم کنید:

Nginx
proxy_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 را پیشنهاد می‌دهد و تمدید خودکار را نصب می‌کند. با این دستور بررسی کنید:

Bash
sudo certbot renew --dry-run

🗂️ چند برنامه روی یک VPS

برای هر دامنه یک بلاک server بسازید، هر کدام با server_name و پورت محلی خودش:

Nginx
1server { 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/; })؛ در این حالت اسلش پایانی پیشوند را حذف می‌کند.

✅ آزمایش

Bash
curl -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 شما تحمل کند سرو می‌شوند.

با آخرین پیشنهادها، تخفیف‌ها و تبلیغات ویژه به‌روز بمانید.

مشاهده تخفیف‌ها

ما از کوکی استفاده می‌کنیم

ما از کوکی‌های تحلیلی برای بهبود تجربه شما در سایت خود استفاده می‌کنیم. هیچ داده‌ای به اشخاص ثالث فروخته نمی‌شود. اطلاعات بیشتر در سیاست حفظ حریم خصوصی ما.