준비물 : 도메인 발급
nginx 컨테이너 443포트 열기
docker-compose를 실행하여 nginx와 certbot을 사용하여 https 로 사용하게 한다.
3trolls.me의 80 포트로 접근 할 때 443 https로 리다이렉트로 시켜준다.
golang 서버(was)에 로직처리, 동적컨텐츠를 요청하고 리턴 받는다.
podman compose 도 가능!
sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
version: '3'
services:
nginx:
container_name: nginx
image: nginx:latest
restart: unless-stopped
ports:
- 80:80
- 443:443
volumes:
- ./data/nginx/conf.d:/etc/nginx/conf.d //conf.d안에 ???.conf파일 설정을 nginx에 마운트시켜야함
//이 부분에 대한 자세한 설명은 conf파일 설명에서 대신한다.
- ./data/certbot/conf:/etc/letsencrypt //ssl 부분 certbot과 같은 폴더를 공유해야함
- ./data/certbot/www:/var/www/certbot //위와 같음
- ./git/cube/cube/dist:/usr/share/nginx/html //vue build 파일을 넣어줘야하는 부분이다.
//이 볼륨을 처음에 어떻게 설정하는지 몰라서 당황했다
//[host폴더]:[docker nginx에 마운트되야하는폴더]
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
restart: unless-stopped
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
~
재발급이 가능하도록 command 추가
인증서 만료가 될 때쯤 자동으로 다시 SSL인증서를 다시 발급하도록 nginx, certbot
컨테이너에 커맨드를 추가
nginx:
...
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
...
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
data/nginx/conf.d/app.conf
이부분이 실질적으로 nginx가 웹서버로써 기능하는 코드이다.
먼저 server 80 포트로 3trolls.me로 들어오면 443으로 보냄
server {
listen 80;
server_name 3trolls.me;
server_tokens off;
location /.well-known/acme-challenge/ { //이것을 통해 인증 ssl
allow all;
root /var/www/certbot; //파일에 인증서 갱신및 저장
}
location / {
return 301 https://$host$request_uri;
//301 redirect는 영구적(Permanent)으로 옮겼을때 사용하고 302 redirect는 일시적(Temporary)으로 옮겼을때 사용
}
}
server {
listen 443 ssl;
server_name 3trolls.me;
server_tokens off;
ssl_certificate /etc/letsencrypt/live/3trolls.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/3trolls.me/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api {
proxy_pass http://forwizlab.com:38071;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
}
[.init-letsencrypt.sh](https://github.com/wmnnd/nginx-certbot/blob/master/init-letsencrypt.sh) 위의
SSL재발급 자동화가 완성된다. 그렇지만 재발급을 하기 위해서는 첫번째 발급을 해야 하는데, 현재 nginx
폴더에 SSL 관련 정보가 있기 때문에 nginx
를 돌리기 위해서는 SSL 인증서가 필요하다. 따라서 이걸 위해서 더미 인증서를 발급받아 nginx
를 구동하고, 더미 인증서를 삭제하고 SSL인증서를 발급 받을 것이다. 이 과정을 자동화 한 쉘 스크립트가 [.init-letsencrypt.sh](https://github.com/wmnnd/nginx-certbot/blob/master/init-letsencrypt.sh)
이다.
curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh