[AWS EC2] springboot + nginx 사용시 ssl, dns 설정
[AWS EC2] springboot + nginx 사용시 ssl, dns 설정
일단 나는 docker로 8080 포트를 사용하는 springboot 앱을 띄운상황. (참고로 springboot app은 내장 tomcat을 was로 사용하여 뜬다) 이때 웹서버를 nginx로 사용한다고 하면, dns 나 ssl을 연결할때 어떤 설정들을 해야할지 정리했다.
내가 사용한 OS는 AWS EC2 의 amazon linux 2 환경이다.
이 링크에서 설명하고있는 ssl 인증서 적용을 완료한 상태에서 진행된다. (안하신분들은 요걸 반드시 선행!)
EC2에서 nginx 설정하는방법은 굉장히 많은 블로그에서 설명하고있긴한데 설정값이 조금씩 다르고 환경도 조금씩 달라서 헤맸음.. 내 상황에서 성공한 설정값을 아래와 같이 정리해둔다.
1. /etc/nginx/nginx.conf
우선 amazon linux 2 의 nginx는 /etc/nginx/nginx.conf 파일을 설정파일로 잡고있다. 그러나 대체로 이 파일을 직접 건드리기보다는 sites-available , sites-enabled 폴더에 커스텀 설정파일을 작성해 넣고, nginx.conf에서는 해당 설정파일을 include 해서 사용하는듯하다.
sudo vim /etc/nginx/nginx.conf
로 nginx.conf를 수정해주는데, http 항목 밑에 include로/etc/nginx/sites-enabled/*;의 conf파일들을 인클루드한다는 스크립트만 넣어주자. (전문은 아니고 http 항목만 붙여넣기했음. include 부분만 추가해주면됨)
http {
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;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 4096;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*; # !!!!! 이부분을 넣어주세요!!!
server {
listen 80;
listen [::]:80;
server_name _;
root /usr/share/nginx/html;
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
2. /etc/nginx/sites-available
nginx 폴더안에 sites-available 가 없으면 하나 만들어주자
sudo mkdir /etc/nginx/sites-available
그 안에 아래와 같이 나의 커스텀 conf파일을 만들어준다. 나는 test.conf 라는 conf파일을 만들겠음.
그리고 내가 사용하는 도메인은 example.com 이라고 가정하자.
(amazon route53에 기본 도메인 dns설정은 완료한상태여야함~~)
server {
listen 80;
server_name example.com www.example.com;
return 301 https://example.com$request_uri; # http로 들어오면 https로 redirect 해주는 부분
}
server {
listen 443 ssl;
server_name example.com www.example.com;
# Certificate
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
# Private Key
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
location / {
proxy_pass http://localhost:8080; # 자신의 springboot app이사용하는 포트
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
ssl_certificate, ssl_certificate_key 는 이전에 설명한 letsencript로 ssl 인증서받기부분을 완료했다면 저 위치에 인증서, 키가 생성되었을것.. 경로중 example.com 으로 되어있는 각자 자기 도메인으로 넣어주면됨
내 springboot app은 8080포트를 사용하고있는 중이라, proxy_pass 부분에 http://localhost:8080 이 들어갔다. 해당부분은 자신의 스프링부트 앱에 맞게 설정해주면된다.
3. /etc/nginx/sites-enabled
nginx 폴더안에 sites-enabled 가 없으면 하나 만들어주자
sudo mkdir /etc/nginx/sites-enabled
test.conf를 만드는건 sites-available 디렉토리에 만들었는데, 생각해보면 nginx.conf 를 설정할때 우리는 sites-enabled 디렉토리를 include했음. 딱히 이유는 모르겠는데 일반적으로 sites-available에 내가 수정할수있는 파일을 만들고, sites-enabled에 해당 파일을 바라보는 심볼릭링크를 만들어넣는다. (안정성때문인가?) 여튼, 아래와 같이 심볼릭링크를 생성해주자.
sudo ln -s /etc/nginx/sites-available/test.conf /etc/nginx/sites-enabled/
4. nginx 재시작
sudo systemctl restart nginx
위 명령어로 nginx 재시작해주면 브라우저에 example.com 을 치는 순간 정상적으로 ssl이 적용된 내 스프링부트앱으로 리다이렉트가 잘된다.