การใช้งาน NginX และ Free SSL Certificate ง่ายๆ ด้วย Docker
หลายคนอาจจะเคย Config server หรือพวก VPS แบบขนาดเล็กๆ เพื่อรันเว็บไซต์มาบ้าง ซึ่งถ้าหากใครที่เคยทำจะทราบดีอยู่แล้วว่าเรื่องการ Config NginX นั้นเป็นเรื่องที่น่าปวดหัวมาก และในยุคสมัยที่ให้ความสำคัญของเรื่องความปลอดภัยการส่งข้อมูลของเว็บไซต์ หรือการทำ SSL Certificate นั่นแหละครับ จึงยิ่งทำให้การ Config เครื่องมือต่างๆ พวกนี้ยิ่งปวดหัวกันไปใหญ่ แต่ไม่เป็นไรครับในวันนี้เราจะมาทำเรื่องพวกนี้ให้มันกลายเป็นเรื่องที่แสนจะง่ายดายกัน ด้วยพระเอกของเราในวันนี้ก็คือเจ้า Docker นั่นเองครับ
Flow การทำงานของ NginX แบบคร่าวๆ
การทำงานของหลักๆ Nginx ก็จะเป็นตัวรับการ Request จาก Client และทำการ Forward ไปให้แต่ละ Port ตามที่เรา Config ไว้ ซึ่งไอเจ้าตัว NginX นั้นก็จะมี Feature มากมายให้เราเรียกใช้งานซึ่งถือว่าเป็นเครื่องมือยอดนิยมที่ทั่วโลกเลือกใช้กันครับ แต่ในวันนี้เราจะมาลองทำกันเฉพาะเรื่อง Reverse proxy และการทำ SSL for free กันครับ
อย่างนั้นไม่ขอเสียเวลาเรามาเริ่มทำกันเลยดีกว่าครับ
ก่อนอื่นต้องมีเว็บไซต์ที่จะนำมาทดลองก่อน
ก่อนที่จะไป Config เจ้าตัว NginX เราจะต้องมีเว็บไซต์ที่จะใช้ทดสอบก่อนนะครับ ซึ่งผมมีตัวอย่างเอาไว้ทดสอบไว้ให้แล้ว สามารถเข้าไป Clone ได้เลยที่ https://github.com/guitarlnw/website-workshop-nginx.git
เมื่อ Clone repo มาเรียบร้อยแล้วก็ลองรันเลยครับ ซึ่งจะต้องรัน docker-compose.yml นะครับ เพราะเราจะนำไปทดสอบกับ NginX แบบ Docker
- yarn install หรือ npm install
- docker-compose up
เมื่อรันตาม Step ข้างบนแล้ว ลองเข้าไปที่ http://localhost:3000 จะได้หน้าเว็บไซต์หน้าตาแบบนี้ครับ
หากรันครั้งแรกจะต้องสร้างวง Network ก่อน แล้วก็รันตาม Step ข้างบนอีกรอบครับ คำสั่งตามนี้เลยครับ
- docker network create nginx-proxy-example
โค้ดใน repo นี้ก็ไม่มีอะไรมากครับเพียงแค่ให้เรารันเว็บไซต์ขึ้นมาหนึ่งเว็บเฉยๆ แต่อยากให้ลองสังเกตุไฟล์ docker-compose.yml ครับ คือสิ่งสำคัญในเรื่องนี้ โดยมีการกำหนดดังนี้
- เลข 1 คือเราตั้งชื่อ Container ว่า website
- เลข 2 เรากำหนด Port เป็น 3000
- เลข 3 คือ เราตั้งชื่อ Network ชื่อ nginx-proxy-example ซึ่งถ้านอกวง Network จะไม่สามารถมองกันเห็นได้ครับ
เมื่อได้เว็บไซต์แล้ว ส่วนต่อไปก็จะเป็นการ Config NginX ครับ
จำลอง Domain ที่เครื่องเราก่อน
เราจะทำการจำลอง site1.com และ site2.com ขึ้นมา แต่ก่อนอื่นเราต้องเข้าไปแก้ไฟล์ที่ /etc/hosts ก่อน (ระบบปฏิบัติการ Mac OS) เพื่อที่จะทำให้เครื่องเรารู้จัก Domain ที่จะจำลองขึ้นมา โดยทำตามนี้เลยครับ
- vi /etc/hosts
ให้เพิ่ม site1.com และ site2.com เข้าไปตามรูปด้านล่างเลยครับ
แค่เท่านี้เราก็จะได้โดเมน site1.com และ site2.com มาเรียบร้อยแล้วครับ
ทำการ Config Nginx
เอาล่ะครับ ได้เวลามาทำการ Config Nginx กันแล้ว ก่อนอื่น Clone repo ที่ผมเตรียมไว้ให้แล้วมาได้เลยครับ https://github.com/guitarlnw/nginx-letsencrypt.git ซึ่ง Image ที่เราจะใช้รัน Container จะมีอยู่ 3 ตัวคือ
- jwilder/nginx-proxy ใช้สำหรับรัน NginX
- nginx ใช้สำหรับรัน Config ของแต่ละ Site
- jrcs/letsencrypt-nginx-proxy-companion ใช้สำหรับ Register key สำหรับการทำ SSL จาก Letsencrypt ซึ่งเป็นบริการฟรี
ลองรันเลยดีกว่าจะได้เห็นภาพครับ เข้าไปใน Root folder แล้วรันคำสั่งตามนี้เลยครับ
- docker-compose.yml
เมื่อรันแล้วก็ลองเข้า Web browser แล้วพิมพ์ site1.com จะได้ผลลัพธ์แบบนี้ครับ
ถ้าได้แบบนี้แสดงว่า NginX ทำงานแล้วครับ แต่ยังไม่สามารถเข้า Url site1.com ได้ เพราะว่าเรายังไม่ได้รัน Config ของ Site นี้ครับ ต่อมาจะทำการรัน Container ตัว Config NginX ของ site1.com โดยทำตาม Step ด้านล่างเลยครับ
- cd /website/site1.com
- docker-compose up
เมื่อได้แล้วลองเข้า http://site1.com อีกครั้งครับ
จะเห็นว่าเราสามารถเข้าเว็บได้จาก http://site1.com แล้ว อย่างนั้นขออธิบายเพิ่มเติมซักหน่อยละกันครับ
- ไฟล์ root/docker-compose.yml จะเป็นตัวรัน NginX
- ไฟล์ root/website/site1.com/site1.conf จะเป็น config สำหรับ site1.com โดยสังเกตุจาก proxy_pass จะเป็นตัวส่งไปที่ Container ชื่อ website:3000 ซึ่งก็คือเว็บไซต์ที่เราได้รันไปก่อนหน้านี้นั่นเองครับ
- ไฟล์ root/website/site1.com/docker-compose.yml จะมีการ Map Volumes ของไฟล์ site1.conf ไปไว้ในโฟลเดอร์ /etc/nginx/conf.d ของ Container
เมื่อได้เว็บแล้วมาลองทำ SSL ฟรีๆ จาก Letsencrypt กันดีกว่า
Config Letsencrypt สำหรับ SSL ฟรี
เมื่อได้เว็บไซต์แล้วหากจะให้สมบูรณ์แบบ เว็บของเราจะต้องปลอดภัยด้วยนะครับ ซึ่งเราจะต้องมี Key สำหรับเข้ารหัสการส่งข้อมูลเพื่อความปลอดภัยครับ
ก็จะมีทั้งฟรีและก็แบบเสียตังครับ แต่สำหรับคนงบน้อยหรือเว็บไซต์ทั่วไปเขาก็มีบริการฟรีให้เราใช้ครับ (ผู้ใหญ่ใจดี อิอิ) ซึ่งบริการที่เราจะนำมาใช้คือ Letsencrypt ครับ รายละเอียดเพิ่มเติมอ่านได้จากเว็บไซต์ได้เลยครับ https://letsencrypt.org/
โดยบริการเขามี Policy อยู่ว่า
- จะต้อง Register ด้วย Email เพื่อขอ Key
- Key จะมีอายุการใช้งานได้ 90 วันเท่านั้น ซึ่งถ้าหมดอายุ เราจะต้องไป Register ขอ Key ใหม่
แต่อย่างไรก็ตามครับ เราจะใช้ Image jrcs/letsencrypt-nginx-proxy-companion เป็นตัวรัน Config ของ SSL ซึ่งความเทพของ Image ตัวนี้มีอะไรบ้าง มาดูกันครับ
- ทำการ Register เพื่อขอ Key ให้เราแบบอัตโนมัติ
- ตรวจสอบทุก 60 นาที ว่า Key ที่ใช้จะหมดอายุเมื่อไหร่ ถ้าหาก Key จะหมดอายุอีก 1 เดือน เจ้าตัว Container จะทำการ Register Key ใหม่ให้อัตโนมัติ
เอาล่ะครับ เข้าสู่ช่วงสุดท้ายแล้วครับ !! ลองเอาคอมเม้นที่โค้ด /root/docker-compose.yml ออก ตัวอย่างรูปข้างล่าง แล้วลองรัน Container ใหม่ดูครับ
เมื่อรันแล้วจะได้ Folder ชื่อว่า certs มาครับ คือใช้สำหรับเก็บ key ที่ได้จาก Letsencrypt
สังเกตุจะมีไฟล์ Key ต่างๆ อยู่ ซึ่ง Key พวกนี้แหละครับที่จะใช้ในการเข้ารหัสในการรับส่งข้อมูล เมื่อได้ตามนี้แล้ว เว็บไซต์ของเราควรจะเป็น แบบ https แล้ว
แต่ตอนนี้เรารันอยู่ใน Local จะไม่สามารถเข้า https ได้ครับ แต่ในตอนนี้ก็เสร็จหมดทุกขั้นตอนแล้วครับ ถ้าหากไปทำใน Server จริงๆ เว็บจะ Redirect ไปที่ Port 443 หรือว่า https ให้อัตโนมัติครับ
มาถึงจุดนี้แล้วคงจะปวดหัวน่าดูกับการ Config Server กันพอสมควรนะครับ แต่อย่างไรก็ตามถ้าหากไม่ใช้ Docker ผมรับรองเลยครับว่าจะยิ่งปวดหัวมากกว่านี้หลายเท่าครับ อิอิ ยังไงก็หวังว่าบทความนี้จะมีประโยชน์ไม่มากก็น้อยนะครับ