1. 프록시 패스란?
Docker와 Nginx를 사용하여 프록시 패스를 설정하는 것은 여러 서비스나 컨테이너를 외부에서 접근할 수 있도록 하는 방법이다. Nginx를 리버스 프록시로 설정하여 클라이언트 요청을 적절한 Docker 컨테이너로 전달할 수 있다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252Fbe27b70c-4cac-44f9-af79-f2502aeb718c%252FUntitled.png%3Ftable%3Dblock%26id%3Daa8f0835-e8d7-48cf-89e7-e0db8ea2c954%26cache%3Dv2&w=3840&q=75)
클라이언트가 server1 을 요청할 때 로비 서버가 응답을 받고, 로비 서버가 server1에 다시 요청한다. 이렇게 되면 server1은 로비 서버의 hearder 값을 받기 때문에 클라이언트의 header 로 값을 대체해서 보내야 한다.
2. Nginx 설치하기
Nginx(엔진엑스)는 HTTP 서버, 리버스 프록시 서버, 메일 프록시 서버, 및 로드 밸런서 기능을 제공하는 오픈 소스 소프트웨어이다.
ex05/Dockerfile
From nginx
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F5ffb9d18-99b1-42c4-83b9-8d2dfa8797e4%252FUntitled.png%3Ftable%3Dblock%26id%3Ded39014d-2bea-4de3-a581-3e3dd3efcf67%26cache%3Dv2&w=3840&q=75)
nginx 의 이미지를 생성한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F9a16eec2-4753-4665-b471-af64394785f2%252FUntitled.png%3Ftable%3Dblock%26id%3D0d34a126-2069-42d0-9683-6dfe5ed78d9c%26cache%3Dv2&w=3840&q=75)
이미지를 실행한다. nginx 는 기본 포트가 80이기 때문에 포트포워딩으로 8080 포트를 요청하면 80 포트가 접속되게 한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F7bc70fed-8d66-400e-8277-e701b6b774cc%252FUntitled.png%3Ftable%3Dblock%26id%3D8d14de72-492c-47a4-b2b7-146201d5e4ab%26cache%3Dv2&w=3840&q=75)
8080 포트 요청시 nginx 의 index.html 파일이 실행된다.
3. 로비 서버, 서버1, 서버 2 만들기
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F60437faf-ef1b-462b-8579-b04df3c09b5b%252FUntitled.png%3Ftable%3Dblock%26id%3D85abaf44-b2f7-44ff-9abe-e4e7e5676b78%26cache%3Dv2&w=3840&q=75)
패키지를 이렇게 구성한다.
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](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252Fa04c28c0-c3f0-4d61-881e-56490d5a15d7%252FUntitled.png%3Ftable%3Dblock%26id%3D9c1b36d0-d78d-4ca1-9a78-d3a8dffa59b4%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F732e8fe7-5ade-41e5-a38b-8fc6ab2384e5%252FUntitled.png%3Ftable%3Dblock%26id%3Df234d884-7b83-44b5-a607-c6135929ba48%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252Fc3c9463e-83fb-4a6a-9b6e-8cb806ba7252%252FUntitled.png%3Ftable%3Dblock%26id%3De408ef47-f529-416d-a99f-6628290cc2c0%26cache%3Dv2&w=3840&q=75)
로비 서버, 서버 1 , 서버 2 의 이미지를 각각 만든다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252Fbabd48cd-0bfb-44ed-ba4b-64721c05df14%252FUntitled.png%3Ftable%3Dblock%26id%3D48fdab83-19d2-4419-9c42-135e9ac4496a%26cache%3Dv2&w=3840&q=75)
서버 2개를 각각 실행한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F40d7a3da-54e9-458a-9c56-19061ff312e8%252FUntitled.png%3Ftable%3Dblock%26id%3D2ee3d66b-faa7-4cd7-a4ce-daec0f32b68b%26cache%3Dv2&w=3840&q=75)
포트가 8001 을 입력하면 프록시 패스로 서버 1가 실행된다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F314deac1-3824-46b8-914f-9a32c5e4982b%252FUntitled.png%3Ftable%3Dblock%26id%3D66a43f44-a4d2-4f6c-9ae6-6c8a44a8fcaf%26cache%3Dv2&w=3840&q=75)
포트가 8002 을 입력하면 프록시 패스로 서버 2가 실행된다.
Share article