NGINX มี dynamic module extend อยู่ชื่อ Headers-More ใช้ในการควบคุมในการเพิ่มหรือลบ output headers ที่ออกไปจากเอนจินเอกซ์ โดยปกติแล้วทุกครั้งที่ตอบ server จะส่งคำว่า nginx ออกไป หากต้องการลบมันออกไปก็ตามวิธีได้
ความสามารถ
ความสามารถหลักที่เหนือกว่าปกติ
- การลบ Header ( Clear ): สามารถลบ Header ทิ้งได้เลย เช่น
Server: nginxซึ่งคำสั่งปกติทำไม่ได้ - การแก้ไข ( Modify ): สามารถเปลี่ยนค่า Header ที่มีอยู่เดิมให้เป็นค่าใหม่ตามต้องการ
- ทำงานได้ทุกสถานะ: สามารถจัดการ Header ได้แม้ในหน้า Error ( เช่น 404, 403, 500 ) ซึ่งคำสั่ง
add_headerปกติมักจะไม่ทำงานในหน้านี้
ลองลบ Server ออกไป
- ติดตั้ง
sudo apt install libnginx-mod-http-headers-more-filter - ตั้งค่า
- เพิ่มบรรทัด
more_clear_headers Server;ลงในคอนฟิกที่ต้องการ เช่นhttp { more_clear_headers Server; ... }
- เพิ่มบรรทัด
- เช็คคอนฟิกโดยคำสั่ง
sudo nginx -t
ถ้าตอบมาเป็น
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
คือแก้ headers ได้แล้ว - รีสตาร์ทเอนจินเอกซ์โดยคำสั่ง
sudo systemctl restart nginx - ดูใน header ไม่ควรมีข้อความ
Server:
กลับมาแล้ว
การทำงาน
ในตัวอย่าง more_clear_headers Server; มันทำงานดังนี้ครับ
- เมื่อมี Request เข้ามา Nginx จะเตรียมส่งข้อมูลกลับ
- ปกติ Nginx จะแอบใส่หัวกระดาษว่า
Server: nginx/1.xx.xx ไปด้วย - Headers More Module จะเข้าไป “ดึงข้อความนี้ออก” ก่อนที่ข้อมูลจะถูกส่งออกไปหา Browser ( อย่าง chrome )
- ผลลัพธ์คือคนข้างนอกจะไม่รู้เลยว่าคุณใช้ Software อะไรเป็นเว็บเซิร์ฟเวอร์
ถึงจะเล็กน้อยแต่การที่ไม่บอกว่าเป็น server อะไรเวอร์ชั่นไหน จะลดความเสี่ยงได้นิดหน่อย
ผลข้างเคียง
หากคุณติดตั้งโมดูลและใส่แค่คำสั่ง load_module หรือมีไฟล์ใน modules-enabled โดยที่ยังไม่ได้ระบุคำสั่งใดๆ ใน server block หรือ http block การทำงานจะเป็นดังนี้ครับ
- สถานะ “พร้อมใช้งานแต่ยังไม่ทำงาน”
โมดูลจะถูกโหลดเข้าสู่หน่วยความจำของ Nginx เตรียมสแตนด์บายไว้เฉยๆ ครับ- ไม่มีการเปลี่ยนแปลง: ข้อมูลทุกอย่างที่ส่งออกไป ( Header ) จะยังเหมือนเดิม 100%
- ยังไม่ซ่อนอะไร: ชื่อ
Server: nginxและเลขเวอร์ชัน (ถ้าไม่ได้สั่งserver_tokens off;) จะยังคงแสดงให้คนภายนอกเห็นตามปกติครับ
- การกินทรัพยากร ( Resource Usage )
การโหลดโมดูลทิ้งไว้โดยไม่เรียกใช้ มีผลน้อยมากจนแทบวัดไม่ได้ครับ- Memory: ใช้พื้นที่ใน RAM เล็กน้อยมากเพื่อเก็บชุดคำสั่งของโมดูล
- CPU: ไม่มีการประมวลผลเพิ่มเลย เพราะ Nginx จะยังไม่ส่งข้อมูลเข้าไปให้โมดูลนี้คัดกรองจนกว่าคุณจะมีคำสั่ง
more_clear_headersหรือmore_set_headersครับ
- จะทำงานก็ต่อเมื่อ “ระบุคำสั่ง” เท่านั้น
โมดูลนี้ทำงานแบบ On-demand ครับ คือคุณต้องสั่งมันถึงจะขยับ- ระบุแค่
more_clear_headers Server;: มันก็จะทำแค่ลบชื่อ Server อย่างเดียว จะไม่ไปยุ่งกับ Cache หรือ Header ตัวอื่นที่คุณไม่ได้สั่งครับ - ปลอดภัยสูง: ข้อดีคือมันจะไม่ “เดา” ใจเรา มันจะลบหรือแก้เฉพาะตัวที่เราเขียนลงใน config เท่านั้นครับ
- ระบุแค่
2 package ใช้ตัวไหนดีอันไหนของแท้
ติดตั้งโดย package libnginx-mod-http-headers-more-filter แต่ถ้าอ่านคู่มือ Headers-More กลับใช้ package nginx-plus-module-headers-more แล้วมันต่างกันยังไง
- แหล่งที่มา ( Source )
- libnginx-mod-http-headers-more-filter: เป็นเวอร์ชันที่อยู่ใน Official Repository ของ Ubuntu ทีมงาน Ubuntu หรือ Debian เป็นคนนำซอร์สโค้ดมา Build เป็นแพ็กเกจให้เรา ทำให้ติดตั้งง่ายผ่าน
apt installและได้รับการอัปเดตความปลอดภัยไปพร้อมกับระบบปฏิบัติการครับ - Link จาก NGINX Docs: เป็นหน้าเอกสารอย่างเป็นทางการของ NGINX ( F5 ) ที่อธิบายวิธีการนำโมดูลนี้ ( ซึ่งพัฒนาโดย OpenResty ) มา Compile หรือติดตั้งแบบ Dynamic Module ในกรณีที่คุณติดตั้ง NGINX ด้วยวิธีอื่นๆ เช่น ติดตั้งจากซอร์สโค้ดเองครับ
- libnginx-mod-http-headers-more-filter: เป็นเวอร์ชันที่อยู่ใน Official Repository ของ Ubuntu ทีมงาน Ubuntu หรือ Debian เป็นคนนำซอร์สโค้ดมา Build เป็นแพ็กเกจให้เรา ทำให้ติดตั้งง่ายผ่าน
- ความสะดวกในการใช้งาน
- แบบที่คุณใช้ ( Ubuntu package ): ติดตั้งแล้วระบบจะสร้างไฟล์ใน
/etc/nginx/modules-enabled/ให้โดยอัตโนมัติ ทำให้คุณไม่ต้องไปวุ่นวายกับการประกาศload_moduleเองในไฟล์หลัก ( ถ้าในไฟล์nginx.confมีบรรทัด include modules-enabled อยู่แล้ว ) - แบบ NGINX ( F5 ): มักจะใช้สำหรับคนที่ต้องการความยืดหยุ่นสูง หรือใช้ NGINX Plus ( เวอร์ชันเสียเงิน ) ซึ่งขั้นตอนจะซับซ้อนกว่าครับ
- แบบที่คุณใช้ ( Ubuntu package ): ติดตั้งแล้วระบบจะสร้างไฟล์ใน
- ประสิทธิภาพ
ทั้งสองแบบให้ผลลัพธ์เหมือนกัน 100% เพราะจริง ๆ แล้วไฟล์ ngx_http_headers_more_filter_module.so มาจากที่เดียวกันซึ่งพัฒนาโดย OpenResty แค่ทำให้ใช้ง่ายขึ้นใน Ubuntu
มีข้อเสียอะไรมั๋ย
- ความเสี่ยงเรื่อง Cache Headers
หากคุณใช้คำสั่งที่ “กวาดกว้าง” เกินไป เช่นการสั่งลบ Header บางตัวที่จำเป็นต่อการทำงานของ Browser หรือ Proxy ( เช่น Cloudflare ) อาจเกิดปัญหาดังนี้ครับ- ลบ Cache-Control: หากคุณเผลอไปลบ
Cache-ControlหรือExpiresจะทำให้ Browser ไม่รู้ว่าควรเก็บไฟล์นี้ไว้นานแค่ไหน ผลคือ Browser จะโหลดใหม่ทุกครั้ง ( ทำให้เว็บช้าและ server เหนื่อย ) หรืออาจจะเก็บไว้นานเกินไปจน User ไม่เห็นข้อมูลอัปเดตครับ - ลบ ETag / Last-Modified: หากลบตัวนี้ทิ้ง Nginx จะไม่สามารถทำ “Conditional Request” ได้ ( คือการเช็คว่าไฟล์เปลี่ยนหรือยัง ) ทำให้เซิร์ฟเวอร์ต้องส่งไฟล์เต็มกลับไปทุกครั้ง สิ้นเปลืองแบนด์วิดท์ครับ
- ลบ Cache-Control: หากคุณเผลอไปลบ
- ข้อเสียด้านประสิทธิภาพ ( เล็กน้อยมาก )
- Resource Usage: เนื่องจากเป็นโมดูลเสริมที่ต้องเข้ามา “แก้ไข” ข้อมูลก่อนส่งออกไป จึงมีการใช้ CPU เพิ่มขึ้นนิดหน่อยเพื่อประมวลผล Header ทุกตัวที่วิ่งผ่าน แต่น้อยมากจนแทบไม่รู้สึกครับ ( ยกเว้นกรณีเว็บที่มี Traffic มหาศาลจริง ๆ )
- ความซับซ้อนในการจัดการ ( Maintenance )
- Dependency: หากคุณอัปเกรด Nginx เป็นเวอร์ชันที่ใหม่มาก ๆ บางครั้งโมดูลตัวนี้อาจจะไม่ทำงานร่วมกันได้ทันที ( ต้องรอแพตช์อัปเดต ) แต่ถ้าใช้เวอร์ชันจาก
aptของ Ubuntu ปัญหานี้มักจะถูกจัดการโดยทีม Maintainer อยู่แล้วครับ
- Dependency: หากคุณอัปเกรด Nginx เป็นเวอร์ชันที่ใหม่มาก ๆ บางครั้งโมดูลตัวนี้อาจจะไม่ทำงานร่วมกันได้ทันที ( ต้องรอแพตช์อัปเดต ) แต่ถ้าใช้เวอร์ชันจาก
อ่านเพิ่มเติม
About the author