Docker, Nginx, NodeJs, SSL #4

Kittinut Pramhan
3 min readMay 28, 2018

--

จาก Chapter 3 ผมได้สอนในการทำ SSL let’s encrypt ไปแล้ว นะครับในบทสุดท้ายนี้ผมจะสอนให้ทำเกี่ยวกับ Nodejs

โอเครครับงั้นเรามาเริ่มกันที่จรงไหนก่อนดีน้าา า า . . .

อัพเดทโครงสร้าง project ใน เครื่องเรากันก่อน โดยสร้าง Directory nodejs เพิ่ม

DockerProject
|- ngxin
|- www
|- docker-compose.yml
|- nodejs

เริ่มสร้างโปรเจค NodeJs ใน Directory nodejs กัน

$mkdir nodejs
$cd nodejs && npm init --y

และที่สำคัญอย่าลืมสร้าง .gitignore ใน root directory ด้วยนะ

//.gitignore
/node_modules/

และ เมื่อเราอยู่ใน nodejs directory ทำการลง package manager ชื่อว่า express

$npm install --save express

สร้างไฟร์ server.js ขึ้นมา

//server.js
const express = require( 'express' );
const app = express();
const Html = `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Nginx Proxy</title>
<style>
body{
text-align: center;
color: tomato;
}
</style>
</head>
<body>
<h1>Hello My nginx this is Awesome Website Right ?</h1>
<p>We will do SSL Letsencrypt Later </p>
<p>And now you are Proxy on nodejs ports 3000 </p>
<img src="https://goo.gl/cZzBcf" alt="">
</body>
</html>
`
app.use('/',(req,res)=>{
res.send(Html);
})
app.listen(3000,()=>{
console.log('server is listen on port 3000')
})

หลังจากนั้นลองทดสอบ ใน localhost ดูนะครับจะได้หน้าเเบบนี้

ผลรันใน localhost

จัดการ ​Docker-compose

version: '3.1'
services:
nginx:

image:
nginx:1.13.12-alpine
container_name: nginx
ports:
- "80:80"
- "443:443"
expose:
- 443
- 80
volumes:
- ./www/rabbitmansion.com:/usr/share/nginx/html
- ./nginx/:/etc/nginx/conf.d/
- ./letsencrypt/well-known:/www/letsencrypt
- ./dh-param/dhparam-2048.pem:/etc/ssl/certs/dhparam-2048.pem
- ./etc/letsencrypt/live/rabbitmansion.com/fullchain.pem:/etc/letsencrypt/live/rabbitmansion.com/fullchain.pem
- ./etc/letsencrypt/live/rabbitmansion.com/privkey.pem:/etc/letsencrypt/live/rabbitmansion.com/privkey.pem
- ./node/:/app/
depends_on:
- nodejsreact
nodejsreact:
image:
node:9.11.1-alpine
container_name: nodejsreact
environment:
NODE_ENV:
production
working_dir: /home/app/serversiderender
restart: always
volumes:
- ./node/serversiderender:/home/app/serversiderender

expose:
- 3000
ports:
- "3000:3000"
command: "npm start"

ทดสอบ docker nodejs บนเครื่องเรา expose คือการแสดงให้ serverเราเห็น ตรง port 3000 ด้วยกันเอง ตรงนี้ผมเคยถามในกลุ่มของ DockerThailand ลองไปหาดูกันนะครับ

$docker-compose up -d nodejs 
//ผลที่ได้จะ เป็น nodejs run ขึ้น เมื่อใช้คำสั้ง docker ps
$docker logs nodejs
server is listen on port 3000

โอเคครับตอนนี้เราทำการอัพขึ้น server ของเรากัน

$git pull
$cd nodejs && npm install //เข้าไปลง node_modules
$cd ..
$docker-compose up -d รันทั้งหมดขึ้นมา
$docker ps // เช็คว่า nodejs container ทำงานไหม

เอาหล่ะครับถ้าเสร็จเเล้วหน้าเว็ปที่ได้จะผ่านทาง http://kittinut.asia:3000/ จะเหมือนกับที่เรารันบน localhost เลย วิธีทำ reverse proxy ง่ายมาก เข้าไปแก้ default.conf จะได้ดังนี้

#https://www.kittinut.asia
.
.
.
location / {
#security headers
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "DENY" always;
#CSP
add_header Content-Security-Policy "frame-src 'self'; default-src 'self'; script-src 'self' 'unsafe-inline' https://maxcdn.bootstrapcdn.com https://ajax.googleapis.com; img-src 'self'; style-src 'self' https://maxcdn.bootstrapcdn.com; font-src 'self' data: https://maxcdn.bootstrapcdn.com; form-action 'self'; upgrade-insecure-requests;" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
proxy_pass http://nodejs:3000;
}
.
.
.

ทดสอบผลการทดลอง

docker-compose up -d 

สรุป

สำหรับ nodejs + nginx นั้นเราต้องทำการสร้าง container nodejs โดยจะเชื่อมผ่าน ไปยัง container nginx
depends_on:
— nodejs
ในไฟร์ dokcer-compose.yml
เราสามารถเพิ่ม expose เพื่อให้ เซิฟเวอร์เราสามารถติดต่อสื่อสารกันได้โดยตรง

expose ไว้เปิด port ให้ container อื่นๆ เห็นครับ
Kenanek Thongkam

เราสามารถใช้ proxy_pass http://<containername_nodejs>:port ได้เลยดังตัวอย่าง

container_name ของผมเป็น nodejs ก็สามารถที่จะ reverse proxy ผ่านได้โดยใช้
http://nodejs:3000 ได้เลยครับ
สำหรับตอนสุดท้ายนี้ก็อยากบอกว่า ผมใช้เวลาในการศึกษาตัวนี้ประมาณ สามวัน เพราะว่าเริ่มจาก 0 เลย เลยอยากจะเเชร์ให้เพื่อนได้รับรู้ครับ
สำหรับวันนี้ขอบคุณครับ

--

--