[Docker] 프록시 패스(Proxy Pass)

류재성's avatar
Jul 19, 2024
[Docker] 프록시 패스(Proxy Pass)
 
 

1. 프록시 패스란?

 
💡
Docker와 Nginx를 사용하여 프록시 패스를 설정하는 것은 여러 서비스나 컨테이너를 외부에서 접근할 수 있도록 하는 방법이다. Nginx를 리버스 프록시로 설정하여 클라이언트 요청을 적절한 Docker 컨테이너로 전달할 수 있다.
 
notion image
 
💡
클라이언트가 server1 을 요청할 때 로비 서버가 응답을 받고, 로비 서버가 server1에 다시 요청한다. 이렇게 되면 server1은 로비 서버의 hearder 값을 받기 때문에 클라이언트의 header 로 값을 대체해서 보내야 한다.
 

2. Nginx 설치하기

💡
Nginx(엔진엑스)는 HTTP 서버, 리버스 프록시 서버, 메일 프록시 서버, 및 로드 밸런서 기능을 제공하는 오픈 소스 소프트웨어이다.
ex05/Dockerfile
From nginx
 
notion image
 
nginx 의 이미지를 생성한다.
 
notion image
 
이미지를 실행한다. nginx 는 기본 포트가 80이기 때문에 포트포워딩으로 8080 포트를 요청하면 80 포트가 접속되게 한다.
 
notion image
 
8080 포트 요청시 nginx 의 index.html 파일이 실행된다.
 

3. 로비 서버, 서버1, 서버 2 만들기

 
notion image
 
패키지를 이렇게 구성한다.
 

3.1 서버 만들기

 
ex06/server1/Dockerfile , ex06/server2/Dockerfile
FROM nginx COPY webapp /usr/share/nginx/html ENTRYPOINT ["nginx", "-g", "daemon off;"]
💡
/usr/share/nginx/html는 nginx가 정적 파일을 저장하는 곳. 여기에 webapp을 카피한다.
ex06/server1/webapp/index.html
<!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>
 
ex06/server2/webapp/index.html
<!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>
 

3.2 로비 서버 만들기

ex06/lb/Dockerfile
FROM nginx COPY conf/nginx.conf /etc/nginx/conf.d/default.conf ENTRYPOINT ["nginx", "-g", "daemon off;"]
 
💡
/etc/nginx/conf.d/default.conf 경로는 일반적으로 기본 서버 설정을 포함하며, 기본적으로 Nginx가 처리할 호스트와 요청 경로를 정의한다.
 
ex06/lb/conf/nginx.conf
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; # 이 세상에 없는 헤더. x 는 통해서 온 ip. lb 를 통해서 옴 remote_addr 를 X-Real-IP 로 치환. 원격지 주소를 알려면 X-Real-IP 를 열어야도 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; } }
 
💡
upstream : Nginx가 요청을 전달할 업스트림 서버를 설정한다. 172.17.0.1 는 내부와 통신을 하기 위한 게이트 웨이 주소이며, 내부의 각 서버는 172.17.0.2 , 172.17.0.3 같이 순차적으로 증가한다. 이렇게 정확한 IP 주소를 적을 때는 172.17.0.2:80 과 같이 정확한 포트 번호를 적어야 하며, 게이트 웨이 주소를 적을 때는 포트 포워딩을 사용해 172.17.0.1:8001 처럼 포트번호를 구분해야 한다. location /server1 : server1 경로로 들어오는 요청에 대한 처리를 정의한다. proxy_pass : 요청을 프록시하는 대상을 지정한다.
proxy_redirect off : 프록시 응답에서 리디렉션 헤더를 변경하지 않도록 설정한다. proxy_set_header : 프록시 패스를 통해 전달되는 요청에 헤더를 설정한다.
 
X-Real-IP, X-Forwarded-For, X-Forwarded-Host : 중간 프록시나 로드 밸런서를 거친 요청의 경우에도 클라이언트의 IP 주소를 식별하기 위한 헤더

4. 빌드하기

 
notion image
notion image
notion image
 
로비 서버, 서버 1 , 서버 2 의 이미지를 각각 만든다.
 
notion image
 
서버 2개를 각각 실행한다.
 
notion image
포트가 8001 을 입력하면 프록시 패스로 서버 1가 실행된다.
 
notion image
 
포트가 8002 을 입력하면 프록시 패스로 서버 2가 실행된다.
Share article
RSSPowered by inblog