저번 포스팅에서 ec2 인스턴스 환경에 도커를 설치하고 nginx를 pull하여 접속하는 것 까지 해봤습니다. 이번이는 이어서 nginx 세팅
sudo su
docker exec -it nginxserver bash
ls
ls로 폴더와 파일을 확인합니다.
여기서 ect/ 입력후 탭 두 번누르면 etc안에 있는 폴더와 파일들을 볼 수 있습니다.
여기서 nginx 폴더안에 conf.d 폴더로 접속합니다.
nginx/conf.d/
여기서 conf.d 폴더 안에 default.conf 파일이 nginx 설정 파일입니다.
default.conf
리눅스의 CLI환경에서는 default.conf파일을 수정하기 위해선 vim 텍스트 에디터를 사용 해야 합니다.
vim default.conf
그러나 command not found라고 나옵니다. 왜 그럴까요??
그 이유는 도커 컨테이너는 nginx 서버만 가지고있는 상태이고, vim 에디터가 설치 되어있지 않기 때문입니다. 그래서 vim 에디터를 설치 해줘야 합니다.
apt-get update
apt-get upgrade
이렇게 해당 패키지를 최신화 시켜준 후 설치를 진행합니다.
apt-get install vim
설치를 완료했다면 vim d만 누른 후 tab을 누르면 해당 폴더에 있는 비슷한 이름의 파일을 자동완성 시켜줍니다.
vim에디터로 접속하면
이렇게 소스코드를 변경할 수 있습니다.
vim 에디터 에서는 코드가 바로 변하지 않습니다.
a(append)나 i(insert)를 누르면 좌측 하단에 --INSERT--가 나오고, 이때 편집이 가능합니다.
esc를 누르면 편집모드를 다시 나갑니다.
vim 에디터 자체를 나가고 싶다면
shift와; 같이 누른 후 q 누르면 다시 커맨드 창으로 돌아옵니다.
q만 입력 -> 저장하고 나간다.
q!를 입력 -> 저장안하고, 강제로 나간다.
vim default.conf
입력 후 vim 에디터로 들어옵니다.
들어와서 a를 누른후
upsstream bule{
server ec2프라이빗ip:8080;
}
upstream green{
server ec2프라이빗ip:8081;
}
이렇게 입력합니다. 8080과 8081을 사용할 겁니다. 두 포트를 쓰는 이유는 스프링부트 yaml파일 세팅할 때 자세히 설명하겠습니다.
여기서 upstream은 Nginx에서 로드 밸런싱을 설정할 때 사용하는 지시어로, 여러 서버에 대한 그룹을 정의할 수 있습니다.
로드 밸런싱이 무엇일까요?
네트워크나 애플리케이션 서버 등에서 발생하는 부하를 여러 대의 서버에 고르게 분산시켜서 처리하는 기술입니다. 이는 다수의 클라이언트 요청을 여러 서버로 분배함으로써 단일 서버의 과부하를 방지하고, 전체 시스템의 성능과 가용성을 향상시키는 것을 목적으로 합니다.
다음으로 location에 코드를 추가해봅시다.
위 그림과 같이
proxy_pass http://$service_url
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_Add_x_forwarded_for;
proxy_set_header Host $Htpp_host
이렇게 추가해줍니다.
proxy_pass http://$service_url
proxy_set_header는 HTTP 요청 헤더를 설정하는 역할입니다.
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Forwarded-For $proxy_Add_x_forwarded_for;
proxy_set_header Host $Http_host
include etc/nginx/conf.d/service-env.inc;
etc/nginx/conf.d/ 경로 안에 service-env.inc 파일을 만들겁니다.
service-env.inc 파일 안에 service_url변수에 값을 넣을 예정입니다.
만약 service_url변수에 blue가 들어가 있으면 저 위치가 proxy_pass http://blue가 되고, upstream blue를 찾아가게 됩니다. 그래서
upsstream bule{
server ec2프라이빗ip:8080;
}
여기의 server ec2프라이빗ip:8080; 이 주소를 찾아갑니다. green 이면? 동일하게 upstream green 주소를 찾아 갑니다.
그렇기 때문에 proxy_pass가 유동적이어야 되기 때문에 service_url 변수를 지정하는 것입니다.
include etc/nginx/conf.d/service-env.inc; 여기에 service_url 변수를 넣어 둘거라는 의미라고 생각하면 됩니다.
이제 저장하고 나가볼까요?
:wq (w:저장,q:나가기)
위에서 etc/nginx/conf.d/경로에 존재하지 않는 service-env.inc 파일을 하나 만들었습니다.
그러면 service-env.inc파일을 만들어야 겠죠?
vim service-env.inc
를 입력하면,
빈 에디터가 나옵니다.
여기서 파일을 설정합니다.
:wq 저장하고 나갑니다.
여기서 ls 를 입력해보시면,
이렇게 파일이 추가된 것을 확인 할 수 있습니다.
vim으로 확인할 수 있지만, 콘솔에서 간단히 확인하기위해 cat명령어를 사용하여 확인합니다.
cat service-env.inc
이렇게 service-url이 green으로 설정된 것을 확인하고,
cat default.conf
default.conf를 열어보면
다음과 같이 나옵니다. 여기서 중점적으로 볼 부분은 빨간줄 입니다.
include /etc/nginx/conf.d/안에있는 service-env.inc파일을 가져오라는 내용이 있습니다.
그러면 service_url 변수를 사용할 수 있게 된 겁니다.
proxy_pass의 service_url은 green으로 되어 있는겁니다.
nginx 탄력적IP를 사용합니다. 1.1.1.1이라고 가정하면 뒤에 :80은 생략할 수 있다고 했습니다.
그러면 1.1.1.1로 접속하면 우분투안에 해당 nginx서버로 접속합니다.
접속하면 proxy_pass는 중간대리인이라 생각하면 되는데,
클라이언트에서 스프링부트 서버로간다면 client -> springboot server로 바로가는 것이 아니라 client -> nginx -> springboot server로 한번 거쳐서 접속이 되는 것입니다.
이런 형태로 돌아갑니다.
지금 설정한 포트는 blue(8080),green(8081)입니다. 만약 여러분이 8080 포트에 회원가입 로그인 기능을 만들고, 다른 기능을 추가를 하는 상황이라고 가정해봅시다.
회원가입, 로그인 기능을 만들고, 새로운 기능이 추가된 서버를 다시 열어야 합니다.
즉, 서버가 한번 꺼졌다가 켜져야 됩니다.
그래서 우리는 새로운 기능이 추가된 버전을 사용하기 위해서 이전 버전(8080, 회원가입,로그인만 됨)을 끄고, 다시 새로운 기능이 추가된 버전을 8081 포트(green)로 여는 겁니다.
여기서 8081포트의 서버가 잘 동작이 된다면 nginx에서 가리키고 있는 blue를 green으로만 바꿔주면 됩니다.
그러면 중간에 서버가 꺼졌다가 켜지는 시간을 없앨 수 있습니다.
green(8081)에 다른 기능을 추가한다면?
blue에 새로운 기능을 또 추가하고 동작한다면 동일하게 blue로 바꿔주고, green을 꺼줍니다.
이렇게 반복적으로 개발을 한다면 중단 없이 서버 배포를 할 수 있습니다.