Reverse proxy ແລະ Let’s Encrypt ດ້ວຍ docker

xangnam phiasakha
VtCamp
Published in
3 min readMay 20, 2018

ໃນການເຮັດເວັບ ໂດຍສະເພາະເວັບທີ່ຕ້ອງຮັບຂໍ້ມູນທີ່ເປັນຄວາມລັບຈາກຜູ້ໃຊ້ເຮົາຕ້ອງເຮັດໃຫ້ໝັ້ນໃຈໄດ້ວ່າຂໍ້ມູນນັ້ນຈະບໍ່ຖືກປ່ຽນແປງຫຼືມີມືທີສາມໃຊ້ວິທີໃດໜຶ່ງດັກເບິ່ງຂໍ້ມູນທີ່ເປັນຄວາມລັບນັ້ນໄດ້. ຈຶ່ງຕ້ອງມີຄວາມຈຳປັນຕ້ອງມີການ ເຂົ້າລະຫັດຂໍ້ມູນລະຫວ່າງການແລກປ່ຽນຂໍ້ມູນລະຫວ່າງ server ແລະ client ນອກຈາກນີ້ກໍ່ບໍ່ມີຫຍັງຫຼາຍນອກຈາກຢາກມີເວັບທີ່ເປັນ https ເບິ່ງແລ້ວມັນເທ້ຊັນນາ (ຫະຫະຫະຫະ ^O^). ບໍ່ຕ້ອງຄິດໃຫ້ມັນຫຼາຍເອົາເປັນວ່າມື້ນີຈະມາສະແດງໃຫ້ເຫັນການເຮັດເວັບທີ່ມີຄວາມຈຳເປັນຕ້ອງເຮັດ reverse proxy ແລະ encrypt ຂໍ້ມູນ ດ້ວຍວິທີງ່າຍໆ ອອກແຮງມືກົດ keyboard ໜ້ອຍດຽວໂດຍການໃຊ້ docker ເຈົ້າເກົ່າເຮົານິເອງ

Reverse proxy ດ້ວຍ Nginx

ຫຼາຍຄົນທີ່ພັດທະນາເວັບ app ທີ່ໃຊ້ framework ທີ່ຈະມີການ run ຜ່ານ port ໃດໜຶ່ງແລ້ວຖ້າເຮົາຕ້ອງເອົາໄປ run ໃຊ້ຈິງຢູ່ server ຈະຕ້ອງມີການເຮັດ reverse proxy. ເຮົາຄົງບໍ່ຢາກໃຫ້ຜູ້ໃຊ້ເຂົ້າເວັບເຮົາແລ້ວຕ້ອງມາພິມ port ອີກແມ່ນບໍ່ຫລ່ະ. ດັ່ງນັ້ນຈຶ່ງຈຳເປັນຕ້ອງເຮັດ reverse proxy ໂດຍໃນທີ່ນີ້ຈະໃຊ້ Nginx ເປັນໂຕ reverse ແລະເວັບທີ່ໃຊ້ທົດລອງແມ່ນເວັບທີ່ພັດທະນາດ້ວຍ nodejs ແລະ expressjs ໂດຍການ run ຜ່ານ port 3000. ແລະທີ່ຂາດບໍ່ໄດ້ແມ່ນເຮົາຈະ run ມັນດ້ວຍ docker.

ສັ່ງຕິດຕັ້ງແລະ run image jwilder/nginx-proxy

$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy

ຫຼັງຈາກນັ້ນກໍ່ຖ້າໃຫ້ docker download image ໃຫ້ສຳເລັດ. ເມຶ່ອສຳເລັດແລ້ວເຮົາກໍ່ສາມາດໃຊ້ງານ nginx revers proxy ໄດ້ທັນທີທັນໃດ.
ຕໍ່ມາ ເປັນການ run application ຂອງເຮົາເຊິ່ງ application ເຮົານີ້ສ້າງດ້ວຍ nodejs ສະນັ້ນຕ້ອງໄປ run nodejs image ກ່ອນ. ຫຼືບໍ່ກໍ່
run application ເຮົາດ້ວຍ image ນັ້ນເລີຍເພາະ docker ຈະໄປ download ໃຫ້ເຮົາທີ່ Docker Hub ແບບອັດຕະໂນມັດ. ຕົວຢ່າງເຊັ່ນວ່າ:

