logoStephen's 기술블로그

포스트 검색

제목, 태그로 포스트를 검색해보세요

#009 #Lobby 서버 라우팅

#009 #Lobby 서버 라우팅
Docker
성훈 김
2024년 6월 12일
목차

👉 ex06 : Lobby 서버팅(로드밸런싱)

notion image
폴더구조 세팅! 아무것도 없으면 이름 이상해지니까 .keep 만들어 놓자.
폴더구조 세팅! 아무것도 없으면 이름 이상해지니까 .keep 만들어 놓자.
 

🔹 파일도 세팅

notion image
아래 깃 주소 들어가서 ex04에 있는 프로젝트 내부 파일을 현재 내프로젝트 폴더구조에 저장하면 된다.
아래 깃 주소 들어가서 ex04에 있는 프로젝트 내부 파일을 현재 내프로젝트 폴더구조에 저장하면 된다.
docker-study
codingspecialistUpdated Apr 16, 2024
nginx 설정 정리 꼭 공부하기
nginx 설정 정리 꼭 공부하기
 

👉 개념 정리

notion image
클라이언트가 요청을 하면 로비서버가 받아서 로비서버가 S1, S2에 요청을 하게 된다. 
이 때 일어나는 것이 PROXY패스

이 설정은 XSS 공격을 막기 위해서 s1에서는 모든 자바스크립트의 요청을 차단한다. 
그래서 로비서버 같은 것이 필요하다.
S1은 로비서버의 모든 요청을 허용한다.
클라이언트가 요청을 하면 로비서버가 받아서 로비서버가 S1, S2에 요청을 하게 된다. 이 때 일어나는 것이 PROXY패스 이 설정은 XSS 공격을 막기 위해서 s1에서는 모든 자바스크립트의 요청을 차단한다. 그래서 로비서버 같은 것이 필요하다. S1은 로비서버의 모든 요청을 허용한다.
 
notion image
하지만 로비서버로 요청을 받게 되면, 로비서버의 정보가 헤더에 담기기 때문에
S1에서는 로비서버의 정보가 필요한게 아니라 클라이언트의 헤더가 필요한 상황이다.
하지만 로비서버로 요청을 받게 되면, 로비서버의 정보가 헤더에 담기기 때문에 S1에서는 로비서버의 정보가 필요한게 아니라 클라이언트의 헤더가 필요한 상황이다.
 
notion image
A라는 클라이언트가 B에 요청할 때, 직접적으로 요청하는 것이 아니라, 
NginX같은 프록시 서버로 통해서 B로 요청한다. 

이때 C는 A에게 리다이렉션을 하라고 응답하지 않고, A의 요청을 프록시 패스로
그대로 B에게 A의 요청을 전달한다. 

프록시 패스를 사용하면 같은 도메인에 묶어서 요청을 하게 만들 수 있기 때문에,
CORS 설정을 안하도록 하게 할 수 도 있다.
A라는 클라이언트가 B에 요청할 때, 직접적으로 요청하는 것이 아니라, NginX같은 프록시 서버로 통해서 B로 요청한다. 이때 C는 A에게 리다이렉션을 하라고 응답하지 않고, A의 요청을 프록시 패스로 그대로 B에게 A의 요청을 전달한다. 프록시 패스를 사용하면 같은 도메인에 묶어서 요청을 하게 만들 수 있기 때문에, CORS 설정을 안하도록 하게 할 수 도 있다.
 
notion image
s1에서는 로비서버의 헤더가 필요한 것이 아니라 클라이언트의 헤더가 필요하다.
s1에서는 로비서버의 헤더가 필요한 것이 아니라 클라이언트의 헤더가 필요하다.
notion image
S1에서는 20번 주소를 읽어야 되는데, 이렇게 remote Addr이 치환이 되면,
치환이 되었다는 기록을 X-Real-IP를 남기게 된다. 
그러므로 이게 보이면 아, 이건 다른 곳에서 오는 거구나 라고 생각하면 된다.
그리고 치환이 되어서 요청이 온것들은 모두 X가 붙는다.

