본문 바로가기
AWS

web-was-db 완벽한 분리 3Tier 구축 설명

by Nirah 2023. 3. 15.

 

 

 

지금은 성공했지만 원래 중간 온프레미스 프로젝트 할 때 WAS와 WEB을 완전히 분리하는 것에 실패했었다.

쿠버네티스 상으로 구축하다보니, WEB의 Nginx Config파일을 Configmap에 환경변수로 저장해서 구동하는 것을 계획했는데, 아예 그 config 파일을 만져서 리버스 프록시를 구현하는 것에 실패했었기 때문이다.

 

리버스 프록시는 왜 필요할까?

사실 WEB과 WAS에는 서비스에 대한 코드가 들어있다.

근데 이 코드는 온전히 WEB과 WAS 서버 안에서 돌아가는 것이 아니라,

사용자가 외부에서 요청을 하면 코드 자체를 사용자의 엔드포인트 단말에 전송해주는 역할인 것이다..

우리가 지금 이 페이지에서도 F12 버튼을 누르면 오른쪽에 개발자 코드가 보이는 것도 다 전송 받아서 그렇다.

아니 그러면 WEB과 WAS는 분리되기 힘들다.

사용자는 WEB과 통신해서 정적인 데이터와 코드를, WAS와 통신해서 동적인 데이터와 코드를

각각 따로 받아와야하는 것이다.

 

우리가 원하는 완벽히 단절된 3Tier 그림은 WAS와 사용자가 직접 다이렉트로 통신하는 것이 아니라 WEB을 중간에 거쳐서 통신하는 것이다.

이때 필요한게 리버스 프록시 기술이다.

WEB인 Nginx가 리버스 프록시 설정을 통해 WAS에 트레픽을 전달하는 흐름이여야 한다.

이는 어떻게 구현하냐면 프론트엔드(웹페이지) 코딩과 합작하면 된다.

WEB인 Nginx에서 정적 데이터 요청에 대해선 80번 포트로 받고 그건 자기 자신이 처리한다.

그리고 동적 데이터 요청은 8000번으로 받고 그건 WEB이 WAS로 넘기도록 config를 설정한다.

 

중간 온프레미스 프로젝트에선 이런 부분이 실패하여

프론트 쪽 코딩에서도 사용자가 그냥 WAS에 바로 동적 데이터 요청을 했었다. 

근데 그럴 필요 없이 이젠 WEB에 8000번으로 요청하면 WEB이 WAS에게 알아서 요청해준다.

이것이 리버스 프록시 설정.

 

 

 

 

 

 

 

 

AWS EC2에 적용되어 성공한 리버스 프록시 설정이 들어간 nginx.conf 파일

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    types_hash_max_size 4096;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    # Load modular configuration files from the /etc/nginx/conf.d directory.
    # See http://nginx.org/en/docs/ngx_core_module.html#include
    # for more information.
    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /efs/web;
        


        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;



        location /test {
                add_header 'Content-Type' 'text/plain';
                return 200 "From=$hostname";
        }

        location / {
                try_files $uri $uri/ /index.html;
        }

        location /proxy {
                proxy_pass http://internal-was-lb-1428530271.us-east-1.elb.amazonaws.com:8000;
                #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-Proto $scheme;
        }
        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }
    }
}
                                                                                                                                                         67,1          Bot

 

 

# nginx reload