nginx location Match Tester: เครื่องมือหาว่า location block ไหนชนะสำหรับ request URI ของคุณ
nginx location Match Tester วิเคราะห์ว่า location block ไหนของ nginx จะชนะสำหรับ request URI ที่กำหนด พร้อม decision trace ทีละขั้นตอนตามลำดับการจับคู่ที่ระบุไว้ในเอกสารของ nginx
Table of Contents
ผู้ดูแล nginx ทุกคนเคยเจอปัญหาเดียวกัน นั่นคือ request URI ที่ตั้งใจให้ไปยัง proxy กลับไปโดน block ของไฟล์ static แทน ทั้งที่มองจาก config แล้วไม่น่าจะผิดตรงไหนเลย ลำดับการจับคู่ (match order) ของ location block ใน nginx ถูกออกแบบมาอย่างมีเหตุผล แต่ก็อ่านผิดได้ง่ายมากเมื่อเริ่มผสมกันระหว่าง prefix กับ regex nginx location Match Tester ช่วยตัดปัญหานี้ได้ภายในไม่กี่วินาที เพียงวาง location block ของคุณ ป้อน URI แล้วดูว่า block ไหนชนะและเพราะอะไร
เครื่องมือนี้เป็น static analyzer ที่ทำงานตามลำดับการจับคู่ที่ระบุไว้ในเอกสารของ nginx ได้แก่ exact (=), prefix แบบ ^~, regex ตามลำดับในไฟล์ และ prefix ที่ยาวที่สุด โดยจะแสดง decision trace ทีละขั้นตอนแทนคำตอบสั้น ๆ อีกทั้งยังเตือนคุณอย่างตรงไปตรงมาว่าอะไรที่เครื่องมือไม่ได้จำลอง เช่น include directive ทั้งหมดนี้ทำงานในเบราว์เซอร์ของคุณล้วน ๆ
ทำไมต้องใช้ nginx location Match Tester?
- เลิกเดาปัญหา routing — ไม่ต้องไล่ใส่ debug header แล้ว reload เซิร์ฟเวอร์ซ้ำ ๆ แค่รันการวิเคราะห์ทันทีสำหรับ URI ที่สนใจ
- เห็นเหตุผล ไม่ใช่แค่คำตอบ — decision trace แสดงการตรวจ exact match, การจำ prefix ที่ยาวที่สุด, การที่ ^~ ข้ามการตรวจ regex และ regex ทุกตัวที่ถูกลองตามลำดับในไฟล์
- จับความผิดพลาดของ regex ตั้งแต่เนิ่น ๆ — regex ที่เจาะจงถูกวางไว้หลัง catch-all จะไม่มีวันทำงาน trace ทำให้เห็นปัญหาลำดับแบบนี้ก่อน deploy จริง
- เป็นส่วนตัวตั้งแต่การออกแบบ — การวิเคราะห์ทั้งหมดรันในเบราว์เซอร์ config ภายในองค์กรของคุณจึงไม่หลุดออกจากเครื่อง
- ตรงไปตรงมาเรื่องข้อจำกัด — เครื่องมือบอกชัดว่าอะไรไม่ได้จำลอง เช่น include, nested location และ if block เพื่อไม่ให้คุณเข้าใจผิดว่าเป็นการจำลอง nginx เต็มรูปแบบ
- ฟรีและได้ผลทันที — ไม่ต้องสมัครสมาชิก ไม่ต้องติดตั้งอะไร ไม่มีการติดต่อเซิร์ฟเวอร์
ฟีเจอร์หลัก
| ฟีเจอร์ | ทำอะไร |
|---|---|
| วาง location block | คัดลอก block จาก server block ของคุณมาวางตามลำดับเดิมในไฟล์ |
| ช่องป้อน request URI | ทดสอบ URI อะไรก็ได้ เช่น /api/users หรือ /assets/app.css |
| เอนจินตามลำดับการจับคู่ในเอกสาร | ใช้ลำดับ exact =, prefix ^~, regex ตามลำดับในไฟล์ แล้ว fallback เป็น prefix ที่ยาวที่สุด |
| Decision trace ทีละขั้นตอน | อธิบายผู้ชนะทีละการตัดสินใจ |
| คำเตือนเรื่องข้อจำกัด | แจ้งส่วนที่ไม่ได้จำลอง เช่น include และ nested if |
| ทำงานฝั่งเบราว์เซอร์ล้วน | ไม่มีการอัปโหลดใด ๆ ประมวลผลทุกอย่างในเครื่องคุณ |
จุดที่ควรสังเกตเพิ่มเติมมีดังนี้
- trace ระบุทุก candidate ในแต่ละขั้น ทั้ง prefix ที่แพ้ให้ตัวที่ยาวกว่า และ regex ที่ไม่ได้ถูกลองเพราะตัวก่อนหน้า match ไปแล้ว
- คำเตือนมีรายละเอียด เครื่องมือจะบอกเมื่อ config ที่ใช้ include หรือตัวแปรอาจทำงานต่างจากนี้บนเซิร์ฟเวอร์จริง
- เพราะ analyzer ยึดลำดับตามเอกสาร ไม่ใช่การเดา ทุกคำตอบจึงอธิบายได้ทีละบรรทัดเสมอ
วิธีใช้ nginx location Match Tester
- วาง location block ของคุณ คัดลอก location block จาก server block ใน nginx มาวางในตัวแก้ไข และรักษาลำดับเดิมตามไฟล์ config เพราะลำดับเป็นตัวตัดสินผลของ regex
- ป้อน request URI พิมพ์ path ที่ต้องการตรวจ เช่น /api/v2/orders หรือ /static/logo.png โดยไม่ต้องใส่ scheme หรือ host
- รันการวิเคราะห์ เครื่องมือจะใช้ลำดับการจับคู่ตามเอกสารกับ block ของคุณทันที และไฮไลต์ location ที่ชนะ
- อ่าน decision trace ไล่ดูทีละขั้น ตั้งแต่การลอง exact match, การจำ prefix ที่ยาวที่สุด, การตรวจ ^~ จนถึงรอบผ่าน regex ตามลำดับไฟล์ ทุกขั้นจะบอกว่า block ไหนถูกเลือกหรือถูกข้ามและเพราะอะไร
- ปรับ config แล้วลองใหม่ ถ้า block ที่ผิดเป็นตัวชนะ ให้เพิ่ม exact match แบบ = ย้าย regex ขึ้นก่อน หรือใส่ ^~ ให้ prefix แล้วรันซ้ำจนกว่า trace จะแสดง routing ตามที่คุณตั้งใจ
ทำความเข้าใจลำดับการจับคู่ location ของ nginx
อัลกอริทึมการเลือก location ของ nginx ตามเอกสาร ทำงานเป็น 4 ระยะ
ระยะแรกคือ exact match ถ้า request URI เท่ากับ location ที่ประกาศด้วย = พอดี nginx จะเลือก block นั้นทันทีและหยุดตรงนั้น ไม่พิจารณาสิ่งอื่นอีก นี่คือเหตุผลที่ = /health เป็นวิธีที่เชื่อถือได้ที่สุดในการล็อกเส้นทางคงที่
ระยะที่สองคือการจำ prefix ที่ยาวที่สุด nginx จะสแกน location แบบ prefix ทั้งหมดและจำตัวที่ยาวที่สุดที่ match กับ URI แต่ยังไม่ตัดสินใจขั้นสุดท้ายในขั้นนี้
ระยะที่สามคือการ override ด้วย ^~ ถ้า prefix ที่ยาวที่สุดที่จำไว้มีเครื่องหมาย ^~ nginx จะข้ามการตรวจ regex ทั้งหมดและใช้ prefix block นั้นทันที นี่คือวิธีมาตรฐานแก้ปัญหาที่ regex แบบ ~ .(jpg|png)$ คอยแย่ง traffic จากเส้นทางที่ต้อง proxy ไป
ระยะสุดท้ายคือการลอง regex ตามลำดับในไฟล์ ถ้าไม่มี ^~ nginx จะทดสอบ location แบบ regular expression ตามลำดับที่ปรากฏในไฟล์ ตัวแรกที่ match คือผู้ชนะ จุดนี้คือความไม่สมมาตรที่สำคัญที่สุดของอัลกอริทึมทั้งหมด สำหรับ regex ลำดับในไฟล์เป็นตัวตัดสิน แต่สำหรับ prefix ลำดับไม่สำคัญเลย เพราะมีแค่ prefix ที่ยาวที่สุดเท่านั้นที่มีผล การย้าย regex block ขึ้นหรือลงจึงเปลี่ยนพฤติกรรม แต่การสลับสอง prefix block ก็ไม่มีอะไรเปลี่ยนเลย
ถ้าไม่มี regex ตัวใด match เลย block ที่ถูกจำไว้คือ prefix ที่ยาวที่สุดจะถูกใช้เป็นคำตอบ
อย่าลืมข้อจำกัดที่ทราบกันดี เครื่องมือไม่ขยาย include directive ไม่ประเมิน nested location หรือ if block และไม่แก้ค่าตัวแปรใน URI ควรรวมไฟล์ที่ include มาเป็นชุดเดียวก่อนวาง และถือว่า trace นี้เป็นการวิเคราะห์แบบนิ่งตามเอกสาร ไม่ใช่การจำลองเซิร์ฟเวอร์ที่กำลังทำงานจริง
กรณีการใช้งานจริง
แก้ปัญหา 404 ที่ไม่คาดคิด
มีผู้ใช้แจ้งว่า /blog/article-42 คืน 404 แต่หน้าอื่นปกติ ให้วาง block ทั้งหมด ป้อน URI ดังกล่าว แล้วดู trace คุณอาจพบว่า regex อย่าง ~ ^/blog/\d+ ถูกวางไว้หลัง pattern ของไฟล์รูป หรือ prefix ที่ยาวที่สุดชี้ไปที่ static root ที่ไม่มีไฟล์นั้นอยู่ ใช้เวลากับ trace ห้านาที ดีกว่าลองผิดลองถูกทั้งชั่วโมง
ตรวจว่าเส้นทาง API ตกอยู่ใน proxy block ที่ถูกต้อง
ก่อนปล่อยรุ่นใหม่ ให้วาง location block จาก production แล้วทดสอบ URI ที่ frontend จะเรียก ยืนยันว่า /api/auth/login เข้า proxy block ไม่ใช่กติกา cache ที่ใครสักคนเพิ่มไปสปรินต์ที่แล้ว trace ยังบอกด้วยว่าตัวชนะมาจาก exact match, prefix หรือ regex ซึ่งเป็นประโยชน์เวลาต้องเพิ่ม header เฉพาะ response ของ API ในภายหลัง
ย้ายจาก Apache มาใช้ nginx
กติกา rewrite ของ Apache ไม่ได้แปลงเป็น nginx แบบหนึ่งต่อหนึ่ง และลำดับความสำคัญของการจับคู่ก็ต่างกันระหว่างสองเซิร์ฟเวอร์นี้ ให้สร้าง location block ตัวเลือกจากกติกา Apache ของคุณ แล้วตรวจว่า URI สำคัญแต่ละเส้นตกลงตรงที่คาดไว้ก่อนย้าย traffic จริง
สอนทีมเรื่อง routing ของ nginx
decision trace เป็นบทเรียนที่กระชับในตัวเอง สมาชิกใหม่สามารถวาง config ตัวอย่าง ลอง URI แสบ ๆ อย่าง /api, /api/ และ /apiX แล้วดูอัลกอริทึมเลือกผู้ชนะทีละครั้ง มันเปลี่ยนหน้าเอกสารที่น่าเบื่อให้กลายเป็นแบบฝึกหัดแบบโต้ตอบที่จำได้นาน
แนวทางปฏิบัติที่ดี
- ใช้ exact match สำหรับเส้นทางคงที่ เช่น = /login หรือ = /health เพราะ short-circuit ทุกอย่างและเข้าใจง่ายที่สุด
- ใช้ regex ให้น้อยและเรียงลำดับอย่างตั้งใจ วาง regex ที่เจาะจงที่สุดไว้ก่อน เพราะลำดับในไฟล์เพียงอย่างเดียวตัดสินผู้ชนะ
- ใช้ ^~ เมื่อ prefix ต้องไม่ถูกแย่ง ถ้าเส้นทาง proxy ต้องไม่ตกไปที่ regex ของไฟล์ static ให้ใส่ ^~ แล้วยืนยันด้วย trace
- ทดสอบ URI ขอบเสมอ ลอง /path, /path/, /path/extra และแบบตัวพิมพ์ผสม เพื่อดูว่าแต่ละแบบไปตกที่ไหน
- ใส่คอมเมนต์บอกเจตนายใน config เครื่องมืออธิบายทางเลือกของ nginx ส่วนคอมเมนต์หนึ่งบรรทัดอธิบายเจตนาของคุณให้วิศวกรคนถัดไป
- รัน trace ก่อนแก้ routing ทุกครั้ง ให้เป็นนิสัยเดียวกับ nginx -t คือเช็ก syntax ก่อน แล้วค่อยเช็กเจตนาการ routing
พร้อมเลิกทะเลาะกันแล้วว่า block ไหนชนะหรือยัง เปิด nginx location Match Tester วาง config ของคุณ แล้วรับ decision trace ครบทุกขั้นตอนภายในไม่กี่วินาที
เครื่องมือที่เกี่ยวข้องที่คุณอาจสนใจ:
- nginx Config Generator — สร้าง server block ที่สะอาดตั้งแต่ต้น
- Apache to nginx Converter — แปลงกติกา Apache เป็น syntax ของ nginx
- nginx Log Analyzer — อ่าน access log และจับปัญหา routing จาก traffic จริง
ขอให้สนุกกับการเขียนคอนฟิก!
คำถามที่พบบ่อย
ถ: nginx location Match Tester เป็นเครื่องมือทางการของ nginx หรือไม่? ตอบ: ไม่ใช่ เป็น static analyzer อิสระที่ทำงานตามลำดับการจับคู่ที่ระบุในเอกสารของ nginx ได้แก่ exact, ^~, regex ตามลำดับไฟล์ และ prefix ที่ยาวที่สุด พร้อมอธิบายทุกการตัดสินใจ ไม่ได้เกี่ยวข้องกับโปรเจกต์ nginx
ถ: ทำไม request ของฉันถึงเข้า regex block แทนที่จะเป็น prefix ที่ยาวกว่า? ตอบ: นั่นคือพฤติกรรมตามเอกสาร หลังจำ prefix ที่ยาวที่สุดแล้ว nginx ยังลอง location แบบ regex ตามลำดับในไฟล์ต่อ โดยตัวแรกที่ match จะชนะ เว้นแต่ prefix ที่ยาวที่สุดจะมีเครื่องหมาย ^~
ถ: เครื่องมือตาม include directive ให้ไหม? ตอบ: ไม่ตาม ทั้ง include, nested location และ if block ไม่ได้ถูกจำลอง และเครื่องมือจะเตือนคุณเรื่องนี้ ควรรวมไฟล์ที่ include ไว้เป็นชุดเดียวก่อนวาง
ถ: config ของฉันถูกอัปโหลดขึ้นเซิร์ฟเวอร์หรือเปล่า? ตอบ: ไม่ analyzer ทำงานทั้งหมดในเบราว์เซอร์ของคุณ block และ URI ที่วางจึงไม่เคยออกจากเครื่อง