하지만 f12눌려서 개발자 도구로 확인할 수 없는 까닭은 브라우저가 보안상 모든 정보를 노출 시키지 않기 때문이다.
S1에서는 20번 주소를 읽어야 되는데, 이렇게 remote Addr이 치환이 되면, 치환이 되었다는 기록을 X-Real-IP를 남기게 된다. 그러므로 이게 보이면 아, 이건 다른 곳에서 오는 거구나 라고 생각하면 된다. 그리고 치환이 되어서 요청이 온것들은 모두 X가 붙는다. 하지만 f12눌려서 개발자 도구로 확인할 수 없는 까닭은 브라우저가 보안상 모든 정보를 노출 시키지 않기 때문이다.
 
 

🔹 lb 전체코드

nginx.conf
Java
upstream server1 {
    server 172.17.0.1:8001;
}

upstream server2 {
    server 172.17.0.1:8002;
}

server {
    listen       80;
    server_name  localhost;

    location /server1 {
        proxy_pass http://server1/;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }

    location /server2 {
        proxy_pass http://server2/;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }
}
Dockerfile
Java
FROM nginx

COPY conf/nginx.conf /etc/nginx/conf.d/default.conf

ENTRYPOINT ["nginx", "-g", "daemon off;"]

🔹server1 전체코드

index.html
Java
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Welcome Nginx Server1</h1>
</body>
</html>
Dockerfile
Java
FROM nginx

COPY html /usr/share/nginx/html

ENTRYPOINT ["nginx", "-g", "daemon off;"]

🔹server2 전체코드

index.html
Java
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Welcome Nginx Server2</h1>
</body>
</html>
Dockerfile
Java
FROM nginx

COPY html /usr/share/nginx/html

ENTRYPOINT ["nginx", "-g", "daemon off;"]
 

👉서버 만들기

🔹 빌드하기

Java
일단 server1 / serve2 / lb 순대로 빌드를 하자.
notion image
Java
docker build -t server1 ./server1
docker build -t server1 ./server2
docker build -t lb ./lb
빌드 하는데, ./ 키워드를 사용하면 현재 위치의 server1 폴더를 찾아서 Dockerfile을 실행한다.
빌드 하는데, ./ 키워드를 사용하면 현재 위치의 server1 폴더를 찾아서 Dockerfile을 실행한다.
 

🔹 실행하기

notion image
이 순서대로 백그라운드로 실행하면 되는데, 
포트 번호를 이렇게 한 이유는 nginx.conf를 잘 확인해야된다.
이 순서대로 백그라운드로 실행하면 되는데, 포트 번호를 이렇게 한 이유는 nginx.conf를 잘 확인해야된다.
notion image
위 그림에서 보듯이, 
로비서버에서 요청을 받아서 포트포워딩으로 전달 하는 그림인건데
위 그림에서 보듯이, 로비서버에서 요청을 받아서 포트포워딩으로 전달 하는 그림인건데
notion image
/server1으로 url 요청이 들어오면 172.17.0.1:8001로 할당을 한다.

그래서 docker run으로 포트 포워딩으로 8001:80이런 설정을 해준다. (아래에 예시)
/server1으로 url 요청이 들어오면 172.17.0.1:8001로 할당을 한다. 그래서 docker run으로 포트 포워딩으로 8001:80이런 설정을 해준다. (아래에 예시)
notion image
이렇게 서버 세개를 띄운다.
이렇게 서버 세개를 띄운다.
 
notion image
localhost/server2 형식으로 localhost: 8002번을 때리기를 할 수 있다.
localhost/server2 형식으로 localhost: 8002번을 때리기를 할 수 있다.
notion image
결국 이런 그림으로 server2로 요청이 가게 된다.
결국 이런 그림으로 server2로 요청이 가게 된다.
 

🔹 컨테이기

notion image
 
notion image
inspect로 컨테이너 정보를 확인 할 수 있다.
inspect로 컨테이너 정보를 확인 할 수 있다.
 
notion image