Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
Archives
Today
Total
관리 메뉴

밤빵's 개발일지

[TIL]20240813 Nginx 본문

개발Article

[TIL]20240813 Nginx

최밤빵 2024. 8. 13. 21:18

Nginx는 선용멘토님이 서버 다운되지 않고 유지될 수 있는 항상성에 대해 말씀하셨던적이 있는데  로드밸런서에 대해 공부하면서 Nginx를 알게되었고, 예전 프로젝트에서 디스코드를 클론코딩한 깃의 아키텍처에서도 Nginx가 있어서 공부를 하게 됐다. 로드밸런서 역할 뿐 아니라 많은 역할을 하기때문에 알아두면 좋을것같다는 생각을 했다. 

Nginx는 웹 서버, 리버스 프록시, 로드 밸런서, HTTP 캐시로 사용되는 다목적 웹 서버 소프트웨어이다. 고성능과 고가용성을 제공하는 Nginx는 현대적인 웹 애플리케이션의 요구 사항을 충족시키기 위해 설계되었다. 이 글에서는 Nginx의 개념과 주요 기능, Nginx를 활용한 서버 가용성 유지와 로드 밸런싱, 그리고 Nginx와 스케줄러를 분리한 배치 서버 아키텍처에 대해 다뤄보겠다.

🤓Nginx란?

Nginx는 오픈 소스 웹 서버로, 주로 HTTP 서버와 리버스 프록시, 로드 밸런서, 메일 프록시 등 다양한 용도로 사용된다. Apache와 함께 가장 많이 사용되는 웹 서버 중 하나로, 높은 성능과 낮은 리소스 사용으로 인해 많은 대규모 서비스에서 사용되고 있다. Nginx는 이벤트 기반의 비동기 아키텍처로 설계되어, 다수의 동시 연결을 효율적으로 처리할 수 있어 특히 고성능이 요구되는 환경에서 강력한 성능을 발휘한다.

 

▶Nginx의 주요 역할과 기능

Nginx는 다양한 역할과 기능을 제공한다. 그 중에서도 특히 중요한 기능들은 다음과 같다:

 

→ 웹 서버:

Nginx는 HTTP 요청을 처리하여 정적 파일(HTML, CSS, JavaScript 등)을 제공하거나, FastCGI, WSGI, SCGI와 같은 프로토콜을 통해 애플리케이션 서버로 요청을 전달하는 역할을 한다.

→ 리버스 프록시:

Nginx는 클라이언트의 요청을 받아 실제 애플리케이션 서버로 전달하는 리버스 프록시 역할을 수행한다. 이를 통해 서버의 보안과 성능을 강화하고, 클라이언트와 서버 간의 네트워크 트래픽을 최적화할 수 있다.

→ 로드 밸런서:

Nginx는 다양한 로드 밸런싱 알고리즘(라운드 로빈, 가중치 라운드 로빈, IP 해시 등)을 제공하여, 여러 애플리케이션 서버에 걸쳐 트래픽을 분산시킬 수 있다. 이를 통해 서버 부하를 분산시키고 애플리케이션의 가용성을 향상시킬 수 있다.

→ HTTP 캐시:

Nginx는 캐싱 기능을 통해 정적 자원과 동적 자원의 HTTP 응답을 캐싱하여, 서버 응답 시간을 줄이고 트래픽 부하를 줄일 수 있다.

→ SSL/TLS 종료: Nginx는 SSL/TLS 암호화를 처리하는 역할을 하여, 애플리케이션 서버의 부담을 줄이고 보안을 강화할 수 있다.

 

▶Nginx를 활용한 서버 가용성 유지

Nginx는 로드 밸런서를 통해 여러 서버에 걸쳐 트래픽을 분산시켜, 서버가 다운되지 않고 항상성을 유지할 수 있다. 가용성을 보장하기 위해 서버를 최소 두 개 이상 운영하는 것이 중요하며, 서버 중 하나가 다운되더라도 Nginx 로드 밸런서가 자동으로 다른 서버로 트래픽을 전달할 수 있다. 이러한 아키텍처는 단일 장애점(Single Point of Failure)을 제거하고, 고가용성을 제공하여 시스템의 안정성을 높인다. 로드 밸런서를 통해 여러 서버에 요청을 분배하게 되면, 특정 서버에 과도한 부하가 걸리는 것을 방지할 수 있다.

 

▶예시: Nginx 로드 밸런서 설정

