রিভার্স প্রক্সি: এক অ্যাড্রেসে একাধিক অ্যাপ্লিকেশন
কীভাবে ডোমেইন ও পাথ অনুযায়ী একাধিক অ্যাপ্লিকেশনের মধ্যে একটি পাবলিক VDS অ্যাড্রেস ভাগ করবেন, হেডার সঠিকভাবে পাঠাবেন, এবং WebSocket ভাঙবেন না।
আপডেট: ২৩ আগস্ট, ২০২৬
একটি মেশিনে একটি পাবলিক IPv4 ঠিকানা থাকে, কিন্তু সাধারণত সেখানে একাধিক অ্যাপ্লিকেশন চলে। একটি রিভার্স প্রক্সি পোর্ট 80 এবং 443-এ আসা সব অনুরোধ গ্রহণ করে এবং ডোমেইন নাম বা পাথ অনুযায়ী সেগুলোকে অভ্যন্তরীণ সার্ভিসে রাউট করে। এটি একক সার্টিফিকেট এবং শেয়ার করা লগও ধরে রাখে।
লেআউট
প্রতিটি অ্যাপ্লিকেশন নিজের আলাদা লোকাল পোর্টে এবং শুধুমাত্র 127.0.0.1-এ লিসেন করে:
- ফ্রন্টএন্ড সাইট —
127.0.0.1:3000; - API —
127.0.0.1:8000; - মনিটরিং ড্যাশবোর্ড —
127.0.0.1:9090।
শুধুমাত্র Nginx বাইরের দিকে উন্মুক্ত। কোনো অ্যাপ্লিকেশন সরাসরি উন্মুক্ত কি না তা যাচাই করতে:
ss -tulpn | grep LISTEN
0.0.0.0:3000-এর মতো লাইন মানে সার্ভিসটি প্রক্সি বাইপাস করে এবং এনক্রিপশন ছাড়াই ইন্টারনেট থেকে অ্যাক্সেসযোগ্য।
ডোমেইন অনুযায়ী
server {
listen 80;
server_name app.example.ru;
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;
}
}
server {
listen 80;
server_name api.example.ru;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
X-Forwarded-For ছাড়া অ্যাপ্লিকেশন প্রতিটি অনুরোধ 127.0.0.1 থেকে আসছে বলে দেখে, এবং IP-ভিত্তিক যেকোনো নিষেধাজ্ঞা কাজ করা বন্ধ করে দেয়।
পাথ অনুযায়ী
location /api/ {
proxy_pass http://127.0.0.1:8000/;
}
এখানে proxy_pass-এর শেষের স্ল্যাশ গুরুত্বপূর্ণ: এটি থাকলে /api প্রিফিক্স বাদ পড়ে যায় এবং অ্যাপ্লিকেশন /users পায়; এটি না থাকলে অ্যাপ্লিকেশন /api/users পায়। প্রক্সিতে ঘটা অর্ধেক “রহস্যময় 404”-এর কারণ ঠিক এটিই।
WebSocket এবং দীর্ঘ রেসপন্স
location /ws/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}
Upgrade/Connection জোড়া ছাড়া হ্যান্ডশেকের ঠিক পরেই কানেকশন কেটে যায়; বাড়ানো টাইমআউট ছাড়া এক মিনিট নীরবতার পরেই তা কেটে যায়।
সাধারণ ভুল
| লক্ষণ | কারণ |
|---|---|
502 Bad Gateway | অ্যাপ্লিকেশনটি চলছে না বা ভিন্ন পোর্টে লিসেন করছে |
504 Gateway Time-out | অ্যাপ্লিকেশন proxy_read_timeout-এর চেয়ে বেশি সময় নিয়ে রেসপন্স দিচ্ছে |
| অসীম রিডাইরেক্ট | অ্যাপ্লিকেশন HTTPS সম্পর্কে জানে না — X-Forwarded-Proto পাঠান |
| ফাইল আপলোড ভেঙে যায় | client_max_body_size খুব ছোট; ডিফল্ট 1 MB |
| অ্যাপ্লিকেশন লগে একই IP | X-Forwarded-For পাঠানো হচ্ছে না |
পরবর্তী: একাধিক সাইট, সার্টিফিকেট, স্বয়ংক্রিয় HTTPS সহ Caddy।
প্রক্সিতে থাকা একটি সার্টিফিকেট এর পেছনের সব অ্যাপ্লিকেশন কভার করে।
127.0.0.1-এর উপর দিয়ে যাওয়া অভ্যন্তরীণ কানেকশনের এনক্রিপশন দরকার নেই — সেগুলো কখনোই মেশিন ছেড়ে বেরোয় না।