2024. 3. 12. 15:47ㆍServer
서버가 처리량 많아 문제가 생겨
서버를 확장 할 경우에 대표적으로 2가지 방법이 있다
바로 Scale Up과 Scale Out이다
먼저 Scale Up은 더 좋은 서버로 갈아주는 것이다
대표적으로 더 코어와 쓰레드가 많고 클럭이 높은 CPU나 더 많은 RAM용량 더 좋은 인터넷 회선으로 변경등이 있다.
이 방법은 간단하고 확실하게 서버의 처리량을 늘릴 수 있지만
돈이 많이 들고 서버가 한 대이기 때문에 그 서버가 터지면 서비스도 다운 된다.
Scale Out은 서버를 여러대로 늘리는 것이다.
Scalue Up보다는 고려할 점이 많고 새로운 기술및 관리가 필요하지만
추가적인 확장이 유연하게 가능하고 한 대의 서버가 다운 되더라도 서비스 전체가 다운 되지는 않는다.
이번 포스트에서는 서버를 여러대로 늘렸을 때 각각의 서버에 요청을 분배하는 Load Balancing을 Nginx로 구현 하겠다.
우선 Nginx는 Docker에 올려서 사용 할 것이기 때문에 세팅을 하겠다


Image를 다운 받아서 Container를 올리면

etc/nginx에 설치 되어 있다
nginx를 사용하려면 nginx.conf를 수정해야 하는데
여기서 수정하려고 하면 불편하니
VsCode등을 사용하기 위해 직접 파일을 하나 만들거나
docker -cp {container name}:/etc/nginx/nginx.conf {dir}/nginx.conf로 파일을 옮겨주자
ex) docker -cp clever-mayer:/ect/nginx/nginx.conf ./nginx.conf
그리고 docker-compose를 이용해서


수정한 nginx.conf를 집어넣어 container를 만들고 포트를 설정 해 주었다.
이제 nginx.conf를 수정하여 nginx를 Load Balancer로 사용해 보겠다
worker_processes auto;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream origin {
server host.docker.internal:5001;
server host.docker.internal:5002;
}
server {
listen 8000;
server_name localhost;
location / {
proxy_pass https://origin;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
여러 설정이 있지만 자세한 내용은 학습중이니 우선 중요한 Load Balancing에 대한 부분만 다루겠다
http{}안에 upstream과 server{} 그리고 server{}안의 location이다
우선 upstream 뒤의 origin은 명칭이다 이건 변수라 여러 이름의 upstream을 만들고 필요할 경우 사용 할 수 있다.
안의 server의 host.docker.internal:5001; 는 nginx를 통과해 가게될 서버의 주소이다.
local에서 실행하면 localhost:5001;이겠지만 docker에서 실행하므로 바꾸어 주었다
위 케이스는 두 개의 localhost:5001과 localhost:5002로 나누어져 요청이 전달 된다
전달하는 알고리즘도 설정 할 수 있으나 위 예시는 따로 설정을 안 했으니
default 설정인 라운드 로빈으로 설정 되었다.
server{}의 listen은 요청을 받는 포트이다 위의 경우에는 8000번 포트로 요청이 들어오면 설정한 서버로 요청이 전달 된다.
location / {}안의 proxy_pass는 요청되는 서버 주소이다. 아까 설정한 upstream의 주소가 여기에 들어가서 설정 된다.

localhost:8000으로 접속하니 설정해둔 서버로 접속이 되었다.


라운드 로빈으로 설정해서 차례대로 서버에 접속이 된 것을 확인 할 수 있다
'Server' 카테고리의 다른 글
| Github Action과 배포 자동화 (1) | 2024.11.29 |
|---|---|
| JWT (0) | 2024.01.13 |
| Http의 한계와 WebSocket (0) | 2023.08.16 |
| Session, Cookie, Token (0) | 2023.08.16 |
| Winsock2.h를 이용한 TCP 통신 (0) | 2023.08.11 |