Setup SSL โดยใช้ LetsEncrypt , docker , nginx

Thanaroj chareonphuthiwat
3 min readApr 4, 2019

--

***สิ่งที่จำเป็นในการ Setting

  • server ต้องเป็น Public IP
  • ต้องมี Domain name

เรามาเริ่ม Setup กันเลยครับ

1.install sudo

apt-get install sudo

2. ตั้งค่า DNS Domain Name หรือ Sub domain ชี้ไปยัง Server ที่ต้องการ Setup SSL

3. SSH Remote ไปที่ Server

ssh root@ipaddress

cd /

4. ติดตั้ง Program certbot เพื่อทำการ Gen SSL

nano /etc/apt/sources.list.d/sources.list

จะได้หน้าจอตามรูป

จากนั้นให้ Copy บรรทัดด้านล่างไปใส่ เพื่อดาวน์โหลด stretch-backports และ Save file โดยกด clr+x

deb http://deb.debian.org/debian stretch-backports main

จากนั้นให้พิมพ์คำสั่งแต่ละขั้นตอนดังนี้

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install certbot python-certbot-nginx -t stretch-backports

***ตอนนี้ถือว่าติดตั้ง Cerbot เสร็จแล้วเรียบร้อยครับ

5. Gen key โดยใช้ Certbot

#กรณีที่เป็น WILDCARD ใช้คำสั่งตามนี้

sudo certbot — email your-email@gmail.com -d *.yourdomianname.com — manual — preferred-challenges dns-01 certonly

#กรณีที่เป็น Sub Domain

sudo certbot --nginx --email your-email@gmail.com --domain yoursubdomain.yourdomain.com

6. Config Cert กับ Docker SSL

6.1 SSH Remote ไปที่ Server

ssh root@ipaddress

cd /

cd opt

6.2 # สร้างโฟลเดอร์ ภายใต้ /opt

mkdir nginx

cd nginx

mkdir appconfig config logs sslcert

6.3 Copy Cert ที่ได้ไปที่ Path ที่เราสร้างไว้ด้านบน

cp /etc/letsencrypt/live/{mydomain.com}/fullchain.pem /opt/nginx/sslcert/fullchain.pem

cp /etc/letsencrypt/live/{mydomain.com}/privkey.pem /opt/nginx/sslcert/privkey.pem

6.4 สร้างไฟล์เปล่าๆ Enter 2–3 บรรทัด

nano /opt/nginx/logs/logs.log

nano /opt/nginx/logs/error.log

nano /opt/nginx/logs/access.log

6.5 สร้างไฟล์ appconfig.conf และกำหนดค่า Server

nano appconfig/appconfig.conf

เริ่ม Copy code ไว้ใน file appconfig/appconfig.conf ดังนี้

#กรณีที่เป็น Domain name

upstream webapp {

ip_hash ;
server 201.xxx.xx.xx:8001 ;
server 201.xxx.xx.xx:8002 ;
}

server {
listen 80;
server_name your-domain.com;
return 301 https://$host$request_uri;
}

server {
client_max_body_size 100M;
listen 443 ssl;
server_name your-domain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

location / {
proxy_pass http://webapp;
}
}

#กรณีที่เป็น Sub Domain name

upstream webapp {

ip_hash ;
server 201.xxx.xx.xx:8001 ;
server 201.xxx.xx.xx:8002 ;
}

server {
listen 80;
server_name sub.your-domain.com;
return 301 https://$host$request_uri;
}

server {
client_max_body_size 100M;
listen 443 ssl;
server_name sub.your-domain.com;
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

location / {
proxy_pass http://webapp;
}
}

6.6 สร้างไฟล์ nginx.conf และกำหนดค่า nginx

nano config/nginx.conf

Copy code ไว้ใน file config/nginx.conf ดังนี้(ไม่ต้องแก้อะไร)

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {

include /etc/nginx/mime.types;

default_type application/octet-stream;

log_format main ‘$remote_addr -$remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘ “$http_user_agent” “$http_x_forwarded_for” ’;

access_log /var/log/nginx/access.log main;

sendfile on;

#tcp_nopush on;

keepalive_timeout 65;

#gzip on;

############################ CONFIG UPLOAD

client_max_body_size 100M;

include /etc/nginx/conf.d/*.conf;

}

6.7 สร้าง Docker WebApp อย่างน้อย 1 Docker Contrainer

เพื่อ ใช้ในการตั้งค่า และกำหนด port ตาม ข้อ 6.5 ตามตัวอย่าง(คำสั่งด้านล่างเป็นตัวอย่าง docker ของ php สามารถใช้เป็น Server ของอะไรก็ได้ เช่น Golang, Anagular)

docker run --name webapp01 -it -d -- privileged=true --restart=always -p 8001:80 -v /opt/www/:/var/www/html gjuniioor/php-sqlsrv:7.0 bash

หลังจากนั้น ให้เราลอง Config เพื่อให้ webapp01 เราสามารถรันทดสอบได้

2.8 สร้าง Docker Nginx

docker run --name nginx -it -d --privileged=true --restart=always -p 80:80 -p 443:443 -v /opt/nginx/config/nginx.conf:/etc/nginx/nginx.conf -v /opt/nginx/appconfig/:/etc/nginx/conf.d/ -v /opt/nginx/sslcert/:/etc/nginx/ssl/ -v /opt/nginx/logs/access.log:/var/log/nginx/access.log -v /opt/nginx/logs/error.log:/var/log/nginx/error.log nginx:1.15.10

หลังจากนั้นให้ Run คำสั่งตามนี้

docker restart nginx

docker ps

docker logs -f nginx

***กรณีที่ Port ถูกใช้งานอยู่ 443

apt-get install psmisc -y

sudo fuser -k 443/tcp

--

--

No responses yet