DevOps/Nginx

[Nginx] Nginx에 대해서

SeungbeomKim 2023. 9. 26. 17:51

nginx-image-file

nginx? 

  • 가벼움과 높은 성능을 목표로 하는 웹 서버 소프트웨어
  • 이벤트 중심 아키텍처로 10000개 이상의 동시 연결을 처리할 수 있기 때문에, 백엔드 서버에 부하를 분산시키는 Reverse Proxy로도 사용되는 동시에 대부분에 사이트에서 더 나은 성능을 위해 보안 및 캐싱 제공
  • 정적 데이터를 제공(html, image ..)

 

Nginx의 주요 기능 : Proxy Server 

 

Proxy Server란? 

  • 대신 처리하는 서버
  • 클라이언트와 서버 간의 중계 서버로 통신을 대리 수행하는 서버
  • 캐시/보안/트래픽 분산 등 여러 장점을 가질 수 있습니다

 

일반적으로 말하는 Proxy라 하면, Forward Proxy를 의미합니다.(nginx는 Reverse Proxy Server의 역할 담당) 이 둘은 비슷한 기능을 제공하지만, 약간의 차이가 있기에 이들을 비교해 보도록 하겠습니다.

 

Forward Proxy

  • 일반적으로 사용하는 Proxy(인터넷 속도를 향상시키기 위해 윈도우에서 Proxy 설정을 하는 것)
  • 외국에서 접속하는 것처럼 테스트하기 위한 Proxy 설정
  • 개인정보를 빼돌린 해커가 IP 추적을 방지하기 위한 Proxy 설정 
  • 클라이언트와 인터넷 사이에 위치합니다.

Forward Proxy의 기능

  • 캐싱
    • 전송 시간 절약, 불필요한 외부 전송 X, 외부 요청 감소(네트워크 병목 현상 감지)
  • 익명성
    • 클라이언트가 보낸 요청을 감출 수 있는 기능
    • 클라이언트가 인터넷을 거쳐서 서버로 직접적으로 전송하게 될 경우에는 관련 정보를 그대로 전달합니다(ip, 장비 정보, os 정보 등)
    • Forward Proxy를 통해 마치 Porward Proxy가 요청을 한 것처럼 서버들에게 Forward Proxy의 정보를 전달해 줄 수 있습니다. 
    • Server 측은 응답받은 요청을 누가 보냈는지 알지 못합니다(Server가 받은 요청 IP = Proxy IP)

 

이제 Nginx의 기능인 Reverse Proxy에 대해서 알아보겠습니다.

 

Reverse Proxy

  • 인터넷과 웹 서버 사이에 위치
  • 클라이언트의 요청을 가로채고 클라이언트를 대신하여 웹 서버와 통신

Reverse Proxy Picture

Reverse Proxy의 기능

  • 캐싱: Forward Proxy와 동일
  • 보안: 서버 정보를 클라이언트로부터 숨김
    • Client는 Reverse Proxy를 실제 서버라고 생각하여 요청 -> 실제 서버의 IP가 노출되지 않게 됨
  • Load Balancing(Optional)
    • Load Balancing(부하 분산): 해야 할 일을 나누어 서버의 부하를 분산시키는 것
    • Load Balancer: 여러 대의 서버가 분산 처리할 수 있도록 요청을 나누어주는 서비스
    • Load Balancer의 종류(OSI 7 Layer를 기준으로 구분)
      • L2: MAC Address를 바탕으로 Load Balancing
      • L3: IP Address를 바탕으로 Load Balancing
      • L4: Transport Layer(IP & Port) Level에서 Load Balancing
        • https://daily1313.tistory.com/으로 접근 시, 서버 A, 서버 B로 Load Balancing
      •  L7: Application Layer(User Request) Level에서 Load Balancing(HTTPS/HTTP/FTP)
        • 블로그에 접근 시, 뒤에 무엇을 붙이느냐에 (URL)에 따라서 혹은 Query Param에 대해서, 그 애플리케이션을 요청하는 방법에 따라 어떤 서버로 Load Balancing을 할지 결정

 

  • Load Balancer가 나타난 배경

Load Balancer 배경

  • 사용자가 늘어나면서 서버에 부하가 생김
  • Scale-Up(하나의 Server의 하드웨어 성능(CPU, Memory 등)을 높이는 것)으로는 한계가 명확하기에 Scale-Out 적용
  • Scale-Out: 여러 대의 Server가 일을 나누어 처리하는 것

 

proxy_pass

  • Client의 요청을 다른 서버로 전달하고, 그 응답을 Client에게 반환하는 역할 담당, 이를 통해 Nginx는 Reverse Proxy 또는 Load Balancer로 작동할 수 있습니다.
  • proxy_pass를 사용한 기본 예제

 

  • nginx는 /example/경로로 들어온 모든 요청을 http://your_upstream으로 전달
  • http://your_upstream: 실제 요청을 처리할 서버의 주소
  • 또한 밑에 사진과 같이 여러 대의 서버에 대한 Load Balancing도 가능한데, nginx로 들어오는 모든 요청을 backend1.example.com, backend2.example.com, backend3.example.com 중 하나로 분산시킬 수 있게 됩니다.

 

다중 포트 연결 기능 지원

  • 예시를 들어 방화벽으로 http(80), https(443)과 같은 Port만 개방해 주면, 다른 포트는 nginx에서 다룰 수 있게 되어 네트워크 구성이 매우 간편해짐 -> 3000, 8080과 같은 Port를 따로 개방시키지 않을 수 있게 됨
  • 보안성 향상: 모든 인바운드 트래픽(inbound traffic)을 단일 Port(https, 443)를 통해 들어오므로, 다른 포트들은 외부로 노출시키지 않아 보안성 향상
  • 인바운드 트래픽(inbound traffic): 외부로부터 시작되는 트래픽
    • ex) Client가 Server에게 HTTP Request를 보내는 경우

 

Nginx의 역할과 기능에 대해 상세히 알아보았는데, 다음 포스팅에는 Springboot, Docker, Nginx를 활용하여 80 Port로 요청을 보냈을 때, 8080 Port로 redirect 되는 예제 코드를 포스팅하도록 하겠습니다. 

 

<참고 자료>

https://www.youtube.com/watch?v=YxwYhenZ3BE