아래는 Nginx에서 로드 밸런서를 설정하는 간단한 예시이다.

http {
    upstream backend {
        server backend1.example.com;  # 첫 번째 서버
        server backend2.example.com;  # 두 번째 서버
    }

    server {
        listen 80;

        location / {
                proxy_pass http://backend;  # 로드 밸런싱 그룹을 지정
        }
    }
}
→ upstream 지시문을 사용하여 backend라는 로드 밸런싱 그룹을 정의하고, 두 개의 서버를 포함시킨다.

→ proxy_pass 지시문을 통해 / 경로로 들어오는 모든 요청을 backend 그룹으로 전달한다. Nginx는 기본적으로 라운드 로빈 방식을 사용하여 요청을 각 서버로 분배한다.

 

▶서버 스케줄링 문제 해결

서버를 여러 개 띄웠을 때, 각 서버마다 동일한 스케줄러가 존재하면 불필요한 작업이 중복으로 발생할 수 있다. 예를 들어, 정산 기능이 중복 실행되거나 결제가 여러 번 처리되는 등의 문제가 발생할 수 있다. 이러한 문제를 해결하기 위해서는 스케줄러 서버를 따로 만들어야 한다. 배치 서버란 스케줄링과 배치 작업을 전담하는 서버로, 스케줄러가 특정 작업을 수행할 수 있도록 독립적으로 구성된 서버를 의미한다. 이러한 배치 서버는 모든 정기적이고 반복적인 작업을 단일 서버에서만 실행되도록 하여 중복 작업을 방지하고, 서버 간 데이터 일관성을 유지할 수 있다.

 

▶ 예시: 배치 서버 구성

아래는 Spring Boot에서 배치 서버를 구성하여 Nginx와 함께 활용하는 예시이다.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class BatchScheduler {

    // 매일 자정에 실행되는 스케줄러 예시
    @Scheduled(cron = "0 0 0 * * *")
    public void performBatchJob() {
        // 배치 작업 로직 (예: 데이터 정리, 정산 등)
        System.out.println("배치 작업이 실행되었습니다.");
    }
}
→ @Scheduled 애너테이션을 사용하여 배치 작업을 스케줄링한다.

→ cron 속성을 사용하여 매일 자정에 배치 작업이 실행되도록 설정한다.

→ 실제 서비스 환경에서는 이 배치 서버를 Nginx 로드 밸런서와 별도로 구성하여, 서버 다운 시에도 배치 작업이 계속될 수 있도록 해야 한다.

 

▶로드 밸런서와 Nginx의 시너지

로드 밸런서로서의 Nginx는 높은 가용성과 성능을 제공하며, 서버 장애에 대비해 다양한 서버로 트래픽을 분산시킬 수 있다. 그러나 이와 동시에 모든 서버에 동일한 스케줄러가 실행될 경우 불필요한 중복 작업이 발생할 수 있다. 이러한 문제를 해결하기 위해서는 로드 밸런서와 배치 서버를 분리하여 구성하는 것이 바람직하다. Nginx를 통해 클라이언트 요청을 분산하고, 배치 서버에서는 백그라운드 작업을 전담하도록 설계하면 안정성과 성능을 모두 갖춘 시스템을 구축할 수 있다.

 

▶마무리

Nginx의 개념과 주요 기능, 그리고 Nginx를 활용한 서버 가용성 유지와 스케줄러 문제 해결 방법에 대해 정리해봤는데, 배치서버나 스케줄링 같은건 들어본적이 없어서 이건 나중에 따로 다뤄서 한번 더 정리를 해야할 것 같다. Nginx는 웹 서버, 리버스 프록시, 로드 밸런서 등으로 매우 유연하게 사용할 수 있는 도구이고, 특히 여러 서버 환경에서 로드 밸런싱을 통해 높은 가용성을 유지하는 데 필수적이다. 선용멘토님의 조언에 따라 Nginx와 로드 밸런서를 이해하고, 서버 스케줄러 문제를 해결하는 방법을 학습하면서, 안정적인 백엔드 아키텍처를 설계하고 구현하는 데 도움이 될 것 같다. 

'개발Article' 카테고리의 다른 글

[TIL]20240815 스프링 스케줄러  (0) 2024.08.15
[TIL]20240814 N+1 문제해결  (0) 2024.08.14
[TIL]20240812 성능최적화  (0) 2024.08.12
[WIL]20240811 Redis  (0) 2024.08.11
[TIL]20240810 단위테스트란?  (0) 2024.08.10