$ docker run -d \
--name Testapp \
--restart="always" \
-e VIRTUAL_HOST=example.com,www.example.com \
-v "$PWD":/usr/src/app \
-w=/usr/src/app \
--expose=3000 \
node:5 node ./bin/www

ສຳລັບຄຳສັ່ງຂ້າງເທິງນັ້ນແມ່ນຢ່າໄດ້ລືມໃສ່ VIRTUAL_HOST Environment ແລະ --expose port ເດັດຂາດບໍ່ດັ່ງນັ້ນ jwilder/nginx-proxy ຈະບໍ່ສາມາດ bind host ຂອງເຮົາເຂົ້າກັບ
nginx ເພຶ່ອທຳການ reverse proxy ໄດ້. ແລະຕ້ອງລະບຸ port ທີ່ application ຂອງເຮົາໃຊ້ run ອີກດ້ວຍບໍ່ດັ່ງນັ້ນມັນຈະບໍ່ຖືກໃຊ້ໃນ docker.sock file ແລ້ວ jwilder/nginx-proxy
ກໍ່ບໍ່ສາມາດອ່ານຄ່າ VIRTUAL_HOST ແລະນຳໄປ bind ເຂົ້າກັບ nginx ໄດ້. ແລ້ວກໍ່ທຳການທົດສອບເຂົ້າໄປທີ່ url example.com ຫຼື www.example.com ຖ້າບໍ່ມີຫຍັງທີ່ຜິດພາດກໍ່ຈະປະກົດເວັບຂອງເຮົາຂຶ້ນມາ (ຜິດພາດແລ້ວຈົ່ງແກ້ເອງ ຫະຫະຫະຫະ ^^ ).

https ດ້ວຍ Let’s Encrypt ໃນ docker

ໃນການເຮັດໃຫ້ web ຂອງເຮົາສື່ສານດ້ວຍ http over SSL/TLS ຫຼື https
ນັ້ນເຮົາຕ້ອງໄດ້ໄປສະຫມັັກ CA ທີ່ສາມາດເຊື່ອຖືໄດ້ເຊັ່ນ: Comodo,Symantec,GoDaddy,GlobalSign ແລະອື່ນໆ. ແຕ່ວ່າ CA ພວກນີ້ຕ້ອງໄດ້ເສຍຄ່າໃຊ້ຈ່າຍສູງພໍສົມຄວນ. ແລະແລ້ວກໍ່ມີກຸ່ມຄົນຜູ້ໃຈດີທີ່ຫວັງຜົນທາງດ້ານການສຶກສາຫຼາຍກວ່າກຳໄລຂຶ້ນ ໂດຍໄດ້ສ້າງ CA ທີ່ໃຫ້ເຮົາໃຊ້ໄດ້ free ບໍ່ມີຄ່າໃຊ້ຈ່າຍໃດໆ ນາມນັ້ນຄື Let's Encrypt.ແລະເຮົາຈະ run web application ທີ່ເຮົາ run ກ່ອນໜ້າໃຫ້ສາມາດໃຊ້ https ໄດ້ແບບງ່າຍໆໂດຍໃຊ້ docker.

ທຳການ stop web application ແລະ nginx-proxy image ທີ່ເຮົາ run ກ່ອນຫນ້ານີ້ເສຍກ່ອນ ດ້ວຍ command

$ docker rm -f  "your docker name"

ຈາກນັ້ນ run ມັນດ້ວຍ command ແບບໃໝ່

  • nginx-proxy
