Setup SSL โดยใช้ LetsEncrypt , docker , nginx
***สิ่งที่จำเป็นในการ 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