วันนี้จะมาบอกเกี่ยวกับค่า Timing ต่างๆ ของ Web Application Firewall บน Application Gateway กัน ว่าแต่ละค่ามันเอาไว้ทำอะไรบ้าง (ต่อไปขอเรียก Application Gateway ว่า AG)
อย่างแรกที่ต้องเข้าใจเลยคือ หากใครดูวิธีโอในคอร์สแล้ว จะเห็นว่า การทำ WAF นั้น ก็คือการสร้าง AG ขึ้นมา แล้วนำ Member Server มาใส่ลงใน Backend Pool ด้านหลัง เพื่อให้ AG ทำการ Forward Traffic จากข้างหน้า ไปหา Server ที่อยู่ข้างหลัง
และตัว AG เองก็จะมีการตรวจสอบเครื่องข้างหลังตลอดเวลาว่า มันยังดีอยู่มั๊ย ตายไปรึยัง เพราะถ้าตายไปแล้ว มันจะได้ไม่ส่ง Traffic จากผู้ใช้งานไปหาเครื่องดังกล่าว เว้นแต่ว่า ถ้ามันยังตรวจสอบไม่เสร็จ, AG เองก็มีโอกาสที่จะส่ง Traffic นี้ไปยังเครื่องที่ตายแล้วได้ ส่งผลให้ผู้ใช้งานพบ Error Gateway 502 ขึ้นมา และเมื่อ AG ตรวจสอบ และยืนยันแล้วว่าเครื่องตาย ก็จะทำการ Mark Status เป็น Unhealthy มันก็จะไม่ส่ง Traffic ไปยังเครื่องนั้นอีก
ตรงนี้จะเห็นได้ว่า จริงๆ แล้ว AG มันสามารถทำ Load balance ได้ แต่เรื่องการ Failover จะต้องกำหนดค่า Timing ให้ดี เพราะไม่งั้นมีโอกาสที่ผุ้ใช้งานจะพบเจอ Error ได้ระหว่างที่มันยังไม่ Failover ซึ่งต่างจาก Azure Load Balancer ที่เมื่อพบว่ามีเครื่องตายระหว่างทาง มันจะโยนไปให้เครื่องอื่นทันที
ทีนี้ถ้าเราจะใช้ AG เราจะต้องกำหนดค่า Timing อะไรบ้าง มาดูกัน
ค่าแรกคือในเมนู HTTP Settings จะมีด้วยกันอยู่ 3 ค่าคือ Interval, Timeout, Unhealthy threshold
Interval คือรอบระยะเวลาเป็นวินาที ที่ AG จะส่งสัญญาณไปตรวจสอบกับ Server ที่อยู่ข้างหลัง หากเราตั้งไว้ 5 วินาที แปลว่า ทุกๆ 5 วินาที มันจะเช็คว่า Server ข้างหลังสบายดีอยู่มั๊ย ตายไปรึยัง ค่านี้คือแค่ "รอบการตรวจ" เหมือนเราตรวจเวนยาม ทุก 6 ชั่วโมง อะไรแบบนั้น
Timeout เป็นค่าที่ทำงานสัมพันธ์กับค่า Interval โดยเมื่อถึงรอบการตรวจแล้ว หากเครื่อง Server สบายดีอยู่ ก็ไม่มีอะไร มันก็จะส่งไปอัพเดทสถานะที่เมนู Backend health ว่าเครื่องนั้น Healthy สีเขียว, แต่ถ้าหากตรวจตามรอบแล้วพบว่า เครื่องตายไป ติดต่อไม่ได้ สัญญาณไม่ตอบกลับ มันก็จะรออีกกี่วินาทีตามค่า Timeout เผื่อกรณีแบบสัญญาณแลค หรือเกิด Latency ใดๆ ขึ้น ไม่ใช่ว่าเช็คปุ๊บ ไม่เจอเลยก็บอกว่าตาย แต่เช็ค แล้วรอให้แน่ใจว่า ตายจริงๆ นะ ซึ่งถ้าหากตัวอย่างเราเซ็ต Timeout ไว้ 5 วินาทีก็คือ เมื่อเครื่องนั้นไม่ตอบสนองต่อสัญญาณกลับมาภายใน 5 วินาที
Unhealthy threshold คือรอบที่จะตรวจสอบซ้ำอีกทีเพื่อยืนยันว่า เครื่องตายจริงๆ มั๊ย ตายแน่หรือเปล่า ให้เช็คซ้ำอีกกี่รอบ ถ้าสมมติเราตั้งเป็น 0 แปลว่า ไม่ต้องตรวจซ้ำเลย มันก็จะเอาค่า Timeout ที่ตรวจสอบได้ ไปตีความเป็น Unhealthy ทันที
จะเห็นว่า ระยะเวลาการเช็คว่า เครื่องนั้นตายไปรึยัง มันไม่ได้เกิดขึ้นทันที มันจะต้องรอรอบเวลา และรอหน่วงเวลาการยืนยันอีกที ซึ่งจังหวะตรงนี้แหล่ะ สมมติว่าเครื่องตายไปแล้ว หน่วงเวลายังไม่ทำงานจนครบ เมื่อผู้ใช้งานดันเรียกเว็บเข้ามาในจังหวะนี้ อาจทำให้พบเจอ Error Gateway 502 ขึ้นมาได้ หากตั้งค่าเหล่านี้ไว้สูงเกินไป
ทีนี้ เมื่อเรามีเครื่องมากกว่า 1 เครื่องใน Backend Pool เราอาจต้องมีการบำรุงรักษา แก้ไข อัพแพชอะไรก็ว่าไป ซึ่งถ้าเราทำแล้วต้องมีการ Restart Service/Server ด้วยแล้ว เราควรจะเปิดใช้งาน Connection draining ไว้ด้วย
Connection draining คือค่าที่จะตรวจสอบว่า เมื่อ Server ถูก Remove ออกจาก Pool แล้วตรวจไม่พบภายในกี่วินาที ให้นำเครื่องดังกล่าว ออกจากการตรวจเช็คของ Backend health
สมมติว่า เราตั้งค่า draining ไว้ที่ 5 วินาที แล้วเกิดมีวันนึง เราต้องการ Server ที่อยู่ใน Pool มาสั่ง Restart, เราจะต้องทำการ Remove Server นั้น ออกจากสมาชิก Backend Pool เสียก่อน เมื่อเครื่องถูกนำออกมาแล้ว ค่า draining ก็จะตรวจสอบทันทีเลยว่า ภายใน 5 วินาที ถ้าไม่มีสัญญาณตอบกลับ จะถือว่า เครื่องนั้นไม่ได้มีอยู่อีกต่อไป ผลที่ตามมาก็คือ ในฝั่ง Backend health ก็จะไม่สร้างสถานะ Unhealthy ให้กับเครื่องดังกล่าว เพราะถือว่าเครื่องนั้นไม่อยู่แล้ว ก็ไม่ต้องรอค่า Interval หรือ Timeout อีกต่อไป ทำให้ Traffic ไม่ถูกส่งไปยังเครื่องที่ถูกเอาออกจาก Pool นั่นเอง และผู้ใช้งานก็จะไม่พบกับ Error 502
พอเราทำเสร็จแล้ว ก็ค่อยนำ Server ดังกล่าว กลับเข้า Backend Pool เหมือนเดิม แล้วก็สลับไปทำเหมือนกันกับเครื่องทีเหลือ ก็จะทำให้เรา Maintenance ได้อย่างราบรื่น ซึ่งคิดง่ายๆ ก็เหมือนเรานำเครื่องออกจาก Load balance นั่นแหล่ะ ตัดการเชื่อมต่อทิ้งทั้งหมด พอทำเสร็จก็ค่อยเสียบกลับเข้าไป ง่ายแค่นี้เอง
ส่วนค่า Request time-out ด้านล่างสุดตรงนี้ไม่มีอะไรซับซ้อน แค่เป็นช่วงเวลาที่รอตอบสนองกับ Web Server ที่อยู่ข้างหลัง เหมือนค่า Timeout บน IIS เลย เช่น เรามีไฟล์อัพโหลด 250MB แล้วเกิดว่ามันใช้เวลานานเกินไป เช่น เกิน 20 วินาที ตัว AG ก็จะตัด Connection นี้ทิ้ง แล้วตีเป็น Timeout ซึ่งปกติ IIS จะตั้ง Timeout ไว้ที่ 120 วินาที ดังนั้นก็ต้องตั้งค่านี้ให้สัมพันธ์กับ Web Server ที่อยู่ข้างหลังด้วย
คอร์สเรียนออนไลน์ที่ไม่เหมือนใคร เพราะลงมือทำจริง อธิบายจริง เห็นภาพจริงๆ และได้ผลลัพธ์จริงๆ กับคอร์ส Azure for Beginner (Iaas Hands-on-Lab) สั่งซื้อได้ที่
skilllane.com/courses/azure-for-beginner ซื้อครั้งเดียว ดูซ้ำกี่ครั้งก็ได้ ดูได้ตลอดชีพ ไม่มีหมดอายุ ที่สำคัญ ภาษาไทย เข้าใจง่าย ทำได้จริง