개발자는 클라이언트보다 서버를 만들고 다루는 일이 더 많음
일반적으로 클라이언트를 다루는 일반 사용자는 한 번에 한 서버와 메시지를 주고받지만,
서버를 다루는 개발자는 한 번에 수많은 클라이언트와 메시지를 주고받아야 함
서버와 트래픽 관리에 대한 내용
오리진 서버: 자원을 생성하고 클라이언트에게 권한이 있는 응답을 보낼 수 있는 HTTP 서버
클라이언트와 오리진 서버 사이에는 많은 중간 서버가 있을 수 있음

위 그림에서 서버의 다중화는 가용성을 높이기 위한 설계라고 볼 수 있음
대표적인 HTTP 중간 서버 유형에는 프록시와 게이트웨이가 있음
: 클라이언트가 선택한 메시지 전달의 대리자로, 주로 캐시 저장, 클라이언트 암호화 및 접근 제한 등의 기능을 제공

: 오리진 서버(들)을 향하는 요청 메시지를 먼저 받아서 오리진 서버(들)에게 전달하는 문지기, 경비 역할을 수행

가용성과 부하 분산은 서버를 설계할 때 안정성과 관련한 중요 고려 대상
가용성:서버, 네트워크 특정 하드웨어 부품을 비롯한 특정 컴퓨터 시스템이 주어진 기능을 실제로 수행할 수 있는 시간의 비율
고가용성: 가용성이 높은 경우 "고가용성 이다" 라고 표현
가용성 =
다운타임의 발생 원인은 나열하기 어려울 정도로 다양함
다운타임의 발생 원인을 모두 찾아 원천 차단하기는 현실적으로 어려운 일
고가용성을 유지하는 것의 핵심은 "애초에 문제가 발생하지 않도록 하는것"이라기보다
"문제가 발생하더라도 계속 기능할 수 있도록 설계하는 것(결함 감내)"에 가까움
즉, 다운타임을 낮추고 가용성을 높이기 위해서는 서비스나 인프라가 결함을 감내할 수 있도록 설계하는 것이 중요
이를 위한 대표적인 기술이 다중화. 서버를 다중화하면 특정 서버에 문제가 발생하더라도 다른 예비 서버가 이를 대신해 동작할 수 있기 때문
과도한 트래픽은 서버의 가용성을 떨어뜨림
서버를 다중화하더라도 특정 서버에만 트래픽이 몰린다면, 즉 트래픽이 고르게 분산되지 않는다면 가용성은 떨어질 수 있음
따라서 하나 이상의 서버가 트래픽을 어떻게 고르게 분산하여 수신할지를 고려해야 함
로드 밸런싱: 트래픽의 고른 분배를 위해 사용되는 기술
로드 밸런서: 다중화된 서버와 클라이언트 사이에 위치하며 클라이언트의 요청(들)을 각 서버에 균등하게 분배하는 역할

로드 밸런싱 알고리즘: 부하가 균등하게 분산되도록 요청을 전달할 서버를 선택하는 방법
"다중화된 모든 서버에 균일한 부하를 부여하는" 전략은 모든 서버의 성능이 동일하다는 전재가 있을 때만 유효함

우측과 같이 성능이 더 좋은 서버에 더 많은 트래픽을 분배하는 것이 합리적
로드 밸런싱 알고리즘에는 이를 반영해 가중치가 부여될 수 있음
즉, 각각의 알고리즘을 바탕으로 동작하되, 가중치가 높은 서버가 더 많이 선택되어 더 많은 부하를 받도록 할 수 있음
실제로 성능이 뛰어난 장비를 사용하면 그렇지 못한 장비를 사용할때와 비교해 가용성이 높아짐
다만 꼭 비싼 장비를 구비하는 것만이 정답은 아님
: 기존 부품을 더 나은 사양으로 교체하는 방법. 수직적 확장 이라고도 함
: 기존 부품을 여러 개로 두는 방법. 수평적 확장 이라고도 함

필요할 때 자원을 자동으로 늘리고, 불필요하면 줄이는 기능
필요 상황
트래픽 급증/급감 상황에서도 서버가 튕기지 않고, 비용도 아끼게 해주는 경제적+탄력적인 확장 기술
대표적인 웹 서버 프로그램으로,
정적 파일 제공 + 리버스 프록시 + 로드밸런싱 + 캐싱 + 보안 기능 등을 지원하는 강력한 툴
1️⃣ http: 웹서버 관련 설정
2️⃣ access log: 웹 서버가 수신한 개별 요청 관련 로그는 '/var/log/nginx/access.log'에 남김
3️⃣ error log: 웹 서버와 관련한 오류 발생 시 오류 관련 로그는 '/var/log/nginx/error.log'에 남김
4️⃣ conf.d: '/etc/nginx/conf.d/' 경로에 놓인 <파일명>.conf의 내용은 모두 웹 서버 관련 설정으로 간주함
...
http {
...
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
...
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
즉 $(nginx)/conf.d의 <파일명>.conf에 담긴 내용은 모두 웹 서버 관련 설정이 됨

1️⃣ 웹 서버 관련 설정(server)으로, 서버 이름(server_name)을 localhost로 삼고, 80번 포트를 LISTEN 상태로 대기(listen)하고 있다는 의미
2️⃣ 특정 경로(URL)에 대한 설정으로, '경로 /(location /)'에 대한 설정을 의미. 바로 다음 행에 있는 'proxy_pass http://backend;'는 '경로 /'에 대한 HTTP 요청은 'backend'라는 서버 그룹으로 넘기겠다는 의미. 즉 'proxy_pass'는 요청을 넘기라는 의미이고, 이 요청을 넘기는 대상이 'backend'인 셈
예시처럼 아무런 로드 밸런싱 알고리즘을 명시하지 않을 경우에는 기본적으로 라운드 로빈으로 동작함
하지만 아래와 같이 로드 밸런싱 알고리즘을 지정할 수도 있음

업스트림: 상위 서버로 데이터를 보내는 방향을 의미. 업스트림 트래픽은 클라이언트에서 오리진 서버로 향하는 트래픽인 셈
다운스트림: 상위 서버에서 클라이언트로 데이터를 보내는 방향을 의미. 오리진 서버가 응답 메시지를 생성해 클라이언트로 보낼 경우, 메시지가 향하는 방향이 다운스트림인 셈

인바운드 트래픽: 트래픽은 단순히 네트워크 외부에서 내부로 들어오는 트래픽을 의미
참고: 북스터디 - 이것이 취업을 위한 컴퓨터 과학이다 (Chapter 5-7)