Nginx reverse proxy ও বিনামূল্যের HTTPS (Let's Encrypt)

Nginx আপনার অ্যাপের সামনে বসে HTTPS সামলায় ও request এগিয়ে দেয়। মানিয়ে নেওয়ার মতো ছোট, নিরাপদ কনফিগারেশন দেখুন।

ব্যবহারকারী ও অ্যাপের মাঝে তালাসহ একটি proxy server

Reverse proxy ইন্টারনেট থেকে request নিয়ে আপনার অ্যাপে এগিয়ে দেয়। Nginx প্রচলিত পছন্দ। আপনার Node, Python বা অন্য অ্যাপের সামনে এটি বসালে পাবেন:

  • এক জায়গায় সামলানো HTTPS।
  • Static ফাইল সার্ভ ও caching।
  • অ্যাপের সুরক্ষা: compression, আকারের সীমা, rate limiting এবং অ্যাপ ব্যক্তিগতভাবে শোনার সময় স্থির public port (80 ও 443)।
  • এক server-এ অনেক সাইট চালানোর ক্ষমতা।

ধাপ ১: অ্যাপ স্থানীয় port-এ চালান

অ্যাপ শুধু 127.0.0.1-এ শুনুক (যেমন port 3000), যাতে বাইরে থেকে সরাসরি পৌঁছানো না যায়।

ধাপ ২: ন্যূনতম server block

/etc/nginx/sites-available/example বানিয়ে sites-enabled-এ link করুন।

server {
    listen 80;
    server_name example.com www.example.com;

    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;
    }
}

proxy_set_header লাইনগুলো আসল host, visitor-এর IP ও protocol অ্যাপে পাঠায়। এগুলো ছাড়া অ্যাপ প্রতিটি request 127.0.0.1 থেকে আসছে দেখে।

পরীক্ষা ও reload:

sudo nginx -t
sudo systemctl reload nginx

nginx -t প্রয়োগের আগে syntax যাচাই করে। সবসময় চালান।

ধাপ ৩: Certbot দিয়ে বিনামূল্যের HTTPS

আগে আপনার domain-এর DNS server-এ নির্দেশ করুন। তারপর:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot বিনামূল্যের Let's Encrypt certificate আনে, server block 443-এ TLS সহ শোনার জন্য বদলায় এবং HTTP থেকে HTTPS redirect যোগ করতে পারে। Certificate প্রায় ৯০ দিন চলে, আর Certbot স্বয়ংক্রিয়ভাবে নবায়নের timer বসায়। যাচাই করুন:

sudo certbot renew --dry-run

ধাপ ৪: যুক্তিসঙ্গত hardening

server_tokens off;                        # Nginx-এর সংস্করণ লুকানো
client_max_body_size 10m;                 # upload-এর আকার সীমা
add_header X-Content-Type-Options nosniff always;
add_header Strict-Transport-Security "max-age=31536000" always;   # সর্বত্র HTTPS ঠিক হওয়ার পর

আরও কাজের: gzip compression, fingerprint করা static ফাইলে লম্বা cache সময়, এবং ব্যয়বহুল endpoint-এ rate limit করতে limit_req।

সামনে CDN থাকলে (যেমন Cloudflare)

তখন আপনার server visitor-এর নয়, CDN-এর IP দেখে। CDN-এর প্রকাশিত IP পরিসর থেকেই শুধু তার CF-Connecting-IP header বিশ্বাস করতে real-IP module ব্যবহার করুন, আর origin firewall এমনভাবে বাঁধুন যাতে শুধু CDN 80 ও 443 port-এ পৌঁছায়।

সাধারণ সমস্যা

  • 502 Bad Gateway: অ্যাপ চলছে না বা অন্য port-এ শুনছে। systemctl status ও port দেখুন।
  • Redirect loop: অ্যাপ ও Nginx দুটোই HTTPS-এ redirect করছে। X-Forwarded-Proto পাঠান এবং অ্যাপকে তা বিশ্বাস করতে দিন।
  • WebSocket কাজ করছে না: proxy_set_header Upgrade $http_upgrade; ও proxy_set_header Connection "upgrade"; যোগ করুন।
  • Certificate নবায়ন ব্যর্থ: port 80 বন্ধ বা DNS বদলেছে।

মূল কথা: অ্যাপ localhost-এ রাখুন, বিনামূল্যের স্বয়ংক্রিয় নবায়নযোগ্য certificate দিয়ে Nginx-কে HTTPS সামলাতে দিন, proxy header পাঠান, reload-এর আগে সবসময় nginx -t চালান, এবং কয়েকটি hardening header যোগ করুন।


Linux ও DevOps সিরিজ, পর্ব ১ (server ও container): 3 নম্বর (মোট 5)। আগের লেখা: systemd: অ্যাপ service হিসেবে চালান, timer-এ schedule করুন.

আরও পড়ুন

Recursion ও backtracking সহজ উদাহরণে

Recursion সমস্যার ছোট কপি সমাধান করে সমাধান করে। অনেক interview সমস্যায় ব্যবহৃত চিন্তার ধাপ ও backtracking টেমপ্লেট শিখুন।

Interview ও DSA•৩ মিনিটে পড়া