ระหว่างหา server สักที่เอาไว้ใช้ deploy Node service และรองรับ https
เบาๆ แบบที่เราแทบไม่ต้องลงไม้ลงมือทำอะไรมาก ก็ไปเจอ Amazon Lightsail หลังจากเข้าไปลองเล่นดูสักพักก็พบว่ามันน่าตื่นตาตื่นใจ เพราะเราแทบไม่ต้องออกแรงอะไรมากก็ใช้ได้เลยทันที!
สร้าง Instance
หลังจากเรา login เข้าไปแล้วกด Create Instance เลือก Linux/Unix, Node.js และเลือกตั้งค่าอื่นๆ ตามใจชอบไปเรื่อยๆ จนจบ เราก็จะได้ Instance ที่พร้อมใช้งานแล้ว
กดเลือก instance ที่พึ่งสร้างเสร็จเข้าไป แล้วกดปุ่ม Connect Using SSH เราก็จะได้หน้า Terminal ที่ login เสร็จพร้อมใช้ผ่านเว็บได้เลย โดยเราจะ login มาใน user ชื่อ bitnami
ลองรัน node service
ติดตั้งอาวุธกันก่อน
sudo npm -g install express
sudo npm -g install express-generator
ลองสร้างโปรเจ็คง่ายๆ
express sample-api --view-ejs
cd sample-api
npm install
ถ้าเรารันโปรเจ็คมันจะไปรันที่ port :3000
Bitnami ได้เตรียม Virtual Host ไว้ให้เราแล้ว ให้เราเข้าไป Enable ก่อนโดยการเอา .disabled
ออกไปแบบเซฟๆ ด้วยการ duplicate มันเป็นไฟล์ใหม่ที่ไม่มี .disabled
ต่อท้าย และ restart Apache หนึ่งครั้ง ดังนี้
sudo cp /opt/bitnami/apache/conf/vhosts/sample-http-vhost.conf.disabled /opt/bitnami/apache/conf/vhosts/sample-http-vhost.conf
sudo cp /opt/bitnami/apache/conf/vhosts/sample-https-vhost.conf.disabled /opt/bitnami/apache/conf/vhosts/sample-https-vhost.conf
sudo /opt/bitnami/ctlscript.sh restart apache
จากนั้นเข้าไปแก้ไฟล์ /opt/bitnami/apache/conf/vhosts/myapp-http-vhost.conf
ดังนี้
<VirtualHost _default_:80>
ServerAlias *
DocumentRoot "/opt/bitnami/projects/myapp/public"
<Directory "/opt/bitnami/projects/myapp/public">
Require all granted
</Directory>
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
</VirtualHost>
และแก้ไฟล์ /opt/bitnami/apache/conf/vhosts/sample-https-vhost.conf
ดังนี้
<VirtualHost 127.0.0.1:443 _default_:443>
ServerAlias *
SSLEngine on
SSLCertificateFile "/opt/bitnami/apache/conf/api.khomkrit.com.crt"
SSLCertificateKeyFile "/opt/bitnami/apache/conf/api.khomkrit.com.key"
DocumentRoot /opt/bitnami/projects/sample
# BEGIN: Configuration for letsencrypt
Include "/opt/bitnami/apps/letsencrypt/conf/httpd-prefix.conf"
# END: Configuration for letsencrypt
# BEGIN: Support domain renewal when using mod_proxy without Location
<IfModule mod_proxy.c>
ProxyPass /.well-known !
</IfModule>
# END: Support domain renewal when using mod_proxy without Location
<Directory "/opt/bitnami/projects/sample">
Options -Indexes +FollowSymLinks -MultiViews
AllowOverride All
Require all granted
</Directory>
ProxyPass / http://localhost:3000/
ProxyPassReverse / http://localhost:3000/
# BEGIN: Support domain renewal when using mod_proxy within Location
<Location /.well-known>
<IfModule mod_proxy.c>
ProxyPass !
</IfModule>
</Location>
# END: Support domain renewal when using mod_proxy within Location
</VirtualHost>
ต่อด้วย restart Apache
sudo /opt/bitnami/ctlscript.sh restart apache
รันโปรเจ็ค
DEBUG=sample-api:* npm start
และลอง browse ไปที่ public IP ของ instance เราก็จะเห็นหน้า page ของโปรเจ็คแล้ว และดูที่ console ก็พบว่าทุกอย่างดูเวิร์คดี
> sample-api@0.0.0 start /home/bitnami/sample-api
> node ./bin/www
sample-api:server Listening on port 3000 +0ms
GET / 200 174.294 ms - 170
GET /stylesheets/style.css 200 3.612 ms - 111
GET /stylesheets/style.css 200 0.549 ms - 111
GET /favicon.ico 404 12.171 ms - 1062
ทำให้รองรับ HTTPS แบบอัตโนมัติ
เราจะใช้ใบรับรองจาก Let’s Encrypt แต่ก่อนอื่น เราต้อง map domain name ให้ชี้มายัง instance ของเราก่อน กรณีนี้ผมใช้ api.khomkrit.com
ให้รันคำสั่งนี้ แล้วทำตามขั้นตอนไปเรื่อยๆ จนจบ
sudo /opt/bitnami/bncert-tool
จบ
จบแล้วครับ เนื้อหาหลังจากนี้ไม่ต้องทำ ผมแค่ต้องการแชร์วิธีการขอใบรับรองโดยใช้ certbot
TIP
เราสามารถรัน service ผ่าน forever
ได้ เช่น
forever start bin/www
ทำให้รองรับ HTTPS แบบต้องออกแรงเอง
เหมือนเดิมครับ เราจะใช้ใบรับรองจาก Let’s Encrypt แต่ก่อนอื่น เราต้อง map domain name ให้ชี้มายัง instance ของเราก่อน กรณีนี้ผมใช้ api.khomkrit.com
จากนั้นติดตั้ง certbot
และใช้ certbot
ขอใบรับรอง ระหว่างนั้นก็ทำตามที่มันถามไปเรื่อยๆ จนมาถึงขึ้นตอนที่ให้เรากรอก domain name ก็ให้กรอกไป กรณีนี้ของผมก็จะเป็น api.khomkrit.com
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
certbot certonly --manual
.
.
.
Please enter in your domain name(s) (comma and/or space separated) (Enter 'c'
to cancel):
จากนั้น certbot
จะช่วยสร้างใบรับรองให้เรา รอสักพัก รอสักพักเราจะได้ <รหัสที่เป็นความลับ> และ <ชื่อไฟล์ที่เป็นความลับ> มาดังที่แสดงให้ดูด้านล่าง ถึงตรงนี้ ให้เปิด Terminal ทิ้งไว้แบบนี้ไปก่อน
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Create a file containing just this data:
<รหัสที่เป็นความลับ>
And make it available on your web server at this URL:
http://api.khomkrit.com/.well-known/acme-challenge/<ชื่อไฟล์ที่เป็นความลับ>
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
เปิด public/
directory ใน node application แล้ววางไฟล์นี้ลงไป public/.well-known/acme-challenge/<ชื่อไฟล์ที่เป็นความลับ>
โดยเนื้อหาในไฟล์นั้นก็คือ <รหัสที่เป็นความลับ> ที่เราได้มา
เสร็จแล้วกลับมาที่ Terminal แล้วกด Enter ได้เลย
จากนั้นเข้าไปแก้ไขไฟล์ /opt/bitnami/apache2/conf/bitnami/bitnami-apps-prefix.conf
ให้อ้างถึง key ที่เราได้จาก Let’s Encrypt
SSLEngine on
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
SSLCertificateFile /etc/letsencrypt/live/api.khomkrit.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/api.khomkrit.com/privkey.pem
จากนั้นลองเรียกเว็บของเราด้วย https
ก็จะได้แล้ว
ถ้าเราต้องการบังคับให้ forward http
request ไป https
เสมอก็เข้าไปแก้ไฟล์ /opt/bitnami/apache2/conf/httpd.conf
โดยเพิ่ม config นี้ลงไป
<VirtualHost *:80>
ServerName api.khomkrit.com
Redirect permanent / https://api.khomkrit.com/
</VirtualHost>
สรุปขั้นตอน
- สร้าง instance ใน Lightsail โดยการคลิ๊กแค่ไม่กี่ครั้ง
- เอา node project ไปวางไว้ในที่ที่ต้องการ จากนั้นก็รัน
- แก้ Proxy ให้ชี้มายัง node service
- map domain name ให้ชี้มายัง instance แล้วรัน
/opt/bitnami/bncert-tool
Reference
- Start or Stop Services
- Create A Custom Node.js Application
- Auto-Configure A Let’s Encrypt Certificate
- Start Express