راهنمای پروکسی معکوس nginx
در این صفحه
پروکسی معکوس جلوی برنامههای شما قرار میگیرد و درخواستهای بازدیدکنندگان را به آنها میرساند. با nginx در جلو، یک برنامهٔ Node.js، یک کانتینر Docker یا داشبوردی که روی یک پورت اجرا میشود به https://app.example.com تبدیل میشود، با HTTPS، هدرهای درست و یک جای واحد برای مدیریت همهچیز.
این راهنما گامبهگام nginx را بهعنوان پروکسی معکوس روی Ubuntu راهاندازی میکند: بلاک server، هدرها، WebSockets، HTTPS رایگان و خطاهایی که به احتمال زیاد با آنها روبهرو میشوید.
پروکسی معکوس چه کاری انجام میدهد
- یک نقطهٔ ورود عمومی. nginx روی پورتهای 80 و 443 گوش میدهد و هر دامنه یا مسیر را به برنامهٔ درست میفرستد، بنابراین خود برنامهها هرگز مستقیم در معرض اینترنت قرار نمیگیرند.
- HTTPS در یک جا. nginx گواهیها را مدیریت میکند؛ برنامههای پشت آن میتوانند روی localhost با HTTP ساده کار کنند.
- چند برنامه روی یک سرور.
app.example.com،api.example.comوexample.com/blogهر کدام میتوانند به سرویس متفاوتی بروند. - امکانات اضافه: فشردهسازی، کش، محدودیت آپلود و قوانین دسترسی، بدون دست زدن به برنامه.
گام 1: نصب nginx
sudo apt update sudo apt install nginx
http://your-server-ip را باز کنید؛ باید صفحهٔ خوشآمدگویی nginx را ببینید. اگر از ufw استفاده میکنید، ترافیک وب را با sudo ufw allow 'Nginx Full' مجاز کنید.
مطمئن شوید برنامهٔ شما در حال اجراست و روی خود سرور در دسترس است، مثلاً با curl http://127.0.0.1:3000. اگر این کار نکند، nginx هم کار نخواهد کرد.
nginx و برنامههایتان را با دسترسی کامل root اجرا کنید: پلنهای HytHost KVM VPS از €2.92 در ماه.
دیدن پلنهای VPSگام 2: ساخت بلاک server برای پروکسی
در Ubuntu هر سایت یک فایل در /etc/nginx/sites-available/ دارد که با یک لینک در sites-enabled فعال میشود. فایل /etc/nginx/sites-available/app.example.com را بسازید:
server {
listen 80;
server_name app.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;
}
}
آن را فعال کنید، پیکربندی را تست کنید و دوباره بارگذاری کنید:
sudo ln -s /etc/nginx/sites-available/app.example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx
رکورد A دامنه را به سرور خود اشاره دهید؛ حالا http://app.example.com برنامهٔ شما را نشان میدهد. همیشه پیش از بارگذاری دوباره nginx -t را اجرا کنید: اشتباههای تایپی را پیش از آنکه سایت را از کار بیندازند پیدا میکند.
هدرها و اسلش انتهایی
Hostدامنهای را که بازدیدکننده درخواست کرده منتقل میکند. بدون آن، nginx آدرس داخلproxy_passرا میفرستد و برنامههایی که لینکها را از host میسازند خراب میشوند.X-Real-IPوX-Forwarded-Forآدرس IP بازدیدکننده را منتقل میکنند. بدون آنها هر درخواست انگار از127.0.0.1آمده است.X-Forwarded-Protoبه برنامه میگوید آیا بازدیدکننده از HTTPS استفاده کرده یا نه، تا در حلقهٔ ریدایرکت نیفتد.
بستهٔ nginx در Ubuntu این خطوط را در /etc/nginx/proxy_params دارد، پس include proxy_params; یک میانبر است.
اسلش انتهایی مهم است. برای برنامهای زیر یک مسیر:
location /app/ {
proxy_pass http://127.0.0.1:3000/;
}
با اسلش بعد از پورت، /app/login بهصورت /login به برنامه میرسد. بدون آن، برنامه کل /app/login را دریافت میکند.
WebSockets
برنامههای چت، داشبوردهای زنده و بسیاری از پنلهای مدیریت از WebSockets استفاده میکنند که به دو هدر اضافه نیاز دارد. این map را یک بار داخل بلاک http اضافه کنید، مثلاً در فایل جدید /etc/nginx/conf.d/websocket.conf:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
سپس داخل location:
proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_read_timeout 1h;
nginx اتصال پروکسیشدهای را که 60 ثانیه چیزی نفرستد میبندد؛ مقدار بلندتر proxy_read_timeout اتصالهای WebSockets بیصدا را باز نگه میدارد. proxy_http_version 1.1 فقط از nginx 1.29.7 به بعد پیشفرض است و Ubuntu 24.04 نسخهٔ 1.24 را دارد، پس این خط را نگه دارید.
گام 3: HTTPS رایگان با Certbot
sudo snap install --classic certbot sudo ln -s /snap/bin/certbot /usr/local/bin/certbot sudo certbot --nginx -d app.example.com
Certbot یک گواهی رایگان Let's Encrypt میگیرد، تنظیمات HTTPS را به بلاک server شما اضافه میکند و میتواند HTTP را به HTTPS ریدایرکت کند. گواهی را خودکار تمدید میکند؛ با sudo certbot renew --dry-run بررسی کنید. دربارهٔ گواهیها در چگونه یک گواهی SSL رایگان بگیریم بیشتر بخوانید.
رفع خطاهای 502، 504 و 413
| خطا | علت معمول | راهحل |
|---|---|---|
| 502 Bad Gateway | nginx به برنامه دسترسی ندارد: برنامه متوقف شده، کرش کرده یا روی پورت یا آدرس دیگری گوش میدهد | برنامه را اجرا کنید، پورت را با curl http://127.0.0.1:PORT بررسی کنید، /var/log/nginx/error.log را بخوانید |
| 504 Gateway Timeout | پاسخ برنامه بیش از 60 ثانیه طول کشیده است | درخواست را سریعتر کنید یا proxy_read_timeout را برای آن location بالا ببرید |
| 413 Request Entity Too Large | فایل آپلودی از محدودیت پیشفرض nginx یعنی 1 MB بزرگتر است | client_max_body_size 50m; را در بلاک server تنظیم کنید |
| حلقهٔ ریدایرکت | برنامه نمیداند بازدیدکننده از HTTPS استفاده کرده است | X-Forwarded-Proto را منتقل کنید و به برنامه بگویید پشت پروکسی است |
بعد از هر تغییر: sudo nginx -t و سپس sudo systemctl reload nginx.
اجرا روی VPS در HytHost
پروکسی معکوس به سروری نیاز دارد که پورتهای 80 و 443 آن در اختیار شما باشد. پلنهای HytHost VPS روی KVM با دسترسی کامل root، فضای ذخیرهسازی SSD و محافظت DDoS اجرا میشوند؛ Ubuntu 24.04 را انتخاب کنید و گامهای بالا را دنبال کنید. برنامههایتان را در کانتینر اجرا میکنید؟ اول Docker را با چگونه Docker را روی Ubuntu نصب کنیم راهاندازی کنید و پورتهای کانتینرها را به 127.0.0.1 ببندید تا فقط nginx به آنها دسترسی داشته باشد.
پرسشهای متداول
پروکسی معکوس درخواستها را به یک یا چند برنامهٔ پشت خود میفرستد. Load balancer یک پروکسی معکوس است که درخواستها را بین چند نسخه از یک برنامه پخش میکند. nginx هر دو کار را با یک بلاک upstream که نسخهها را فهرست میکند انجام میدهد.
nginx به برنامهٔ پشت خود دسترسی ندارد. بررسی کنید برنامه در حال اجرا باشد و روی آدرس و پورت داخل proxy_pass گوش دهد، و برای علت دقیق /var/log/nginx/error.log را بخوانید.
نه، وقتی برنامه روی همان سرور اجرا میشود. nginx برای بازدیدکنندگان HTTPS را مدیریت میکند و با برنامه از طریق HTTP ساده روی 127.0.0.1 ارتباط دارد که هرگز از دستگاه خارج نمیشود.
به هر برنامه یک بلاک server جداگانه با server_name خودش بدهید، مثل app.example.com و api.example.com، و هر کدام با یک proxy_pass به پورتی متفاوت.
بله. پورت هر کانتینر را فقط روی 127.0.0.1 منتشر کنید و proxy_pass را به آن اشاره دهید. اینطور کانتینرها از اینترنت عمومی دور میمانند، و این مهم است چون پورتهای منتشرشدهٔ Docker از ufw عبور میکنند.
برنامههایتان را پشت nginx میزبانی کنید
پلنهای HytHost KVM VPS با دسترسی کامل root، فضای SSD و محافظت DDoS از €2.92 در ماه.
Live chat 8 AM – 11 PM (Chișinău time) · tickets answered during business hoursاین راهنما برایتان مفید بود؟