NGINX: Headers More

Byphunsanit

NGINX: Headers More

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 ออกไป

  1. ติดตั้ง
    sudo apt install libnginx-mod-http-headers-more-filter
  2. ตั้งค่า
    • เพิ่มบรรทัด more_clear_headers Server; ลงในคอนฟิกที่ต้องการ เช่น
      http {
          more_clear_headers Server;
          ...
      }
      
  3. เช็คคอนฟิกโดยคำสั่ง
    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 ได้แล้ว
  4. รีสตาร์ทเอนจินเอกซ์โดยคำสั่ง
    sudo systemctl restart nginx
  5. ดูใน header ไม่ควรมีข้อความ
    Server:
    กลับมาแล้ว

การทำงาน

ในตัวอย่าง more_clear_headers Server; มันทำงานดังนี้ครับ

  1. เมื่อมี Request เข้ามา Nginx จะเตรียมส่งข้อมูลกลับ
  2. ปกติ Nginx จะแอบใส่หัวกระดาษว่า Server: nginx/1.xx.xx ไปด้วย
  3. Headers More Module จะเข้าไป “ดึงข้อความนี้ออก” ก่อนที่ข้อมูลจะถูกส่งออกไปหา Browser ( อย่าง chrome )
  4. ผลลัพธ์คือคนข้างนอกจะไม่รู้เลยว่าคุณใช้ Software อะไรเป็นเว็บเซิร์ฟเวอร์

ถึงจะเล็กน้อยแต่การที่ไม่บอกว่าเป็น server อะไรเวอร์ชั่นไหน จะลดความเสี่ยงได้นิดหน่อย


ผลข้างเคียง

หากคุณติดตั้งโมดูลและใส่แค่คำสั่ง load_module หรือมีไฟล์ใน modules-enabled โดยที่ยังไม่ได้ระบุคำสั่งใดๆ ใน server block หรือ http block การทำงานจะเป็นดังนี้ครับ

  1. สถานะ “พร้อมใช้งานแต่ยังไม่ทำงาน”
    โมดูลจะถูกโหลดเข้าสู่หน่วยความจำของ Nginx เตรียมสแตนด์บายไว้เฉยๆ ครับ
    • ไม่มีการเปลี่ยนแปลง: ข้อมูลทุกอย่างที่ส่งออกไป ( Header ) จะยังเหมือนเดิม 100%
    • ยังไม่ซ่อนอะไร: ชื่อ Server: nginx และเลขเวอร์ชัน (ถ้าไม่ได้สั่ง server_tokens off;) จะยังคงแสดงให้คนภายนอกเห็นตามปกติครับ
  2. การกินทรัพยากร ( Resource Usage )
    การโหลดโมดูลทิ้งไว้โดยไม่เรียกใช้ มีผลน้อยมากจนแทบวัดไม่ได้ครับ
    • Memory: ใช้พื้นที่ใน RAM เล็กน้อยมากเพื่อเก็บชุดคำสั่งของโมดูล
    • CPU: ไม่มีการประมวลผลเพิ่มเลย เพราะ Nginx จะยังไม่ส่งข้อมูลเข้าไปให้โมดูลนี้คัดกรองจนกว่าคุณจะมีคำสั่ง more_clear_headers หรือ more_set_headers ครับ
  3. จะทำงานก็ต่อเมื่อ “ระบุคำสั่ง” เท่านั้น
    โมดูลนี้ทำงานแบบ 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 แล้วมันต่างกันยังไง

  1. แหล่งที่มา ( 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 ด้วยวิธีอื่นๆ เช่น ติดตั้งจากซอร์สโค้ดเองครับ
  2. ความสะดวกในการใช้งาน
    • แบบที่คุณใช้ ( Ubuntu package ): ติดตั้งแล้วระบบจะสร้างไฟล์ใน /etc/nginx/modules-enabled/ ให้โดยอัตโนมัติ ทำให้คุณไม่ต้องไปวุ่นวายกับการประกาศ load_module เองในไฟล์หลัก ( ถ้าในไฟล์ nginx.conf มีบรรทัด include modules-enabled อยู่แล้ว )
    • แบบ NGINX ( F5 ): มักจะใช้สำหรับคนที่ต้องการความยืดหยุ่นสูง หรือใช้ NGINX Plus ( เวอร์ชันเสียเงิน ) ซึ่งขั้นตอนจะซับซ้อนกว่าครับ
  3. ประสิทธิภาพ
    ทั้งสองแบบให้ผลลัพธ์เหมือนกัน 100% เพราะจริง ๆ แล้วไฟล์ ngx_http_headers_more_filter_module.so มาจากที่เดียวกันซึ่งพัฒนาโดย OpenResty แค่ทำให้ใช้ง่ายขึ้นใน Ubuntu

มีข้อเสียอะไรมั๋ย

  1. ความเสี่ยงเรื่อง Cache Headers
    หากคุณใช้คำสั่งที่ “กวาดกว้าง” เกินไป เช่นการสั่งลบ Header บางตัวที่จำเป็นต่อการทำงานของ Browser หรือ Proxy ( เช่น Cloudflare ) อาจเกิดปัญหาดังนี้ครับ
    • ลบ Cache-Control: หากคุณเผลอไปลบ Cache-Control หรือ Expires จะทำให้ Browser ไม่รู้ว่าควรเก็บไฟล์นี้ไว้นานแค่ไหน ผลคือ Browser จะโหลดใหม่ทุกครั้ง ( ทำให้เว็บช้าและ server เหนื่อย ) หรืออาจจะเก็บไว้นานเกินไปจน User ไม่เห็นข้อมูลอัปเดตครับ
    • ลบ ETag / Last-Modified: หากลบตัวนี้ทิ้ง Nginx จะไม่สามารถทำ “Conditional Request” ได้ ( คือการเช็คว่าไฟล์เปลี่ยนหรือยัง ) ทำให้เซิร์ฟเวอร์ต้องส่งไฟล์เต็มกลับไปทุกครั้ง สิ้นเปลืองแบนด์วิดท์ครับ
  2. ข้อเสียด้านประสิทธิภาพ ( เล็กน้อยมาก )
    • Resource Usage: เนื่องจากเป็นโมดูลเสริมที่ต้องเข้ามา “แก้ไข” ข้อมูลก่อนส่งออกไป จึงมีการใช้ CPU เพิ่มขึ้นนิดหน่อยเพื่อประมวลผล Header ทุกตัวที่วิ่งผ่าน แต่น้อยมากจนแทบไม่รู้สึกครับ ( ยกเว้นกรณีเว็บที่มี Traffic มหาศาลจริง ๆ )
  3. ความซับซ้อนในการจัดการ ( Maintenance )
    • Dependency: หากคุณอัปเกรด Nginx เป็นเวอร์ชันที่ใหม่มาก ๆ บางครั้งโมดูลตัวนี้อาจจะไม่ทำงานร่วมกันได้ทันที ( ต้องรอแพตช์อัปเดต ) แต่ถ้าใช้เวอร์ชันจาก apt ของ Ubuntu ปัญหานี้มักจะถูกจัดการโดยทีม Maintainer อยู่แล้วครับ

อ่านเพิ่มเติม

About the author

phunsanit administrator