웹사이트 검색

웹 애플리케이션을 위한 5가지 일반적인 서버 설정


소개

환경에 사용할 서버 아키텍처를 결정할 때 성능, 확장성, 가용성, 안정성, 비용 및 관리와 같은 많은 요소를 고려해야 합니다.

이 자습서에서는 장단점을 포함하여 각각에 대한 간단한 설명과 함께 일반적으로 사용되는 서버 설정에 대해 알아봅니다. 여기에서 다루는 모든 개념은 서로 다양한 조합으로 사용할 수 있으며 모든 환경에는 서로 다른 요구 사항이 있으므로 하나의 올바른 구성은 없습니다.

하나의 서버에 모든 것을 설정

하나의 서버 설정은 전체 환경이 단일 서버에 있는 경우입니다. 일반적인 웹 애플리케이션의 경우 여기에는 웹 서버, 애플리케이션 서버 및 데이터베이스 서버가 포함됩니다. 이 설정의 일반적인 변형은 단일 서버에서 Linux, Apache, MySQL 및 PHP를 나타내는 LAMP 스택입니다. 이에 대한 사용 사례의 예는 애플리케이션을 빠르게 설정하려는 경우입니다. 이와 같은 기본 설정을 사용하여 아이디어를 테스트하거나 간단한 웹 페이지를 시작하고 실행할 수 있습니다.

불행히도 이것은 확장성 및 구성 요소 격리 방식을 거의 제공하지 않습니다. 또한 애플리케이션과 데이터베이스는 CPU, 메모리, I/O 등과 같은 동일한 서버 리소스를 두고 경쟁합니다. 그 결과 성능이 저하되고 근본 원인을 파악하기 어려울 수 있습니다. 하나의 서버를 사용하는 것도 쉽게 수평 확장할 수 없습니다. Ubuntu 22.04에 LAMP를 설치하는 방법에 대한 자습서에서 수평 확장에 대해 자세히 알아볼 수 있습니다. 다음은 단일 서버 사용을 시각적으로 나타낸 것입니다.

별도의 데이터베이스 서버 설정

DMZ 또는 공용 인터넷.

사용 사례의 예는 애플리케이션을 빠르게 설정하고 애플리케이션과 데이터베이스가 동일한 시스템 리소스를 놓고 다투는 것을 방지할 수 있다는 것입니다. 각 애플리케이션 및 데이터베이스 계층을 개별적으로 수직 확장할 수도 있습니다. 용량 증가가 필요한 서버에 더 많은 리소스를 추가하면 가능합니다. 설정에 따라 DMZ에서 데이터베이스를 제거하여 보안을 강화할 수도 있습니다.

이 설정은 단일 서버보다 약간 더 복잡합니다. 두 서버 간의 네트워크 연결이 지리적으로 서로 떨어져 있는 경우 높은 대기 시간과 같은 성능 문제가 발생할 수 있습니다. 전송되는 데이터 양에 비해 대역폭이 너무 낮은 경우에도 성능 문제가 있을 수 있습니다. 자세한 내용은 MySQL로 사이트 성능을 최적화하기 위해 원격 데이터베이스를 설정하는 방법에서 읽을 수 있습니다. 다음은 별도의 데이터베이스 서버 사용을 시각적으로 나타낸 것입니다.

로드 밸런서 설정(역방향 프록시)

로드 밸런서를 서버 환경에 추가하여 여러 서버에 워크로드를 분산시켜 성능과 안정성을 향상시킬 수 있습니다. 부하 분산된 서버 중 하나가 실패하면 실패한 서버가 다시 정상이 될 때까지 다른 서버가 들어오는 트래픽을 처리합니다. 또한 계층 7 응용 프로그램 계층 역방향 프록시를 사용하여 동일한 도메인 및 포트를 통해 여러 응용 프로그램을 제공하는 데 사용할 수 있습니다. 리버스 프록시 로드 밸런싱이 가능한 몇 가지 유형의 소프트웨어는 HAProxy, Nginx 및 Varnish입니다.

예시 사용 사례는 수평 확장이라고도 하는 더 많은 서버를 추가하여 확장이 필요한 환경에 있습니다. 로드 밸런서를 설정하면 더 많은 서버를 추가하여 확장할 수 있는 환경 용량을 사용할 수 있습니다. 또한 클라이언트 연결을 합리적인 양과 빈도로 제한하여 DDOS 공격으로부터 보호할 수 있습니다.

로드 밸런서를 설정하면 로드 밸런서에 리소스가 충분하지 않거나 제대로 구성되지 않은 경우 성능 병목 현상이 발생할 수 있습니다. 또한 SSL 종료를 수행할 위치 및 고정 세션이 필요한 애플리케이션을 처리하는 방법과 같은 추가 고려 사항이 필요한 복잡성을 나타낼 수 있습니다. 또한 로드 밸런서는 단일 실패 지점입니다. 즉, 부하 분산 장치가 중단되면 전체 서비스가 중단될 수 있습니다. 고가용성(HA) 설정은 단일 장애 지점이 없는 인프라입니다. HA 설정을 구현하는 방법을 알아보려면 HAProxy 소개 및 로드 밸런싱 개념에 대한 설명서도 읽어보십시오. 다음은 로드 밸런서 설정을 시각적으로 나타낸 것입니다.

HTTP 가속기 설정(역방향 프록시 캐싱)

