프로젝트

프로젝트17. Nginx 적용! (캐싱, 로깅, 요청제한, HTTPS)

dodo4723 2024. 2. 17. 10:08
728x90
반응형

제 프로젝트는 사용자가 특정 차트를 고르면, 코스피 코스닥 전 종목의 과거(10년) 차트들을 모두 탐색하여 가장 유사한 차트 10개 정도를 골라 사용자에게 보여주는 것이 목표입니다.

 

비슷한 차트 검색기

 

 

비슷한 차트 검색기

내 종목의 차트는 과연 상승하는 차트일까요?

www.similarchart.com

 




 

Nginx

 

웹서버?

웹 서버에 관해 처음 접한 것은 전역 직후 2022년 여름 김영한 개발자님의 Spring강의를 수강할 때였습니다. 당시에는 웹서버, 웹 애플리케이션 서버, 톰캣 등 그냥 그런 게 있나 보다 하고 웹서버에 대해서 정확히 알지 못하고 넘어갔습니다

.

그리고 나서 잊고 있다가 웹서버를 두 번째로 접한 것은 3학년 1학기입니다. 대학 서버프로그래밍 수업을 수강하며 웹서버가 웹 애플리케이션 서버와는 다르다는 것을 인지했습니다. 백엔드 개발자가 되겠다고 했는데 이제까지 이것도 모르고 있었다니 살짝 부끄러웠습니다.

 

몇 달 전 웹 아키텍처 공부를 하며 세 번째로 접하게 되어 이제는 웹서버에 대해 익숙해진 느낌입니다.

그리고 웹 프로젝트를 진행하며 사용자 기능을 모두 구현한 지금, 드디어 직접 웹 서버인 Nginx를 건드려야 하는 순간이 왔네요.

 




도커 컨테이너로 nginx를 실행

도커 컨테이너를 만들기 위해 nginx_server라는 디렉토리를 만들어 안에 Dockerfile과 nginx.conf를 만들어줍니다.

dockerfile

FROM nginx
# Nginx 설정 파일 복사
COPY nginx.conf /etc/nginx/nginx.conf

 


 

적용한 기능1. HTTPS 지원

SSL 인증서를 발급받고 nginx를 활용하여 https를 사용할 수 있게 되었습니다. SSL인증서를 발급받기 위해서는 도메인이 필요하더군요. 제 프로젝트 주제와 잘 어울리는 similarchart.com으로 큰맘 먹고 구입했습니다.

nginx.conf

http {
    server {
        listen 443 ssl;
        server_name www.similarchart.com;

        ssl_certificate /etc/letsencrypt/live/www.similarchart.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/www.similarchart.com/privkey.pem;
    }
}

 


 

적용한 기능2. 캐싱

최적화라고 하면 캐싱은 빠질 수 없죠. 캐싱을 한 경우와 하지 않은 경우를 각각 테스트해 보니 기존에 2~3초 걸리던 로딩시간이 캐싱을 한 경우는 1초도 걸리지 않습니다.

nginx.conf

http {
    # 캐시 설정
    proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=1g 
                     inactive=60m use_temp_path=off;
    server {
     # 해당 위치에 대한 요청을 캐시하도록 설정
          proxy_cache my_cache;
          proxy_cache_valid 200 302 600m;  #  600분 동안 캐싱
    }
}

 


 

적용한 기능3. 요청 속도 제한

악의적인 사용자가 새로고침을 계속 클릭하여 서버에 부담이 가는 것을 막기 위해 요청 속도를 제한했습니다. 직접 테스트해보니 이 제한을 넘어가면 http 응답을 받을 때 이미지 몇 개를 받지 못하거나 아예 오류 페이지를 보여주더군요.

nginx.conf

# 요청 속도 제한 설정 - 1초에 5번
limit_req_zone $binary_remote_addr zone=my_limit:10m rate=5r/s;

# 요청 속도 제한 적용 - 1분에 100번
limit_req zone=my_limit burst=100 nodelay;

 


 

적용한 기능4. 로깅

저도 처음에는 귀찮아서 로깅을 잘하지도 않고 그냥 print()로 대충 넘어갔는데, 버그나 오류가 발생 시 로깅이 제대로 되어있지 않으면 꽤 힘들어서 하다 보니 저절로 로깅을 잘하게 바뀌었습니다. 백엔드 단에서도 로깅작업을 잘해놓고, 웹 서버에서도 로깅을 제대로 해놓는 게 향후 도움이 될 것입니다.

nginx.conf

# 로그 설정
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

 




정리

이외에도 Nginx에는 많은 기능들이 있지만, 일단 제 프로젝트에 필수적인 기능들만 추가했습니다. 향후 서버를 운영하며 필요한 기능들을 추가할 예정입니다.

반응형