트랜잭션을 공부하다 프록시라는 개념을 마주했다. 평소에 프록시 개념이 잘 안 잡혀있기도 했고 이 때 동아리 부서에서 리버스 프록시를 구성했어야 해서 리버스 프록시를 설정할 수 있는 예시와 프록시 패턴에 관한 글을 쓰겠다.
프록시를 사용하지 않는 경우
포워드 프록시
장점
리버스 프록시
장점
📍 포워드 프록시는 클라이언트 앞에 위치하여 대신 서버와 통신
📍 리버스 프록시는 서버 앞에 위치하여 클라이언트로의 요청을 서버로 처리
레퍼런스
https://jmdwlee.tistory.com/40
https://maker5587.tistory.com/47
우리 동아리는 홈페이지를 가지고 있는데 동아리방 이사로 인해서 동방 서버 복구 작업을 우리 관리부가 열심히 했다.. 이렇게 동방 서버도 말짱하지 않은 상황에서 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;
}