서버란?
클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템으로 컴퓨터 프로그램(server program) 또는 장치(device)를 의미한다.
서버는 클라이언트에게 서비스를 제공한다.
서버는 클라이언트에게 요청을 받아야 응답을 위한 처리를 하기 시작하여 서비스를 제공한다.
식당의 서빙하는 사람을 우리는 무엇이라 부르는가? 바로 서버(Serve(제공하다) + -er(~하는 사람)라고 부른다.
이러한 서버의 역할과 같다고 생각하면 편하다.
손님(클라이언트)의 요청을 받고 서비스를 제공하는 사람(서버)라고 이해하면 될 것이다.
즉, 정리하면 클라이언트는 정보를 요청하고 받은 응답을 사용하고(화면을 만드는 등), 서버는 클라이언트가 보낸 요청에 알맞은 응답을 처리하고 보내는 역할을 한다.
서버는 서버 프로그램을 통해서 수많은 요청을 내부적으로 처리한다.
서버 프로그램은 사용자의 요청에 대한 특정한 작업을 수행하는 데 그 목적이 있다. 결국 서버는 요청받은 작업을 서버 프로그램으로 실행한 다음 결과를 클라이언트 프로그램에 응답으로 보내주는 일을 한다.
웹서버
웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹페이지를 반환하는 컴퓨터 프로그램
혹은 위의 언급한 기능을 제공하는 컴퓨터 프로그램을 실행하는 컴퓨터(하드웨어)를 의미한다.
👉 웹 서버는 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)를 전송해주는 서비스 프로그램을 말한다.
웹 브라우저로 불리는 클라이언트는 HTTP를 통해 리소스를 요청하며 서버는 해당 리소스를 반환하거나 처리할 수 없을 경우 에러 메시지를 전달한다. 이러한 리소스는 일반적으로 서버의 보조기억장치에 있는 실제 파일을 가리키지만 반드시 그런 것은 아니며 웹 서버가 어떻게 수행하느냐에 따라 달라질 수 있다. ex) 404 에러 페이지
대다수의 웹 서버는 ASP, PHP 등의 서버 사이드 스크립트 언어를 지원한다. 서버 사이트 스크립트 언어를 통해 HTML 문서를 동적으로 생성을 한다.
이를 동적 컨텐츠라 하는데 주로 데이터베이스의 정보를 조회해서 보여주거나 수정하기 위해 사용된다. 이와 대비되는 개념으로 정적 콘텐츠가 있는데 (이미지 파일, 고정된 HTML 파일 등) 일반적으로 동적 콘텐츠보다 더 빠르게 동작하고 쉽게 캐시 될 수 있지만, 반환되는 컨텐트의 내용이 항상 동일하다.
Nginx
nginx는 웹 서버 소프트웨어로, 가벼움과 높은 성능을 목표로 한다.
웹 서버, 리버스 프록시 및 메일 프록시 기능을 가진다.
리버스 프록시 - 컴퓨터 네트워크에서 클라이언트를 대신해서 한 대 이상의 서버로부터 자원을 추출하는 프록시 서버의 일종이다.
클라이언트들을 위해 임의의 서버에 접속하는 중간 매개체인 포워드 프록시와는 반대로,
리버스 프록시는 관련 서버들을 위해 임의의 클라이언트가 해당 서버에 접속하는 중간 매개체이다.
프록시 서버 - 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램
서버와 클라이언트 사이에 중계기로써 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 한다.
프록시 서버 중 일부는 프록시 서버에 요청된 내용들을 캐시를 이용하여 저장해둔다. 이렇게 캐시를 해 두고 난 후에, 캐시 안에 있는 정보를 요구하는 요청에 대해서는 원격 서버에 접속하여 데이터를 가져올 필요가 없게 됨으로써 전송시간을 절약할 수 있고, 불필요한 외부 연결을 줄일 수 있다는 장점을 가지게 된다.
Nginx가 요청을 받고 처리하는 과정
Nginx는 Event-Driven 구조로 동작하기 때문에 한 개 또는 고정된 프로세스만 생성하여 사용하고, 비동기 방식으로 요청들을 Concurrency 하게 처리할 수 있다.
동기(synchronous)와 비동기(Asynchronous)
- 동기 방식은 요청을 보냈을 때 응답이 돌아와야 다음 동작을 수행할 수 있다. 즉, A 작업이 모두 진행될 때까지 B작업은 대기해야 한다.
- 비동기 방식은 반대로 요청을 보냈을 때 응답 상태와 상관없이 다음 동작을 수행할 수 있다. 즉 A 작업이 시작하면 동시에 B작업이 실행된다. A 작업은 결과값이 나오는 대로 출력된다. (처리 순서를 보장하지 않는다.)
Nginx는 하나의 Master Process와 다수의 Worker Process로 구성되어 실행이 된다.
Master Process는 설정 파일을 읽고, 유효성 검사 및 Worker Process를 관리한다.
모든 요청은 Worker Process에서 처리한다.
Worker Process의 개수는 설정 파일에서 정의되며, 정의된 프로세스 개수와 사용 가능한 CPU 코어 숫자에 맞게 자동으로 조정된다.
참고: https://velog.io/@wijihoon123/Nginx%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
https://lipcoder.tistory.com/entry/%EC%84%9C%EB%B2%84Server-%EB%9E%80
'서버' 카테고리의 다른 글
Refactoring : if-else문을 사용하는 팩토리 클래스 제거하기 (3) | 2023.12.26 |
---|---|
Redis에서 사용하는 분산락 알고리즘인 RedLock에 대해 알아보자 (0) | 2023.09.16 |
nGrinder 성능 테스트 측정 삽질 일기 (Docker를 통한 설치 + war 파일을 통한 설치 포함) (0) | 2023.09.02 |
서버의 구동 원리 - APM (0) | 2022.07.11 |