서버는 ubuntu 20.X 로 NginX사용 중
서버 최신 상태로 하고 letsencrypt 설치
certbot nginx 플러그인 설치
sudo apt-get update -y
sudo apt-get dist-upgrade -y
sudo apt-get install letsencrypt -y
sudo apt install certbot python3-certbot-nginx
80,443 포트 열기
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
standalone 방식의 단점은 진행하는 동안 nginx를 종료해야 함
장점은 간결하며 빠르고 안정성이 높다고 함.
테스트 서버이니 standalone 방식으로 진행
standalone 옵션 적용 SSL 인증서 발급을 위해서 nginx 종료
sudo service nginx stop
적용할 도메인을 ,구분으로 전부 등록 해봄
sudo certbot certonly --standalone -d dittybox.net,api.dittybox.net,room.dittybox.net,blog.dittybox.net,webtoon.dittybox.net,bpms.dittybox.net,mes.dittybox.net,emo.dittybox.net
위 방법 말고 아래도 가능
sudo certbot --nginx -d dittybox.net -d api.dittybox.net
도메인 관리자의 메일을 입력
이용원칙과 인증기관 등록에 관한 동의 A입력 후 엔터
3자 정보 동의 원치 않으니 N
잰장 글이 사라졌다....
위처럼 하면 ssl 파일이 생성된다.
위치는 /etc/letsencrypt/live/ 에 저장이 된다.
이제 nginx에 적용하기 위해 우선
openssl을 사용하여 dhparam을 암호화 하자
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
2048 비트로 해도 되지만 좋은게 좋은것 13분 걸림
ssl.conf를 생성하자
sudo touch /etc/nginx/snippets/ssl.conf
sudo chmod 777 /etc/nginx/snippets/ssl.conf
vim으로 내용을 입력 하자
sudo vim /etc/nginx/snippets/ssl.conf
ssl_session_timeout 1440m;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "sameorigin";
ssl_ciphers에 오타가 있어서 사용하는 프로토콜 어쩌구 에러때문에 좀 고생을 하였다..
다 입력 하고 저장 후 권한 변경
sudo chmod 644 /etc/nginx/snippets/ssl.conf
nginx에 적용 한다. 이부분 정리 한것도 날라가서 스샷으로 대처... ㅜㅜ
nginx 설정 파일 확인 후 재시작
sudo nginx -t
sudo service nginx start
재시작 이후에 가능한 에러가 80번포트나 443 포트가 이미 사용중이라고 에러가 나온다면 종료 시키자.
기존 프로세스 확인
lsof -i tcp:80 // 또는 443
kill -9 프로세스아이디
혹은
sudo fuser -k 80/tcp
sudo fuser -k 443/tcp
ssl 테스트
www.ssllabs.com/ssltest/index.html
A+ 받고 브라우저 테스트 종료~
나같은 경우는 폰으로 접속 테스트를 할때 프로토콜 오류가 났다.
맨붕으로 이리 저리 뒤지다가 결론은 ssl.conf 파일에서
ssl_ciphers 내용에 오타가 있었다.
추가 아래는 제로초님의 블로그 내용
http {
server {
server_name nodebird.com www.nodebird.com;
return 301 https://nodebird.com$request_uri;
}
server {
server_name vue.nodebird.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name nodebird.com;
ssl_certificate /etc/letsencrypt/live/nodebird.com-0002/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/nodebird.com-0002/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://127.0.0.1:3060;
proxy_redirect off;
}
}
server {
listen 443 ssl;
server_name vue.nodebird.com;
ssl_certificate /etc/letsencrypt/live/nodebird.com-0002/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/nodebird.com-0002/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://127.0.0.1:3081;
proxy_redirect off;
}
}
}
proxy_set_header 부분은 Header들을 넘겨주는 코드입니다. X-Forwarded-Proto는 https를 할 때 필요하고, Upgrade나 Connection은 웹소켓을 할 때 필요합니다. X-Real-IP와 X-Forwarded-For는 IP를 알아내고 싶을 때 있으면 좋습니다.
다음은 nginx 관련 명령어인데 참고해주세요. /etc/nginx/nginx.conf가 바뀔 때마다 재시작이 필요합니다. 시작이나 재시작 시 에러가 있다면 보통 문법 에러인 경우가 많습니다. status로 확인 가능합니다.
// 시작
$ sudo service nginx start
$ sudo systemctl start nginx
$ sudo /etc/init.d/nginx start
// 재시작
$ sudo service nginx restart
$ sudo systemctl restart nginx
$ sudo /etc/init.d/nginx restart
// 중지
$ sudo service nginx stop
$ sudo systemctl stop nginx
$ sudo /etc/init.d/nginx stop
// 상태
$ sudo service nginx status
$ sudo systemctl status nginx
// 설정 reload
$ sudo service nginx reload
$ sudo systemctl reload nginx
$ sudo nginx -s reload
// 설정파일 문법 체크
$ sudo nginx -t
자동 갱신하기
cron을 사용하여 자동갱신 하면 쉽습니다.
/etc/cron.d/certbot 파일을 다음과 같이 수정합니다. 파일이 없다면 생성합니다(vim으로)
매일 두번씩 자동으로 갱신함
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 */12 * * * root certbot -q renew --nginx --renew-hook 'service nginx reload'
'Learning > nginx' 카테고리의 다른 글
Nginx + Docker image(NestJS) 502 Error (0) | 2021.01.16 |
---|---|
nginx 업로드 용량 (0) | 2021.01.15 |
ubuntu 서버에 Nginx 설치 (0) | 2020.12.13 |
nginx 에서 오류 확인 방법 (0) | 2020.12.12 |