centos에 nginx 및 SSL 설치
개요
SPA 프레임웍을 구축하게 되면 image, js, css 같은 정적인 파일을 서비스하는 프런트엔드 서버와 REST api를 제공하는 백엔드 서버가 필요하다.
linux 시스템에서는 정적인 파일을 서비스하는 웹서버로 nginx가 최적의 웹서버로 알려져 있으며 spring boot과 같은 백엔드 서버는 nginx 뒷단에 reverse proxy로 구성하게 된다. 이렇게 구성하면 CORS 문제도 생기지 않는다.
또한 lets’s encrypt라는 무료 SSL을 설치하고, 파일업로드를 하기 위한 설정을 추가한다.
먼저 정적 웹서버는 80 포트로 설정하고 백엔드 REST api 서버는 8080으로 설정하겠다.
nginx 설정
/etc/nginx/nginx.conf 에는 공통 사항을 기록한다.
REST api로 파일을 업로드하는 경우 프런트를 통해서 들어오므로 nginx에서 file upload를 설정하는 부분 4줄과, 백엔드로 연동하는 reverse proxy 부분은 기본 설정에는 없는 부분이니 잘 기억해야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
user centos; worker_processes auto; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 1024; } 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 2048; # 추가 ------------------------------------ # file upload client_body_temp_path /tmp/; client_body_in_file_only on; client_body_buffer_size 128K; client_max_body_size 100M; # reverse proxy upstream springboot { server 127.0.0.1:8080; } # 추가 끝 ------------------------------------------------ include /etc/nginx/mime.types; default_type application/octet-stream; include /etc/nginx/conf.d/*.conf; # 아래 부분은 주석처리: 다른 폴더로 이동하기 위함----------- #server { # listen 80 default_server; # listen [::]:80 default_server; # server_name _; # root /usr/share/nginx/html; # # Load configuration files for the default server block. # include /etc/nginx/default.d/*.conf; # location / { # } # error_page 404 /404.html; # location = /40x.html { # } # error_page 500 502 503 504 /50x.html; # location = /50x.html { # } #} } |
80번 포트로 정적 웹서버 구성은 /etc/nginx/conf.d/default.conf 화일에 설정한다.
/api 경로로 들어올 경우 http://localhost/api가 먼저 받은후 reverse proxy로 설정된 http://localhost:8080/api 톰캣 서버로 연동한다.
server_name에 eastflag.co.kr 부분은 각자 적당한 도메인으로 변경한다.
try_files 는 SPA의 경우에 홈이 아니라 url 경로로 들어올 경우에 처리하기 위해서 추가해주어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
server { listen 80; server_name eastflag.co.kr; location / { root /home/centos/web_home; index index.html index.htm; try_files $uri /index.html; } # /api => reverse proxy location /api { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://springboot/api; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } |
nginx를 다시 구동한다
# systemctl restart nginx
# systemctl reload nginx
Let’s Encrypt SSL 설치
먼저 아래 명령을 실행해서 dhparam.pem을 만든다.
1 |
openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048 |
certbot 을 설치한다.
1 2 3 4 5 6 7 8 9 |
yum install certbot-nginx certbot --nginx -d eastflag.co.kr -d www.eastflag.co.kr # 인증 받을 이메일 입력 후 엔터 # 약관 동의 A # 이메일공유 내용 Y |
이렇게 설치하면 /etc/letsencrypt/live/도메인 에 4개의 화일이 설치된다.
1 2 3 4 5 6 7 |
cd /etc/letsencrypt/live/eastflag.co.kr ls -ltr lrwxrwxrwx 1 root root 39 7월 30 17:18 privkey.pem lrwxrwxrwx 1 root root 41 7월 30 17:18 fullchain.pem lrwxrwxrwx 1 root root 37 7월 30 17:18 chain.pem lrwxrwxrwx 1 root root 36 7월 30 17:18 cert.pem -rw-r--r-- 1 root root 682 7월 30 17:18 README |
만일 certbot-nginx 가 아니라 certbot으로 설치했다면 nginx 공통 설정 화일인 options-ssl-nginx.conf 화일이 없을것이므로 이 화일을 /etc/letsencrypt/options-ssl-nginx.conf 위치에 수동으로 추가해주어야 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# This file contains important security parameters. If you modify this file # manually, Certbot will be unable to automatically provide future security # updates. Instead, Certbot will print and log an error message with a path to # the up-to-date file that you will need to refer to when manually updating # this file. ssl_session_cache shared:le_nginx_SSL:10m; ssl_session_timeout 1440m; ssl_session_tickets off; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers off; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384"; |
/etc/nginx/conf.d/default.conf 을 추가하고 443 SSL 포트 설정을 한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
server { listen 443 ssl; server_name eastflag.co.kr; ssl_certificate /etc/letsencrypt/live/mangoarr.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/mangoarr.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/ssl/certs/dhparam.pem; if ($scheme != "https") { return 301 https://$host#request_uri; } location / { root /home/centos/web_home; index index.html index.htm; try_files $uri /index.html; } # /api => reverse proxy location /api { proxy_set_header X-Real-IP $remote_addr; proxy_pass http://springboot/api; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } |
만일 80번 포트로 접속시 443 포트로 리다이렉션을 시킬려면 /etc/nginx/conf.d/http.conf 를 추가하여 아래와 같이 설정한다.
1 2 3 4 5 |
server { listen 80; server_name mangoarr.com; return 301 https://$host$request_uri; } |
let’s encrypt는 3개월후에 만료가 된다. 갱신 메일이 날라오면 certbot renew를 해준다. 3개월마다 하는게 귀찮다면 3개월 주기로 실행되는 crontab 을 추가해주어야 한다.