ทำ load balance https ด้วย nginx
มาถึงตอนที่ 3 แล้ว
ตอนแรก -> วิธีสร้าง web server ด้วย nginx
ตอนสอง -> ทำ web ให้รองรับ https
หากที่ไหนมีเงินเยอะหน่อยก็สามารถซื้อ hardware มาทำหน้าที่เป็น load balance ให้กับ web server ได้ หรือใครใช้บริการบน cloud ทาง cloud provider ก็มี service นี้ไว้ให้บริการอยู่แล้ว แต่ครั้งนี้เราจะมาทำ load balance ใช้เองโดยใช้ nginx โดยตัวอย่างแรกเราจะทำตามภาพนี้
คือให้คนเรียกไปที่ url “testhttps.webhop.net” ได้ใช้ http ธรรมดา (port 80) แล้วให้ตัว load balance ไปเรียก web server ข้างหลังที่เป็น https ให้
ก่อนอื่นก็ทำให้เครื่อง webserver1 และ webserver2 เป็น https ก่อนโดยให้ดูใน story ตอนสองด้านบน
เสร็จแล้วให้สร้าง file index.html ที่เครื่อง webserver1 และ webserver2 เพื่อไว้สำหรับทดสอบการทำงานของ load balance
ที่เครื่อง webserver1 ให้ใช้คำสั่ง
echo "webserver1" | sudo tee --append /var/www/html/index.htmlที่เครื่อง webserver2 ให้ใช้คำสั่ง
echo "webserver2" | sudo tee --append /var/www/html/index.html
จากนั้นเราก็จะมา config ที่เครื่องที่ทำหน้าที่เป็น load balance กันเลย โดยให้เข้าไปแก้ไข config file ของ nginx ที่ /etc/nginx/sites-available/default โดยให้แก้ไขดังนี้
กรอบแรกคือเป็นการสร้าง section เพิ่มเพื่อใช้บอกว่าเมื่อถูกเรียกมาแล้วจะให้ส่ง request ต่อไปที่เครื่องไหน port อะไร ในที่นี้กำหนดว่าหากมีการเรียกมา จะส่ง request ไปที่เครื่อง webserver1 ที่ port 443 ที่เป็น https และเครื่อง webserver2 ที่ port 443
กรอบที่สอง อันนี้ไม่มีอะไร แค่ปิดการให้บริการของ ipv6
กรอบที่สามเพื่อระบุว่าให้บริการให้กับ domain name “testhttps.webhop.net”
และกรอบที่สี่ เป็นส่วนที่สำคัญที่สุด คือบอกว่าเมื่อเครื่องนี้ได้รับ request มาแล้วจะให้ไปเรียกใช้เครื่องใน section “BackendServer” ที่เราสร้างขึ้นในกรอบแรก
อธิบายได้ว่า เมื่อมีการเรียกจากข้างนอกเข้ามาที่เครื่อง load balance ที่ด้วย port 80 (คือมาด้วย http ปกติ) ตัว load balance จะส่ง request ต่อไปให้กับเครื่อง web server ข้างหลังที่เป็น https โดยจะส่ง request ไปเป็นแบบ round robin (คือแจกวน webserver1 และ webserver2 ไปเรื่อย ๆ)
หลังจากที่เราแก้ไข config แล้วก็ทำการทดสอบ config ก่อนด้วยคำสั่ง
sudo nginx -t
เสร็จแล้วก็ทำการ reload config ใหม่
sudo service nginx reload
ลองทดสอบโดยใช้เครื่องของเราเรียกไปที่เครื่อง web server “http://testhttps.webhop.net”
จะเห็นว่าแต่ละครั้งที่เรียกจะเป็นการเรียกไปที่เครื่อง webserver1, webserver2 วนกันไปเรื่อย ๆ
แต่จะบอกว่าสิ่งที่ทำมานี้มันไม่ค่อยจะมีประโยชน์ 😅 เพราะจริง ๆ ที่เราต้องการทำ https ก็เพราะต้องการให้การสื่อสารระหว่าง client กับ server ถูกเข้ารหัส สิ่งที่เราทำไปนี้เป็นการทำให้ load balance คุยกับ web server หลังบ้านเป็นแบบเข้ารหัส
สิ่งที่ควรจะทำควรเป็นแบบนี้
คือให้ client คุยกับ web server ผ่านทาง load balance โดยเป็นการคุยกับแบบเข้ารหัส แล้วให้ load balance คุยกับ web server หลังบ้านแบบไม่เข้ารหัส ซึ่งจะแบบนี้จะเป็นการ Offload SSL ให้กับตัว web server ทำให้ตัว web server เองสามารถทำงานได้อย่างเต็มที่
วิธีทำก็คือทำให้ webserver1 และ webserver2 ทำหน้าที่เป็น web server ธรรมดา ไม่ต้อง enable SSL โดยการปิดส่วนของ SSL ซะ แล้วเปิดส่วนการให้บริการของ port 80
ส่วนที่เครื่องที่เป็น load balance เราก็ทำการแก้ไข config ดังนี้
กรอบแรกจะสังเกตุได้ว่าเรามีการเปลี่ยน port ของเครื่อง web server เป็น port 80 (เดิมเป็น 443)
กรอบสอง เราปิดการให้บริการของ port 80
กรอบสาม เราเปิดให้บริการ port 443 (https) และระบุที่เก็บ cert และ key
และกรอบสี่ เปลี่ยนจากการเรียก https เป็น http
เสร็จแล้วทำการ save
ตามด้วยตรวจสอบความถูกต้องของ config ด้วย nginx -t
แล้วก็ทำการ reload service
ลองเป็น web browser ลองเข้า https://testhttps.webhop.net
แล้วลองกด refresh
ก็ผ่านไปแบบกับการ implement 2 แบบ
http -> https, https กับ
https -> http, http
หรือหากอยากจะ implement แบบภาพต่อไปนี้
คือเพิ่มความปลอดภัยให้ครบทุกจุดมันไปเลย (อารมภ์ประมาณอยากได้ความปลอดภัยจัด ไม่ว่าจะเป็นทั้งภายนอก ภายใน) แต่ก็ต้องแลกกับ performance ที่จะตกลงไปบ้าง อันนี้ก็แล้วแต่ว่าใครจะเอาไป implement เป็นแบบไหน ก็คิดว่าทุกคนคงจะสามารถดัดแปลงต่อได้เองแล้วนะครับ