프록시
프록시 서버란 클라이언트가 자신을 통해서 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용 프로그램을 가리킵니다. 서버와 클라이언트 사이에 중계기로서 대리로 통신을 수행하는 것을 가리켜 '프록시', 그 중계 기능을 하는 것을 프록시 서버라고 부릅니다.
프록시 서버는 크게 포워드 프록시 서버, 리버스 프록시 서버로 나눠집니다. 그리고 리버스 프록시 서버를 설명하기 전에 프록시 서버에 대해 먼저 이해하려면 리버스 프록시 서버를 이해하는데 도움이 됩니다.
포워드 프록시 서버란?
간단히 우리가 흔히 말하는 '프록시 서버'란 포워드 프록시 서버를 의미합니다. 프록시 서버는 아래 그림처럼 클라이언트 앞에 놓여 있습니다. 다음 그림을 보면 클라이언트가 인터넷 웹서버에 요청을 보내면 중간에서 그 요청을 프록시 서버가 가로챕니다. 그리고나서 프록시 서버는 해당 요청을 웹서버에게 다시 보내고 웹서버에게 받은 응답을 다시 클라이언트에게 전달합니다.
우선 정부, 학교, 기업 등과 같은 기관은 해당 기관에 속한 사람들의 제한적인 인터넷 사용을 위해 방화벽을 사용합니다. 포워드 프록시 서버는 이런 제한을 두기 위해 사용합니다. 즉, 해당 기관에 속한 사람들이 그들이 방문하고자 하는 웹사이트에 직접적으로 방문하는 것을 방지합니다.
마지막으로 포워드 프록시 서버를 사용하면 유저의 정체를 숨겨줍니다. 인터넷을 사용하는 대부분 유저들은 익명성을 바라는데 프록시 서버를 사용하지 않으면 자신의 정체가 탄로날 수 있습니다. 하지만 포워드 프록시 서버를 사용하면 IP주소를 역추적해도 정체를 파악하기 어렵습니다. 왜냐면 IP추적해도 프록시 서버만 보이기 때문입니다.
리버스 프록시 서버란?
리버스 프록시 서버는 아래 그림 처럼 웹서버 앞에 놓여 있습니다. 포워드 프록시 서버는 클라이언트 앞에 놓여져 있는 반면, 리버스 프록시 서버는 웹서버 앞에 놓여있습니다.
리버스 프록시 서버는 로드 밸런싱에 사용됩니다. 우선 이는 로드밸런싱이 가능합니다. 또한 리버스 프록시를 사용하면 보안에 좋습니다.또한 본래 서버의 Ip주소를 노출시킬 필요가 없습니다. 따라서 해커들의 DDoS공격과 같은 공격을 막는데 유용합니다.
또한 리버스 프록시 서버에는 성능 향상을 위해 캐시 데이터를 저장할 수 있습니다.
실습
실습의 내용이 길어서 핵심만 짚고 지나가겠습니다. ( 필자는 2일 걸림... 강의에서는 버그를 고쳐주지 않음 )
저희는 서버가 꺼져도 잘 돌아가게 하기 위해서 nginx의 리버스 프록시 기능과 웹서버 기능을 사용하도록 하겠습니다.
client -> web Server ( nginx ) :::80 -> uwsgi ( GWI ) -> django -> python function 이 식으로 갑니다.
Django
일단 uwsgi.ini을 설정해 주도록 하겠습니다. ( 컨테이너에서 이를 통해서 apps.sock을 만듬 ) -> django와 통신
/uwsgi.ini
[uwsgi]
socket = /srv/docker-django/apps.sock
master = true
chmod-socket = 777
processes = 1
threads = 2
chdir = /srv/docker-django
module = fastcampus.wsgi:application
logto = /var/log/uwsgi/uwsgi.log
log-reopen = true
vacuum = true
/Dockerfile
FROM python:3
ENV PYTHONUNBUFFERED 1
RUN apt-get -y update
RUN apt-get -y install vim
RUN mkdir /srv/docker-django
ADD . /srv/docker-django
WORKDIR /srv/docker-django
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
이로서 django는 docker-composer를 통해 run될 준비가 된 것입니다.
Nginx
일단 기본적인 nginx.conf를 적어주도록 하겠습니다.
/nginx.conf
user root;
worker_processes auto;
pid /run/nginx.pid;
events {
worker_connections 1024;
# multi_accept on;
}
http {
##
# Basic Settings
##
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;
# server_names_hash_bucket_size 64;
# server_name_in_redirect off;
include /etc/nginx/mime.types;
default_type application/octet-stream;
##
# SSL Settings
##
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
##
# Logging Settings
##
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
##
# Gzip Settings
##
gzip on;
gzip_disable "msie6";
# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
##
# Virtual Host Configs
##
# include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
그리고 uwsgi unix socket과의 통신을 위해 symbolic link를 걸어줄 nginx-app.conf파일을 작성해 주도록 하겠습니다.
/nginx-app.conf
upstream django {
server unix:/srv/docker-django/apps.sock;
}
server {
listen 80;
server_name localhost;
charset utf-8;
location /media/ {
alias /srv/docker-django/.media/;
}
location /static/ {
alias /srv/docker-django/.static/;
}
location / {
uwsgi_pass django;
include /etc/nginx/uwsgi_params;
}
}
그리고 이미지를 빌드할 때 쓰일 Dockerfile을 작성해 주도록 하겠습니다.
/Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
COPY nginx-app.conf /etc/nginx/sites-available/
RUN mkdir -p /etc/nginx/sites-enabled/\
&& ln -s /etc/nginx/sites-available/nginx-app.conf /etc/nginx/sites-enabled/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
간단합니다. nginx이미지를 다운받고 심볼릭 링크를 걸어준다음에 80번 포트를 노출시켜주면 됩니다.
이로서 다음 실습에서 docker-composer를 활용할 준비가 마쳤습니다. 간단히 다음 포스트에서는 docker-composer를 통해 두개의 이미지를 활용하여 컨테이너를 만들어보는 실습을 진행해 보도록 하겠습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - (인프라) AWS Fargate을 통한 배포 (0) | 2022.07.05 |
---|---|
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - (인프라) AWS ECR에 컨테이너 업로드 (0) | 2022.07.05 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Docker Django Build (0) | 2022.07.04 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - (인프라) Docker 개요 (0) | 2022.07.04 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - (백엔드) Django Session 활용2 (0) | 2022.07.04 |