프록시

앵우·2025년 3월 10일
post-thumbnail

트랜잭션을 공부하다 프록시라는 개념을 마주했다. 평소에 프록시 개념이 잘 안 잡혀있기도 했고 이 때 동아리 부서에서 리버스 프록시를 구성했어야 해서 리버스 프록시를 설정할 수 있는 예시와 프록시 패턴에 관한 글을 쓰겠다.

프록시란?

  • 영단어로 직역하면 '대리' 또는 '중계'라는 의미
  • 서버와 클라이언트 사이의 중계 역할 자체를 프록시(Proxy)라고 하고, 그 중계 기능을 하는 장치 또는 응용 프로그램을 프록시 서버라고 한다.
  • 네트워크 구조에서 프록시 서버가 사용되는 위치에 따라 Forward Proxy와 Reverse Proxy로 구분된다.

프록시를 사용하지 않는 경우

포워드 프록시

  • 프록시 서버가 외부 Web 서버와 통신을 한다.
  • 클라이언트 ↔ 프록시 서버 ↔ 외부 Web 서버
  • 클라이언트는 프록시 서버만을 통해 정보를 얻고 Web 서버쪽에서는 프록시 서버를 통한 액세스 로그가 남는다.
  • 어떤 프록시 서버를 경유하도록 할 것인가는 클라이언트가 설정할 수 있다.

장점

  • 캐시 저장(액세스 고속화)
  • URL 필터링

리버스 프록시

  • Web 서버 쪽에 위치하여 클라이언트의 접근을 최초로 받아 요청에 해당하는 Web 서버에 배분해주는 역할
  • 클라이언트에서 요청을 프록시 서버에 집약해서 URL에 따라 요청을 받을 Web 서버가 바뀌도록 설정
  • 클라이언트의 입장에 있어서는 프록시 서버가 Web 서버와 같은 동작을 하므로 Web 서버가 여러 개 존재하는 것을 은폐할 수 있는 특징

장점

  • 부담 분산
  • 캐시의 저장
  • 시큐리티 대책, 바이러스 대책

📍 포워드 프록시는 클라이언트 앞에 위치하여 대신 서버와 통신
📍 리버스 프록시는 서버 앞에 위치하여 클라이언트로의 요청을 서버로 처리


레퍼런스
https://jmdwlee.tistory.com/40
https://maker5587.tistory.com/47

Nginx로 구성해보는 리버스 프록시 서버

우리 동아리는 홈페이지를 가지고 있는데 동아리방 이사로 인해서 동방 서버 복구 작업을 우리 관리부가 열심히 했다.. 이렇게 동방 서버도 말짱하지 않은 상황에서 2층 서버실이 공사를 했다.. 그래서 일단 2층 서버에 있던 홈페이지를 동방 서버에서 복구하는 게필요했다!

프록시 서버 요구사항

  • VM들의 포트가 80, 443이 열려 있지 않고 만번 대 이상의 보기 안 좋은 포트만 열려 있었다.

  • 이러한 포트들을 피하고자 리버스프록시 서버 도입(80, 443을 두기 위해)

선택

  • cloudflare 등 프록시 서버를 제공해주는 기업이나 서비스가 있다.

  • 하지만 나는 aws 프리티어 계정을 가지고 있었고 이전에 nginx 서버 경험이 있었을 뿐만 아니라 2월이면 서버실 공사가 끝나서 잠시동안만이라 추가적인 학습 없이 빠르게 작업할 수 있는 nginx 서버를 활용해보기로 했다.

구성
nginx 서버로 요청이 들어오면 -> 동아리 홈페이지 주소로 보내준다

이는 nginx 설정 파일 작성으로 이루어질 수 있는데
이전에는 nginx의 리버스 프록시로 8080 포트에서 실행중인 스프링 서버로 요청을 전달하는데 이를 동아리 홈페이지 주소로 가도록 수정해주었다.

server {    # HTTP(80번 포트) 요청을 처리하는 서버 블록
    access_log /home/ubuntu/techdpt/log/access.log;
    error_log /home/ubuntu/techdpt/log/error.log;

    listen 80;
    server_name localhost;
    return 301 https://$server_name$request_uri;  # HTTPS 요청으로 리다이렉트
}

server {    # HTTPS(443번 포트) 요청을 처리하는 서버 블록
    access_log /home/ubuntu/techdpt/log/access.log;
    error_log /home/ubuntu/techdpt/log/error.log;

    listen 443 ssl;
    server_name localhost;

    # 인증서 경로를 넣어준다 sudo certbot certificates 명령어로 확인 가능
    ssl_certificate /etc/letsencrypt/live/techdpt.52.64.79.4.sslip.io/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/techdpt.52.64.79.4.sslip.io/privkey.pem; # managed by Certbot

    location / {   # nginx의 리버스 프록시 이용 - 요청을 nginx에서 먼저 받아 서버로 전달
        proxy_pass http://{우리동아리 홈페이지 주소};   # 동아리 홈페이지 주소로 가도록 함
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
    }
}

약간의 삽질..

nginx 기본 설정 파일을 작성하고 sudo systemctl start nginx(중지된 상태에서 새로 시작) 명령어를 통해 nginx를 재실행했는데

sudo systemctl reload nginx(기존 연결은 유지하면서 새로운 설정 반영)를 했어야 했다..

프록시 패턴

원래 객체에 대한 접근을 제어하며, 요청이 원래 객체에 전달되기 전 또는 후에 무언가를 수행할 수 있도록 한다.

  • 초기화 지연, 로깅, 액세스 제어, 캐싱 등
createTransactionIfNecessary();
try {
    callMethod();
    commitTransactionAfterReturning();
} catch (exception) {
    completeTransactionAfterThrowing();
    throw exception;
}

0개의 댓글