240227 젠킨스(무중단배포와 로드밸런싱)
서비스 3개를 배포하기 위해 워커1, 2, 3의 exec command를 위와 같이 변경한다.
워커1에서는 잘 수행되지만
워커2와 3은 자바가 설치되어있지 않기 때문에 수행되지 않는다.
또한 자바가 돌고 있는 상황에서 또 자바를 돌리려고 하면 오류가 난다.
따라서 배포 스크립트는
기존에 돌고 있던 애를 종료시킨 뒤에 배포를 진행하도록 작성해야 한다.
자바 관련 프로세스 전체 kill
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
만약 자바 관련 프로세스가 실행되고 있다면 종료시키고 다시 실행할 수 있도록
워커 1, 2, 3 Exec Command 상단에 추가로 작성한다.
자바 설치를 안 했기 때문에 이렇게 한다고 워커 2, 3에서 curl localhost:8080이 되는 건 아니다!!
apt install git
apt install openjdk-17-jdk -y
워커 2, 3에 위와 같이 깃과 자바를 설치한다.
또한 서비스 3개를 작동하려면
스프링부트를 백그라운드에서 실행해야 한다.
포그라운드에서 실행하면 스프링부트를 종료하기 전까지는 동일 터미널에서 명령을 못받기 때문이다.
동일 터미널에서 다음 명령을 받기 위해 nohup 명령어를 사용한다.
워커 1, 2, 3 command에 nuhub과 끝에 &를 붙여준다.
----문제 상황----
exec command 에서
자바 관련 프로세스를 종료시키는 명령어인
ps -ef | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
와
백그라운드에서 스프링부트를 실행시키기 위한 nohup, & 명령어를 사용하면
그 전까지 잘 되던 배포가 제대로 되지 않는다.
두 명령어를 지우고 빌드하면
위와 같이 worker1 컨테이너에서는 잘 동작하지만 (포그라운드에서 스프링을 실행했기 때문에 worker2, 3은 당연히 되지 않는다.)
3개 서버를 배포하기 위해 두 명령어를 사용하면
worker1도 동작하지 않는다...
1) worker1에 ps -ef~~는 없고 nohup과 &가 있을 때
(worker2, 3에는 둘 다 있다.)
worker1만 접속 가능
2) 오타 찾기
..............
nohub로 오타나있었다....
nginx를 이용해 리버스 프록시 설치
nginx를 돌릴 인스턴스 설정
- 필요한 패키지 설치
sudo apt-get update
sudo apt-get install -y curl gnupg2 ca-certificates lsb-release
- ubuntu-keyring 패키지 설치
sudo apt-get install -y ubuntu-keyring
nginx.list 파일 생성
- nginx 공식 저장소에서 서명 키 가져오기
curl -s <https://nginx.org/keys/nginx_signing.key> | gpg --dearmor \\
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
- 다운로드한 키가 올바른지 확인
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
$ gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg
pub rsa2048 2011-08-19 [SC] [expires: 2024-06-14]
573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62
uid nginx signing key <signing-key@nginx.com>
- 저장소 설정(안정 버전)
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\
<http://nginx.org/packages/ubuntu> `lsb_release -cs` nginx" \\
| sudo tee /etc/apt/sources.list.d/nginx.list
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \\
<http://nginx.org/packages/ubuntu> `lsb_release -cs` nginx" \\
| sudo tee /etc/apt/sources.list.d/nginx.list
deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] <http://nginx.org/packages/ubuntu> jammy nginx
- apt 저장소 업데이트
sudo apt-get update
- nginx 설치
sudo apt-get install -y nginx
- nginx 버전 확인
nginx -v
$ nginx -v
nginx version: nginx/1.22.1
버전확인되면
sudo systemctl start nginx
를 입력해서 엔진엑스를 가동시킨 다음 해당 가상pc의 공개 아이피로(포트번호 없이) 접속하면
정상적으로 실행된 것을 볼 수 있다.
로드밸런싱 하도록 엔진엑스 설정 바꾸기
로드밸런싱을 할 수 있도록 nginx를 담당하는 인스턴스의 터미널 창에서 아래의 설정파일을 열어 수정할 것이다.
sudo vi /etc/nginx/nginx.conf
http{
...다른구문들...
upstream cpu-bound-app {
server {instance_1번의_ip}:8080 weight=100 max_fails=3 fail_timeout=3s;
server {instance_2번의_ip}:8080 weight=100 max_fails=3 fail_timeout=3s;
server {instance_3번의_ip}:8080 weight=100 max_fails=3 fail_timeout=3s;
}
server {
location / {
proxy_pass http://cpu-bound-app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
위 구문을 추가한다.
워커 1, 2, 3의 컨테이너 주소를 입력하고 저장한 뒤 service nginx reload 하면
리버스프록시와 워커 3대의 연결이 완료된다.
그런데 브라우저 접속이 안 돼서
reverse-porxy 컨테이너를 삭제하고 그냥 nginx 컨테이너를 도커로 바로 띄웠다.
마지막 라인의 conf.d는 nginx의 기본설정을 담고 있다.
nginx.conf로 수정했는데 적용이 안된다면 위 라인을 주석처리한 후 다시 시도한다.
마지막 라인을 주석처리하고 service nginx reload하면
localhost:9999 에 접속이 되지 않는다.
http{
...다른구문들...
upstream cpu-bound-app {
server {instance_1번의_ip}:8080 weight=100 max_fails=3 fail_timeout=3s;
server {instance_2번의_ip}:8080 weight=100 max_fails=3 fail_timeout=3s;
server {instance_3번의_ip}:8080 weight=100 max_fails=3 fail_timeout=3s;
}
server {
location / {
proxy_pass http://cpu-bound-app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
worker1, 2, 3의 컨테이너 주소를 입력한다.
nginx.conf 파일을 수정하고 나면 reload를 해야 한다.
이렇게 되면 성공한 거다!
hash?input=12를 입력하면 해시값을 볼 수 있다.
연결이 잘 되었다는 뜻이다.
hello에 접속하면 Hello!! 가 출력된다.
추후 우리프로젝트에 웹페이지 띄우기 위해서 git clone 시 우리 레포지토리 경로로 변경해야 할듯!
worker1번 서버가 중지되어도 2번 서버가 돌고 있기 때문에
hello 페이지를 계속 볼 수 있다.
+) 가상머신 종료 후 재시작 시
컨테이너를 다시 킬 때는 service ssh restart로 포트를 열어줘야 통신이 가능하다.