การใช้งาน NginX และ Free SSL Certificate ง่ายๆ ด้วย Docker

Chonlatit (Karn)
THiNKNET Engineering
3 min readOct 22, 2018

--

หลายคนอาจจะเคย 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
หน้าเว็บ http://localhost:3000

โค้ดใน repo นี้ก็ไม่มีอะไรมากครับเพียงแค่ให้เรารันเว็บไซต์ขึ้นมาหนึ่งเว็บเฉยๆ แต่อยากให้ลองสังเกตุไฟล์ docker-compose.yml ครับ คือสิ่งสำคัญในเรื่องนี้ โดยมีการกำหนดดังนี้

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 จะได้ผลลัพธ์แบบนี้ครับ

เข้า http://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

จะเห็นว่าเราสามารถเข้าเว็บได้จาก 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/site1.conf
  • ไฟล์ root/website/site1.com/docker-compose.yml จะมีการ Map Volumes ของไฟล์ site1.conf ไปไว้ในโฟลเดอร์ /etc/nginx/conf.d ของ Container
root/website/site1.com/docker-compose.yml

เมื่อได้เว็บแล้วมาลองทำ 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 ผมรับรองเลยครับว่าจะยิ่งปวดหัวมากกว่านี้หลายเท่าครับ อิอิ ยังไงก็หวังว่าบทความนี้จะมีประโยชน์ไม่มากก็น้อยนะครับ

--

--