HTTP 가속기 또는 캐싱 HTTP 리버스 프록시를 사용하면 다양한 기술을 통해 콘텐츠를 사용자에게 제공하는 데 걸리는 시간을 줄일 수 있습니다. HTTP 가속기에 사용되는 주요 기술은 웹 또는 애플리케이션 서버의 응답을 메모리에 캐싱하는 것이므로 동일한 콘텐츠에 대한 향후 요청을 웹 또는 애플리케이션 서버와의 불필요한 상호 작용을 줄이면서 신속하게 처리할 수 있습니다. HTTP 가속이 가능한 소프트웨어의 몇 가지 예는 Varnish, Squid, Nginx입니다. 예제 사용 사례는 콘텐츠가 많은 동적 웹 애플리케이션 또는 일반적으로 액세스되는 파일이 많은 환경입니다.

HTTP 가속은 캐싱 및 압축을 통해 웹 서버의 CPU 부하를 줄여 사이트 성능을 향상시켜 사용자 용량을 늘릴 수 있습니다. 리버스 프록시 부하 분산으로도 사용할 수 있으며 일부 캐싱 소프트웨어는 DDOS 공격으로부터 보호할 수도 있습니다. 불행히도 캐시 적중률이 낮으면 성능이 저하될 수 있으며 최상의 성능을 얻으려면 조정이 필요합니다. 다음은 HTTP 가속기 설정을 시각적으로 나타낸 것입니다.

기본 복제본 데이터베이스 복제 설정

CMS와 같이 쓰기에 비해 많은 읽기를 수행하는 데이터베이스 시스템의 성능을 향상시키는 한 가지 방법은 주 복제본 데이터베이스 복제를 사용하는 것입니다. 복제에는 하나의 기본 노드와 하나 이상의 복제본 노드가 필요합니다. 이 설정에서는 모든 업데이트가 기본 노드로 전송되고 읽기가 모든 노드에 분산될 수 있습니다. 예제 사용 사례는 애플리케이션 데이터베이스 계층의 읽기 성능을 높이는 것입니다. 주 복제본 데이터베이스 복제를 설정하면 복제본 전체에 읽기를 분산하여 데이터베이스 읽기 성능을 향상시키고 읽기 요청을 처리하는 데 시간을 들이지 않고 업데이트 전용으로 사용하여 쓰기 성능을 향상시킵니다.

기본-복제본 데이터베이스 복제의 단점 중 일부는 데이터베이스에 액세스하는 애플리케이션에 업데이트 및 읽기 요청을 보낼 데이터베이스 노드를 결정하는 메커니즘이 있어야 한다는 것입니다. 또한 기본이 실패하면 문제가 수정될 때까지 데이터베이스에서 업데이트를 수행할 수 없습니다. 또한 기본 노드 장애 시 장애 복구 기능이 내장되어 있지 않습니다. 다음은 단일 복제본 노드가 있는 기본 복제본 복제 설정의 시각적 표현입니다.

개념 결합

애플리케이션 서버 외에 캐싱 서버의 부하 분산이 가능하며 단일 환경에서 데이터베이스 복제를 사용할 수 있습니다. 이러한 기술을 결합하는 목적은 너무 많은 문제나 복잡성을 도입하지 않고 각각의 이점을 얻는 것입니다. 다음은 이러한 유형의 서버 환경 설정에 대한 예제 다이어그램입니다.

예를 들어 로드 밸런서가 정적 요청(예: 이미지, CSS, JavaScript 등)을 인식하고 해당 요청을 캐싱 서버로 직접 보내고 다른 요청을 애플리케이션 서버로 보내도록 구성된 시나리오를 상상해 보십시오.

다음은 사용자가 동적 콘텐츠에 대한 요청을 보낼 때의 프로세스 분석입니다.

  1. 사용자가 http://example.com/(로드 밸런서)에서 동적 콘텐츠를 요청합니다.
  2. 로드 밸런서는 앱 백엔드로 요청을 보냅니다.
  3. 앱 백엔드는 데이터베이스에서 읽고 요청된 콘텐츠를 로드 밸런서에 반환합니다.
  4. 로드 밸런서는 요청된 데이터를 사용자에게 반환합니다.

사용자가 정적 콘텐츠를 요청하면 다음 프로세스가 적용됩니다.

  1. 로드 밸런서는 캐시 백엔드를 확인하여 요청된 콘텐츠가 캐시되었는지(cache-hit) 아닌지(cache-miss) 확인합니다.
  2. 콘텐츠가 캐시 적중되면 요청된 콘텐츠를 로드 밸런서에 반환하고 프로세스의 마지막 단계로 이동하여 데이터를 사용자에게 반환한다는 의미입니다. 콘텐츠가 캐시 미스인 경우 캐시 서버는 로드 밸런서를 통해 앱 백엔드로 요청을 전달합니다.
  3. 로드 밸런서는 app-backend를 통해 요청을 전달합니다.
  4. 앱 백엔드는 데이터베이스에서 읽고 요청된 콘텐츠를 로드 밸런서에 반환합니다.
  5. 로드 밸런서는 응답을 캐시 백엔드로 전달합니다.
  6. 캐시 백엔드는 콘텐츠를 캐시하고 로드 밸런서에 반환합니다.
  7. 로드 밸런서는 요청된 데이터를 사용자에게 반환합니다.

이 환경에는 여전히 로드 밸런서와 기본 데이터베이스 서버라는 두 개의 단일 실패 지점이 있지만 이전 섹션에서 설명한 다른 모든 안정성 및 성능 이점을 제공합니다.

결론

이제 몇 가지 기본 서버 설정에 익숙해졌으므로 자신의 응용 프로그램에 어떤 종류의 설정을 사용할지 잘 알고 있어야 합니다. 자신의 환경을 개선하기 위해 작업하는 경우 너무 많은 복잡성을 너무 빨리 도입하지 않으려면 반복 프로세스가 최선이라는 점을 기억하십시오.