Nginx লোকেশন ম্যাচিং নিয়ম বাস্তব উদাহরণসহ ব্যাখ্যা
আপনি সম্ভবত একটি Nginx কনফিগ টুইক করেছেন, রিলোড করেছেন, এবং ভেবেছেন কেন আপনার location ব্লকটি প্রয়োগ হচ্ছে না। হয়তো একটি স্ট্যাটিক ফাইল রিকোয়েস্ট আপনার PHP হ্যান্ডলারে পৌঁছাচ্ছে, অথবা একটি API রুট একটি ক্যাচ-অল দ্বারা গিলে ফেলা হচ্ছে। অপরাধী প্রায়শই Nginx-এর লোকেশন ম্যাচিং অ্যালগরিদম—এটি দেখতে যতটা সহজ মনে হয় ততটা নয়।
এই গাইডে, আমরা ভেঙে দেব কীভাবে Nginx একটি লোকেশন ব্লক নির্বাচন করে, বাস্তব উদাহরণ সহ যা আপনি পরীক্ষা করতে পারেন। শেষে, আপনি জানবেন কোন ব্লক জিতবে এবং কেন।
Nginx লোকেশন ম্যাচিং কীভাবে কাজ করে
যখন একটি অনুরোধ আসে, Nginx URI-কে সমস্ত সংজ্ঞায়িত location ব্লকের সাথে তুলনা করে। ম্যাচিং প্রক্রিয়া একটি নির্দিষ্ট ক্রম অনুসরণ করে:
- সঠিক ম্যাচ (
=) — সর্বোচ্চ অগ্রাধিকার। যদি পাওয়া যায়, Nginx থামে এবং এটি ব্যবহার করে। - দীর্ঘতম প্রিফিক্স ম্যাচ — Nginx দীর্ঘতম ম্যাচিং প্রিফিক্স লোকেশন মনে রাখে।
- রেগুলার এক্সপ্রেশন ম্যাচ (
~বা~*) — উপস্থিতির ক্রম অনুসারে চেক করা হয়। প্রথম রেজেক্স যা ম্যাচ করে জিতে যায়, প্রিফিক্স ম্যাচকে ওভাররাইড করে (যদি^~ব্যবহার না করা হয়)। ^~সহ প্রিফিক্স ম্যাচ — যদি দীর্ঘতম ম্যাচিং প্রিফিক্সে^~থাকে, Nginx রেজেক্স চেকিং এড়িয়ে যায় এবং এটি ব্যবহার করে।- যদি কোনও রেজেক্স ম্যাচ না করে, দীর্ঘতম প্রিফিক্স ম্যাচ ব্যবহার করা হয়।
এটাই মূল অ্যালগরিদম। চলুন এটি কার্যকর দেখি।
লোকেশন মডিফায়ার: একটি দ্রুত রেফারেন্স
| মডিফায়ার | সিনট্যাক্স | ম্যাচের ধরন | অগ্রাধিকার |
|---|---|---|---|
= | location = /path | সঠিক | সর্বোচ্চ |
^~ | location ^~ /path | প্রিফিক্স (রেজেক্স নেই) | উচ্চ |
~ | location ~ \.php$ | রেজেক্স (কেস-সেনসিটিভ) | মাঝারি |
~* | location ~* \.(jpg|png)$ | রেজেক্স (কেস-ইনসেনসিটিভ) | মাঝারি |
| কোনোটিই না | location /path | প্রিফিক্স | সর্বনিম্ন |
বাস্তব উদাহরণ ১: স্ট্যাটিক ফাইল বনাম PHP
এই সাধারণ সেটআপটি বিবেচনা করুন:
server {
listen 80;
server_name example.com;
location / {
root /var/www/html;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
}
/index.php এর জন্য একটি অনুরোধ রেজেক্স \.php$ এর সাথে ম্যাচ করে, তাই এটি PHP-FPM-এ যায়। /logo.png এর জন্য একটি অনুরোধ রেজেক্সের সাথে ম্যাচ করে না, তাই এটি প্রিফিক্স /-এ ফিরে যায় এবং স্ট্যাটিক ফাইল পরিবেশন করে। সহজ, তাই না?
কিন্তু যদি আপনি /uploads/photo.php কে একটি স্ট্যাটিক ফাইল হিসাবে পরিবেশন করতে চান (সম্ভবত এটি আসলে একটি ছবি)? আপনি একটি সঠিক ম্যাচ যোগ করতে পারেন:
location = /uploads/photo.php {
root /var/www/html;
}
এখন সেই সঠিক ম্যাচটি রেজেক্সের উপর প্রাধান্য পায়।
বাস্তব উদাহরণ ২: প্রিফিক্স এবং রেজেক্স সহ API রাউটিং
ধরুন আপনার /api/ এর অধীনে একটি API আছে এবং আপনি সমস্ত অনুরোধ একটি ব্যাকএন্ডে প্রক্সি করতে চান, একটি স্বাস্থ্য পরীক্ষা ছাড়া যা একটি স্ট্যাটিক প্রতিক্রিয়া ফেরত দেয়।
location = /api/health {
return 200 "OK";
}
location /api/ {
proxy_pass http://backend;
}
location ~ ^/api/v[0-9]+/special {
proxy_pass http://special-backend;
}
চলুন /api/health ট্রেস করি: সঠিক ম্যাচ জিতে যায়, 200 ফেরত দেয়। /api/users এর জন্য: কোনও সঠিক নেই, কোনও রেজেক্স নেই (special এর সাথে ম্যাচ করে না), তাই দীর্ঘতম প্রিফিক্স /api/ ব্যবহার করা হয়। /api/v1/special এর জন্য: রেজেক্স ম্যাচ করে, তাই এটি প্রিফিক্সকে ওভাররাইড করে এবং special-backend-এ যায়।
এটি প্রদর্শন করে কীভাবে রেজেক্স একটি প্রিফিক্স ম্যাচকে ওভাররাইড করতে পারে। যদি আপনি চান প্রিফিক্স সর্বদা জিতুক, আপনি ^~ ব্যবহার করবেন।
বাস্তব উদাহরণ ৩: ^~ এর শক্তি
কল্পনা করুন আপনার একটি ডিরেক্টরি /static/ আছে যেখানে ফাইলগুলি কখনই PHP দ্বারা প্রক্রিয়া করা উচিত নয়, এমনকি যদি তারা .php দিয়ে শেষ হয়। ^~ ব্যবহার নিশ্চিত করে যে Nginx রেজেক্স লোকেশন চেক করে না।
location ^~ /static/ {
root /var/www/html;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
}
/static/script.php এর জন্য একটি অনুরোধ প্রিফিক্স ^~ /static/ এর সাথে ম্যাচ করে। ^~ এর কারণে, Nginx রেজেক্স চেকিং এড়িয়ে যায় এবং সরাসরি ফাইলটি পরিবেশন করে। ^~ ছাড়া, রেজেক্স ম্যাচ করত এবং PHP-FPM এটি চালাত—একটি সম্ভাব্য নিরাপত্তা ঝুঁকি।
সাধারণ pitfalls এবং কীভাবে সেগুলি এড়ানো যায়
- রেজেক্স ক্রম গুরুত্বপূর্ণ: Nginx কনফিগে যেভাবে উপস্থিত হয় সেই ক্রমে রেজেক্স লোকেশন চেক করে। আরও নির্দিষ্ট প্যাটার্ন প্রথমে রাখুন।
- ট্রেইলিং স্ল্যাশ অনুপস্থিত:
location /apiএবংlocation /api/ভিন্ন। পূর্বেরটি/apiএবং/apixম্যাচ করে, যেখানে পরেরটি/api/এবং/api/usersম্যাচ করে। সুনির্দিষ্ট হন। - ওভারল্যাপিং প্রিফিক্স: দীর্ঘতম প্রিফিক্স জিতে যায়, তাই
/api/v1/usersএর জন্যlocation /api/v1location /apiএর উপর প্রাধান্য পায়। - স্ট্যাটিক অ্যাসেটের জন্য
^~ভুলে যাওয়া: স্ট্যাটিক ফাইল অনুরোধগুলি থেকে রেজেক্স হাইজ্যাকিং প্রতিরোধ করতে এটি ব্যবহার করুন। - কেস সংবেদনশীলতা:
~কেস-সেনসিটিভ,~*নয়। ফাইল এক্সটেনশনের জন্য~*ব্যবহার করুন।
লোকেশন ম্যাচিং ডিবাগিং
যদি আপনি নিশ্চিত না হন কোন লোকেশন ব্যবহার করা হচ্ছে, Nginx-এ ডিবাগ লগিং সক্রিয় করুন। আপনার সার্ভার ব্লকে error_log /var/log/nginx/error.log debug; যোগ করুন, রিলোড করুন এবং লগ পরীক্ষা করুন। আপনি test location: "/api/users" এবং using configuration "/api/" এর মতো লাইন দেখতে পাবেন।
বিকল্পভাবে, প্রতিটি লোকেশনে সাময়িকভাবে return 200 "matched: /api/"; ব্যবহার করুন কোনটি প্রতিক্রিয়া জানায় তা দেখতে।
সাধারণ প্রশ্ন
Nginx লোকেশন মডিফায়ারগুলির অগ্রাধিকার ক্রম কী?
সঠিক ম্যাচ (=) সর্বোচ্চ, তারপর ^~ সহ দীর্ঘতম প্রিফিক্স, তারপর রেজেক্স (~ বা ~*) ক্রমে, তারপর ^~ ছাড়া দীর্ঘতম প্রিফিক্স ম্যাচ।
একটি রেজেক্স লোকেশন একটি প্রিফিক্স লোকেশনকে ওভাররাইড করতে পারে?
হ্যাঁ, যদি না প্রিফিক্স লোকেশন ^~ ব্যবহার করে। রেজেক্স লোকেশনগুলি দীর্ঘতম প্রিফিক্স ম্যাচের পরে চেক করা হয়, এবং যদি একটি রেজেক্স ম্যাচ করে, এটি একটি নিয়মিত প্রিফিক্সের উপর প্রাধান্য পায়।
আমি কীভাবে শুধুমাত্র একটি নির্দিষ্ট ফাইলের জন্য একটি লোকেশন ম্যাচ করব?
= সহ একটি সঠিক ম্যাচ ব্যবহার করুন, যেমন location = /favicon.ico। এটি নিশ্চিত করে যে শুধুমাত্র সেই সঠিক URI ম্যাচ করা হয়।
আপনার Nginx কনফিগারেশন আয়ত্ত করুন
একটি নির্ভরযোগ্য Nginx সেটআপের জন্য লোকেশন ম্যাচিং বোঝা মূল চাবিকাঠি। nginx -t দিয়ে আপনার কনফিগ পরীক্ষা করুন এবং সন্দেহ হলে ডিবাগ লগ ব্যবহার করুন। যদি আপনি Nginx লগ নিয়ে কাজ করছেন এবং ট্রাফিক প্যাটার্ন বিশ্লেষণ করতে চান, আমাদের Nginx Log Analyzer ব্যবহার করে দেখুন যা দ্রুত আপনার লগ পার্স এবং ভিজ্যুয়ালাইজ করবে।