การเข้าใจลำดับการโหลด Configuration ของ Nginx เป็นเรื่องสำคัญมากครับ เพราะจะช่วยให้คุณไล่เช็คได้ว่าทำไม Setting ที่เราเขียนถึงไม่ทำงาน หรือทำไมเกิด Error เวลา Start service
🏗️ ลำดับการโหลด Configuration ของ Nginx
โดยปกติ Nginx จะเริ่มอ่านไฟล์จาก “บนลงล่าง” ตามโครงสร้างดังนี้ครับ
- Main Configuration (
nginx.conf)
ไฟล์หลักที่อยู่ที่/etc/nginx/nginx.confจะถูกโหลดเป็นอันดับแรก โดยภายในไฟล์นี้จะกำหนดค่าระดับ Global เช่น- User / Group ที่ใช้รัน Process
- Worker Processes ( จำนวน Core ที่ใช้ )
- Error Log ( Path เก็บ log หลัก )
- PID file
- The
httpBlock
ภายในnginx.confจะมี Block ที่ชื่อว่าhttp { ... }ซึ่งจะรวบรวมการตั้งค่าสำหรับ Web Traffic ทั้งหมด- การโหลด MIME Types
- การตั้งค่า Log Format
- Gzip compression
- Include Statement: นี่คือจุดสำคัญที่ Nginx จะไปดึงไฟล์อื่นมาอ่านเพิ่ม
- Modular Configs ( ไฟล์แยกในโฟลเดอร์ต่าง ๆ )
ในhttpblock มักจะมีคำสั่งincludeเพื่อดึงไฟล์จากโฟลเดอร์อื่นมาประกอบร่างกัน โดยลำดับมาตรฐานคือ
/etc/nginx/conf.d/*.conf: มักใช้เก็บ Config เสริมทั่วไป/etc/nginx/sites-enabled/*: ( ในระบบ Ubuntu/Debian ) จะโหลดไฟล์ Virtual Host ( Server Block ) ที่เราทำ Symbolic link มาจากsites-available
Server Blocks ( Virtual Hosts )
เมื่ออ่านไฟล์เข้ามาแล้ว Nginx จะตัดสินใจเลือกใช้ server block ตามลำดับความสำคัญ ( Precedence ) ไม่ได้เรียงตามบรรทัดเสมอไป
- เช็คจาก IP Address และ Port ที่ตรงที่สุด
- เช็คจาก
server_name( ชื่อ Domain ) ที่ตรงกันแบบเป๊ะ ๆ - เช็คจาก Wildcard (เช่น
*.example.com) - ถ้าไม่เจอเลย จะไปลงที่
default_server
Location Blocks ( ภายใน Server Block )
เมื่อเลือก Server ได้แล้ว Nginx จะดู URI ( Path ) ว่าจะให้ทำอะไรต่อ โดยเรียงลำดับความดังนี้
=: ตรงกันเป๊ะๆ ( Exact Match )^~: ตรงส่วนหน้า และหยุดหาต่อ ( Best Non-RegEx Match )~หรือ~*: ตรงตาม Regular Expression ( Case sensitive / Insensitive )/: ถ้าไม่ตรงกับอะไรเลย ( Prefix Match )
💡 สรุปแผนผังการโหลด
| ลำดับ | ส่วนประกอบ | หน้าที่หลัก |
| 1 | nginx.conf ( Global ) | ตั้งค่าพื้นฐานของ OS และ Process |
| 2 | http Context | ตั้งค่าการรับส่งข้อมูลเว็บและดึงไฟล์ Include |
| 3 | server Block | แยกแยะตาม Domain Name หรือ IP |
| 4 | location Block | จัดการ Request ตาม Path ( เช่น /api, /images ) |
ทุกครั้งหลังแก้ไขไฟล์เสร็จ ให้รันคำสั่ง sudo nginx -t เพื่อตรวจสอบ Syntax ก่อนสั่ง Reload เสมอครับ เพื่อป้องกัน Service พังจากความผิดพลาดในการพิมพ์
อ่านเพิ่มเติม