$ docker run -d -p 80:80 -p 443:443 \
--name xang-nginx \
-v /path/to/certs:/etc/nginx/certs:ro \
-v /etc/nginx/vhost.d \
-v /usr/share/nginx/html \
-v /var/run/docker.sock:/tmp/docker.sock:ro \
jwilder/nginx-proxy
  • Let’s Encrypt
$ docker run -d \
-v /path/to/certs:/etc/nginx/certs:rw \
--volumes-from xang-nginx \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
jrcs/letsencrypt-nginx-proxy-companion
  • web application for test https
$ docker run -d \
--name Testapp \
--restart="always" \
-e VIRTUAL_HOST=examble.com,www.examble.com \
-e LETSENCRYPT_HOST=examble.com,www.examble.com \
-e LETSENCRYPT_EMAIL=``youremail@gmail.com`` \
-v "$PWD":/usr/src/app \ #ບ່ອນຢູ່ຂອງ web app
-w=/usr/src/app \
--expose=3000 \
node:5 node ./bin/www

ຈາກຂ້າງເທິງຈະສັງເກດຄວາມປ່ຽນແປງຂອງ command ໂດຍສະເພາະ web application ແລະ nginx-proxy image ນອກນັ້ນກໍ່ມີການ run image jrcs/letsencrypt-nginx-proxy-companion
ທີ່ໃຊ້ສ້າງ https ໃຫ້ກັບ web application ຂອງພວກເຮົາ ເຊິ່ງໃນການ
run web application ນັ້ນຕ້ອງລະບຸ ENV ເພີ່ມເຂົ້າໄປນັ້ນຄື
LETSENCRYPT_HOST ແລະ LETSENCRYPT_EMAIL ເພື່ອທຳການ register CA ຂອງ Let's Encrypt ໃຫ້ກັບ domain name ຂອງເຮົາແບບທີ່ເຮົາບໍ່ຕ້ອງໄປ config nginx ໃຫ້ເມື່ອຍເລີຍ.

ຖ້າຫາກຕ້ອງການ run ອີກເວັບທີ່ຕ້ອງການໃຊ້ https ກໍ່ສາມາດ run ໄດ້ໃນຮູບແບບຄ້າຍໆກັນ. ນັ້ນກໍ່ຄື ຢ່າໄດ້ລືມ ENV ທີ່ໄດ້ກ່າວໄວ້ຂ້າງເທິງແລ້ວ ສຳລັບຂໍ້ມູນເພີ່ມເຕີມສາມາດໄປຫາໄດ້ທີ່ jrcs/letsencrypt-nginx-proxy-companion ແລະ nginx-proxy .
ພໍ run ທັງສາມ image ສຳເລັດແລ້ວ (note: ຕ້ອງ run ໄປຕາມລຳດັບດ້ວຍເດີ!!). ເຮົາກໍ່ໜ້າຈະໄດ້ https ໃຫ້ກັບ web ຂອງເຮົາເປັນທີ່ຮຽບຮ້ອຍແລ້ວ. ງ່າຍບໍ່ຫລ່ະ (ຫະຫະຫະ).

ສະຫຼຸບ

ມັນເປັນການງ່າຍຈົນບໍ່ຮູ້ສິເວົ້າຫຍັງເລີຍໃນການເຮັດ https ໂດຍການ run ພຽງ 3 ຄຳສັ່ງເທົ່ານັ້ນກໍ່ໄດ້ແລ້ວ.ນິລະຄືຄວາມສາມາດຂອງ docker.
ແຕ່ວ່າ ມັນງ່າຍແບບນິກໍ່ຢ່າໄດ້ໄປລືບວິທີ config ໃຊ້ https ໃດຫລ່ະ
ຮູ້ເອົາໄວ້ກໍ່ເປັນການດີ. ຄວາມຮູ້ສູງສຸດ ຄືຄວາມຮູ້ພື້ນຖານ

--

--