VPC 내부에 Spring Boot EC2가 존재하는데, 여기에 Nginx를 설치하자니 메모리적으로 부담이 될 것이라 생각했습니다. 그래서 Nginx를 위한 별도의 EC2를 같은 VPC 내부에 생성하고 이를 리버스 프록시로 포워딩을 해주고자 합니다.
설치환경은 Ubuntu로 진행하겠습니다.
그전에 몇가지 알아두어야 할 개념들이 있습니다.
Nginx는 웹서버, 리버스 프록시, 메일 프록시의 기능을 가지는 웹 서버 소프트웨어입니다. 리버스 프록시를 통한 로드밸런서의 역할까지 할 수 있습니다.
아파치에 비해 장점은 요청을 Event-Driven 방식을 통해 여러 요청을 동시에 처리할 수 있습니다.
이중에서 Spring Boot라는 내부 서버로 포워딩을 하기 위해 리버스 프록시를 사용하겠습니다.
클라이언트가 프록시 서버로 요청을 보내고, 프록시 서버가 실제 서버와 통신을 진행하여 요청을 전달하는 프록시를 의미합니다. 내부 서버를 외부에 노출시키지 않기 위해 사용합니다.
이를 통해 로드밸런싱, 서버 보안에 우수합니다.
sudo apt-get update
Nginx를 설치합니다.
-> sudo apt install nginx
Nginx를 실행합니다.
-> sudo service nginx start
Nginx가 잘 실행되는지 아래 명령어로 확인합니다.
-> sudo service nginx status
Nginx 설정파일들은 /etc/nginx 아래에 존재합니다. 이곳에서 Nginx로 오는 요청을 어떻게 처리할지, 프록시는 어떻게 할지 등을 설정할 수 있습니다.
클라이언트와 Nginx 프록시 간 설정파일입니다. 타임아웃 설정이나 본문의 크기, 내부 서버로 얼만큼을 보낼지 등을 설정할 수 있습니다.
/etc/nginx/proxy_params
//원래의 호스트 헤더 값을 전달합니다.
proxy_set_header Host $http_host;
//실제 클라이언트의 IP 주소를 전달합니다.
proxy_set_header X-Real-IP $remote_addr;
//클라이언트의 IP와 프록시 서버의 IP를 전달합니다.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
//클라이언트와의 연결 프로토콜(예: http 또는 https)을 전달합니다.
proxy_set_header X-Forwarded-Proto $scheme;
이외에도 여러 설정을 할 수 있습니다.
이 디렉토리는 사이트의 server block이나 virtual host설정을 하는 디렉토리입니다. 각 가상 호스트는 도메인, 서브도메인 또는 IP 주소 별로 웹 서버의 동작을 정의합니다.
해당 폴더 아래에 한번 epimetheus.store 도메인 관련 설정을 작성해보겠습니다.
server {
listen 80;
//api.epimetheus.store이라는 도메인이 아래 요청을 처리함.
server_name api.epimetheus.store;
//log가 저장될 위치. /var/log/nginx 아래에 proxy라는 폴더를 생성해두어야 함.
access_log /var/log/nginx/proxy/access.log;
error_log /var/log/nginx/proxy/error.log;
//루트(/)로 오는 요청에 대해 proxy_params에 있는 설정을 적용해 proxy를 전달하겠다.
location / {
include /etc/nginx/proxy_params;
proxy_pass http://10.100.0.4:8080;
}
}
위 파일을 만들게 됨으로써 nginx로 오는 요청 중 80번 포트로 api.epimetheus.store도메인에 요청이 오면 자동으로 SpringBoot 8080으로 포워딩을 하게됩니다.
여기서 끝내지 않고 enable로 심볼릭링크를 만들어 활성화를 시켜야합니다.
sudo ln -s /etc/nginx/sites-available/api.epimetheus.store /etc/nginx/sites-enabled/
sites-enabled폴더에 심볼릭링크를 만들어 활성화를 시킬 수 있습니다.
여기선 실제로 Nginx가 불러올 도메인들이 연결되어 있습니다. sites-available은 단순히 추후 사용하기 위해 만들어둔 config도 존재하지만, enabled에 존재하는 도메인들은 nginx.conf에서 불러오기 때문에 실제 서비스에 적용됩니다.
nginx.conf에서 아래와 같이 sites-enabled를 include합니다.
/etc/nginx/sites-available
아래로 이동합니다.
도메인명을 가진 파일을 만들고 아래의 코드를 작성합니다.
-> ex) sudo vi api.epimetheus.store
server {
listen 80;
//api.epimetheus.store이라는 도메인이 아래 요청을 처리함.
server_name api.epimetheus.store;
//log가 저장될 위치. /var/log/nginx 아래에 proxy라는 폴더를 생성해두어야 함.
access_log /var/log/nginx/proxy/access.log;
error_log /var/log/nginx/proxy/error.log;
//루트(/)로 오는 요청에 대해 proxy_params에 있는 설정을 적용해 proxy를 전달하겠다.
location / {
include /etc/nginx/proxy_params;
proxy_pass http://10.100.0.4:8080;
}
}
/etc/nginx/nginx.conf
파일을 열어 types_hash_max_size 부분에 주석을 해제합니다.
-> 이를 통해 도메인을 해싱해두어 빠르게 접근가능합니다
sudo ln -s /etc/nginx/sites-available/[2에서 만든파일] /etc/nginx/sites-enabled/
로 심볼릭 링크를 생성합니다.
default 파일은 충돌이 발생하므로 삭제합니다.
sudo rm /etc/nginx/sites-available/default
sudo rm /etc/nginx/sites-enabled/default
Nginx설정파일이 문제없이 빌드가 되는지 확인합니다.
sudo nginx -t
새로운 설정파일을 적용하기 위해 Nginx를 Reload합니다.
sudo service nginx reload
이제 해당 Nginx로 접속하면 바로 Spring 서버로 연결됩니다.