반응형

최근 운영중인 웹서비스가 비규칙적으로 다운되는 현상이 있었는데, 발생했던 문제와 그 문제를 해결하는 과정에 대해서 포스팅을 해보려고 한다. 서버 운영을 하는 실무자들에게 도움이 되었으면 좋겠다.

문제 발생

첫 발생이 3월 초쯤 이었던가?.. 운영중인 웹 서비스가 종종 다운되는 현상을 겪었다. 운영 서버에 요청을 보내면 처리되지 않다가 결국 몇 분 뒤 Tomcat 서버가 죽어 위처럼 Service Unavailable 메시지를 띄었다.

보통 부하 분산과 장애에 대비해 WAS를 이중화 해놓기 때문에 WAS하나가 죽어도 다른 WAS가 처리해 줄껀데, 브라우저가 응답대기 상태도 아니고 Service Unavailable 을 띄운걸로 봐서는 WAS두개가 모두 죽은 것 같았다.

어떤 문제가 있었던걸까? 여태까지 악성쿼리때문에 DB 락 걸이 걸려 부하가 걸리는 장애는 종종 겪어 보았지만, 이번 케이스는 달랐다.

단서 1. CPU 사용률에 최대 부하 발생

해당 상황이 접수되고나서 바로 확인해보니 이중화 된 WAS 두개가 아예 삭선처리되어 모두 뻗어있었다. 그냥 Tomcat 서비스가 다운된 상태...

문제가 최초 발생 했을 시간대의 CPU사용량을 보니 WAS 2번이 기존 5~10% 내외로 사용하던 사용량이 어느 시점에 80%까지 올라가며 최대 부하가 걸려있었다. 5분 뒤 WAS 1번도 따라서 같은 현상을 보이기 시작했다.

보통 지연이 길거나, 부하가 강한 요청 중 단순 조회작업이라면 Kill을 해서 일단 서비스 복구를 하고 분석을 할텐데.. 이건뭐 톰캣이 다 죽어있으니 뭘 할수도 없고 ㅋㅋ당장 서비스 복구를 위해 WAS 재부팅밖에 답이 없었다. 그리고 바로 WAS 로그를 확인해봤다.

단서 2. java.lang.OutOfMemoryError: GC overhead limit exceeded

톰캣 로그를 확인하니, 발생 했을 때로 추정되는 시간때에 모두 java.lang.OutOfMemoryError: GC overhead limit exceeded 오류가 찍혀있었다.

GC에 대해서 간단하게 알아보고 넘어가보자. JVM은 메모리 확보를 위해서 GC를 수행한다. 대학 Java 시간에 잠깐 배웠던 그 GC가 맞다 바로 가비지 컬렉션(Garbage collection)이다. 더 이상 사용되지 않는 객체에 대해서 메모리를 해체해주면서 메모리 풀을 관리해주는 친구다.

근데 저 GC overhead limit exceeded 메시지는 왜 띄었는가..?

* GC를 진행하는데 CPU 98% 이상 사용

* GC 진행 후 메모리 2%미만이 복구 되었을 때

일단은 메모리가 부족했던 걸까? 생각이 들었다. 찾아보니, 위 문제에 직면한 경우 보통 JVM 옵션으로 힙 리밋 제한을 없애거나 메모리 사용량을 늘리라고들 하더라. 사실. 나는 이런 셋팅쪽 문제가 아닐거라고 개인적으로 생각은 들었지만, 팀 내부적으론 일단 메모리 부족으로 방향을 잡고, 톰캣, 자바 셋팅쪽을 손봤다.

하지만, 내 예상처럼 이런 증상은 셋팅으로 해결되지 않았다. 몇 일간 원인모를 이유로 서버는 다운됐다..ㅠ

그리고 GC 로그를 확인하기 위해서 서버에 GC로그를 남기는 설정도 추가하여 해당 문제가 발생했을 때 GC로그를 확인했으나, "GC 할껀데 메모리 없어~~~" 사실상 이런 내용만 도배되어있었다. 그런데 GC 시도 엄청 많이 했긴 했더라......암튼 이문제를 해결하는데 GC로그는 도움되지 않았다..

단서 3. 특정 요청에 문제가 생기는 것은 아니었다.

이게 어떤 특정요청에만 생기는 현상일까 생각이 들었다. 머 배치가 돌때 먼가 잘못 도는게 있는걸까? 아니면 사용자가 이상한 파라미터를 던져서 처리를 못하나...? 신기하게도 새벽에는 이런일이 발생하질 않네?.. 해서 의심이 갔었다.

문제가 발생했었을 때의 로그를 확인했으나, 공통점은 없었다. 심지어 GC error 가 발생한 해당 요청을 같은 파라미터를 넣고 다시 요청해도 같은 현상은 발생하지 않았다.

결론부터 말하자면, 특정한 요청이 문제가 됐었다. 다만, 내가 바로 찾지 못한 이유는, 이미 문제가 발생한 이후에 로그에 찍힌 GC error 로그에만 집착했기 때문이었다. 일단은 GC error 로그가 어떤 요청에 찍혔다 하더라도, 그 요청이 문제가 아니라는 거다. 이미 문제는 발생했고, 우연히 그 요청을 처리중일 때 GC 가 동작하여 error 을 띄운거란거다.

만약 이방법으로 간단하게 볼려면, GC Limit 이 발생하기 전 로그들을 뒤져봐야 한다.

이런 현상이 지속되고, 팀원들이 이 문제를 해결하기 위해 이미 붙어있었기 때문에, 내 업무를 좀 쳐내고 나중에 시간이 남으면 보려고 생각했다. 뭐 그때쯤 가서 이미 해결이 되면, 좋은거긴 한데, 나는 셋팅쪽 문제가 아닐꺼란 생각이 계속 들었다.

단서 4. 힙메모리 사용량 증가

시간적 여유가 생겨 다시 문제를 분석해봤다. 보니까 해당 문제가 발생 했을 때 CPU사용량도 돌라갔었지만, 힙 메모리 사용량도 폭발적으로 증가하는 현상이 확인되었다.

왜 처음부터 힙메모리 관제에 신경쓰지 않았을까, 평소에 악성쿼리처럼 CPU를 많이 점유하던 장애를 주로 만났었기 때문에 메모리보다는 CPU 사용량이나 어떤 요청이 왔는지 이런거 위주로 봤던게 좀 방심했던 것 같다.

원래 힙메모리 사용량의 이상적인 그래프는 맨 아래 그래프처럼 어느정도 메모리가 올라가다 GC가 작동하여 떨어지고, 계속 반복하여 적정한 수준을 유지하는게 이상적이다.

하지만 위 사진을 보다시피 3월 16일동안 3회나 01번 02번 WAS 힙메모리 점유율이 급격하게 올라가는 것을 볼 수 있다.

문제 해결을 위한 방향성 잡기

자 여기까지 정리를 해보자.

1. 새벽이 아닌 주야간 워크 타임때, 그리고 불특정, 비규칙적인 시간에 서버가 다운이 된다.

2. CPU 사용량과 힙 메모리 점유율이 급격히 상승한다.

3. 서버 에러 로그에는 GC overhead limit exceeded 이 발생한다.

자 일단 에러로그에 GC 할 메모리가 부족하다고 되어있어서 GC에만 문제가 있었던건가 여기에만 집중했지만, 내 생각에는 이건 메모리가 부족해지고 나서, 즉 어떤 문제가 발생하고 그 이후에 파생된 현상이지 주 원인은 갑작스럽게 메모리를 차지한 어떤게 있을거라고 생각했다.

즉, 어떤 원인에 의해 메모리가 급격하게 사용되었고, 그 이후에 평소처럼 GC를 하려니 GC 리밋 로그를 띄운 것 이다. 나도 그랬지만, 보통 다른 사람들도 이 GC 리밋 에러 로그를 보고, 왜 GC 리밋 로그를 띄었을까..? 검색해보면 "서버 힙메모리가 부족하네요 ㅎㅎ" 이럴텐데 이렇게 접근해서는 해결 할 수 없는 문제였다. (내 케이스의 경우)

자. 정리하자면 GC 관련된 문제가 아닐꺼다, 무언가가 힙메모리를 엄청나게 차지하니까, 당연히 GC도 못하니 저 오류를 띄운거고, 우리는 앞으로 어떤 녀석이 힙메모리를 그 순간에 차지하고 있었는지를 찾아야한다.

앞으로 해야할게 바로 힙메모리 분석이다. 다음 포스팅을 통해서 힙메모리 분석을 어떻게 했고, 어떤게 원인이었으며, 어떻게 조치했는지에 대해서 알아보자

 

#톰캣 #WAS #오류 #다운 #종료 #꺼짐 #GC #overhead #limit #Exceeded #메모리릭 #메모리누수 #힙 #힙메모리 #메모리 #사용량 #점유률 #급등 #증가 #서버 #장애 #트러블 슈팅

반응형
반응형

 

https://extsdd.tistory.com/124

 

[Maria DB] AWS EC2 원격 서버 마리아 DB 접속 / HeidiSQL / 데이터 삽입 / 테이블 생성

https://extsdd.tistory.com/123 [아마존 AWS EC2] #3 스프링/전자정부프레임워크 프로젝트 AWS에 FileZilla로 배포하기 / 메이븐 빌드 / 자 여태까지 만들었던 프로젝트를 아마존에 배포할 시간이다. https://ext..

extsdd.tistory.com

  자 기나긴 여정끝에 드디어, AWS에 소스를 올려서 서비스가 정상적으로 장동하는지 까지 확인했다.! 하지만.. 문제가 있다..

 

http://자기AWS아이피:8080/CP_service-1.0.0/reqUrl.do?reqParam=3

 

  우리 프로젝트대로라면 위 링크대로 했을때 저 CP_service-1.0.0 이게 .war파일 명칭인데...저게 강제로 드러나게 되어있다... 메이플에서 캐릭만들자마자 손도끼하고 빨간장화를 신고다니는것마냥 쪽팔리다. 오늘은 저걸 없애줄거다.

 

1. SU 쉘 진입

 

 

 

  자 본인 EC2 쉘로가서 su를 입력하고 엔터를 누르고 비번을 쳐서 Root권한을 딴다.

 

2. 톰캣/conf 폴더로 이동

 

 

  다음으로 해야할 껀 자기가 설치한 톰캣 경로에 있는 conf 경로까지 가는 것이다. 내 글을보고 따라왔다면 난 /server/폴더에 만들어 놨기 때문에

# cd /server/apache-tomcat-8.5.55/conf

 

  위 명령어를 치고 가면 된다.

 

 

우와~ 이동됐다!

3. server.xml 수정

 

vi server.xml

 

 

  위 명령어를 이용해서 server.xml을 수정하자

 

 

  자 방향키를 이용해서 맨 밑으로 쭉 내려오면 Host태그 안쪽에 저 코드를 넣어주자.

<Context docBase="CP_service-1.0.0" path="/" reloadable="false" source="org.eclipse.jst.jee.server:CP_service-1.0.0"/>

 

  </Host> 이 태그가 나오기 전에 아무데나 넣어주면 된다. 나랑 프로젝트 이름이 다른사람들은 각자 알아서 CP_service-1.0.0 이거 대신에 본인 프로젝트명을 넣으면 된다.

 

  입력은 보드 i 버튼을 눌러 입력하고 입력이 완료되면 Shift+: 키를 누른후 wq를 입력후 엔터를 눌러주자.

 

4. 톰캣 재부팅

 

# cd /server/apache-tomcat-8.5.55/bin

 

  자 톰캣을 끄기위해 위 경로까지 가보자. 톰캣 밑에있는 bin경로로 가면 된다.

./shutdown.sh

 

위 명령어를 입력해 톰캣을 중지한다.

 

 

./startup.sh

 

이번엔 다시 켜주자 ㅎㅎ

 

 

완료!

5. 결과 확인

 

변경전 : http://자기AWS아이피:8080/CP_service-1.0.0/reqUrl.do?reqParam=3

변경후 : http://자기AWS아이피:8080/reqUrl.do?reqParam=3

 

  처음에 했던 테스트했던 URL인데 다른점이라면 중간에 프로젝트명이 바꼈다. 변경후 경로를 요청해보면 아마 원하는 창이 뜰꺼다. 변경전 주소를 떠도 될꺼고! 서버에서 중간에 CP_service-1.0.0 이라는 프로젝트명 경로가오면 / 경로로 포워딩시켜주는 원리인 것 같다.

 

  이제 프로젝트명이 안보이니 그래도 좀 구실은 갖춘것 같다.

 

  만약 저거 톰캣 껏다켜도 안되는사람은 rebbot 명령어로 EC2 인스턴스를 재부팅시키고 다시 Putty로 붙어서 해당 경로까지가서 다시 톰캣을 재실행봐라. 무슨 이유인지 모르겠는데. 톰캣 종료할때 프로세스가 안죽는 현상이 있는 것 같다..

 

 

#아마존 #AWS #EC2 #서버 #URL #주소 #프로젝트명 #숨기기 #톰캣 #변경 #포워딩 #serverxml

 

 

반응형
반응형

https://extsdd.tistory.com/78

 

[아마존 AWS EC2] #1 EC2 서버 접속하기 / PUTTY 다운 및 설치 / PEM→PPK 변환 / Server refused our key

https://extsdd.tistory.com/77 [아마존 AWS 무료 EC2 서버 생성하기] #3 EC2 인스턴스 생성 / 구축 / 방화벽이란? / 탄력적 IP https://extsdd.tistory.com/76 [아마존 AWS 무료 EC2 서버 생성하기] #2 IAM 계정..

extsdd.tistory.com

  저번 시간까지 PUTTY를 이용해서 원격 서버에 접속하는 법에 대해서 배웠다. 이제 본격적으로 웹 서비스를 만들어 볼껀데 그전에 우리 비전공자분들도 이해를 하고 출발해야 나중에 포기를 안하니, 웹 서비스가 무엇인지 알아보자.

 

  자 일단 학부생 수준부터 이야기 해보면 과거에 프로젝트 하면서 APM서버라는 말을 많이 들어봤을 것이다. 혹은 AMP서버라고도 부르기도 하던데 바로 Apache + PHP + MYSQL 조합으로 연동하여 웹 서비스를 수행하는 것이다. 대략적인 큰 그림은 이것과 비슷하다.

 

웹 서비스 = ①Server  + ②Spring (Project) + ③Database (DBMS)

  자 가장 중요하다고 생각하는 3개 요소를 내 뇌피셜로 한번 써봤다. 자 어떤거부터 알아봐야 할까? Server가 먼지부터 알아보자! 그전에 내가 포스팅 하는 목적은 비전공자들도 이해할 수 있도록 눈높이에 맞는 비유나 표현을 사용할 예정이니 전문 개발자들 분께선 뭐 글이 이따위야! 하시지 마시고 이해해주셨으면 한다.

 

1. Server = Apach Tomcat Server

 

  비전공자도 이해하려면 이걸 어떻게 설명해야할까 고민이 많다. 서버라...음.. 그냥 눈에 보이진 않지만.. 뭔가를 처리해주는.. 로봇같은...역할? 이정도 수준으로 일반인들은 느끼고 잇을 것이다. 

 

  먼저 서버는 WEB 서버가 있고 WAS 서버가 있다. 앗. 비전공자들 이해할 수 있을정도로 쉽게 알려준다 해놓고 시작부터 어려운 것부터 꺼내냐고 할 수 있겠지만.. 나도 고민하다가 이 말부터 꺼내야 뒷 내용 전개가 가능 할 것같다.

 

2. WEB서버  (Web Server)

  자 히스토리부터 살펴보자. 예전엔 WEB 서버라는 것이 주로 쓰였다. 한글 발음 그대로 웹 서버! 들어는 봤을 것이다.  이친구는 정적인 자료의 처리를 해준다. css (화면 레이아웃 설정파일정도), html (웹페이지 화면), 이미지(화면에 띄어지는) 등등 내용이 변하지 않는 파일들의 요청을 들어준다.

  예를들어 우리가 extsdd.tistory.com이라는 웹 주소를 요청하면 서버는 그 요청에 해당하는 화면을 html 파일로 뿌려준다. html과 동시에 위에나온 화면 레이아웃을 설정해주는 css파일 그리고 화면에 띄어줄 이미지들 이것들은 내용이 변하지 않고 정적인 파일이기 때문에 이 WEB서버란 친구가 착실하게 뿌려주는 것이다.

  사용자 입장에선 이 서버로부터 받아낸 html, css, 이미지 등을 조합해 내 화면에 구성해서 띄어주는거다. 이 방법은 정적이기 때문에 그 사이트의 모든 화면들은 모두 html 파일로 서버에 저장해놓고 그걸 그대로 뿌려주는 것이다. 예를들면 로그인 화면, 첫 번째 글을 눌렀을 때 화면, 두 번째 글을 눌렀을 때 화면 등. 그 사이트에서 존재하는 모든 화면이란 화면은 모두 서버에 html 패거리(css, 이미지 등)를 다 저장해 놨던것이다.

 

  이렇게 모든 화면에 대해서 서버가 다 가지고 있다보니 화면을 조금 수정하려고하면 HTML을 전부 수정하거나, 모든 HTML 리소스들을 다 가지고 있다보니 서버 자원들도 커지고, 한 화면마다 다 하나하나 요청을 처리하다보니 부하도 있고 문제가 많았다. 그래서 등장한게 바로 Dynamic Web이다. 동적 웹!!

 

3. WAS서버 (Web Application Server)

  기존 Web server의 한계는 위에 적어놨고, WAS는 한층더 발전된 개념이다. 바로 Dynamic 해졌다..! 한국말로는 동적으로 변했다..! 이게뭐냐면 Servlet Container라는 개념이 추가됐다. 이게 머냐면은 사용자가 웹 페이지 요청을 보내면 이 Servlet Container 라는 친구가 요청을보고 아! 이요청은 이화면에 이런 정보들이 필요한 페이지구나!! 하고 이친구가 뚝딱뚝딱 정보를 만들어서 실시간으로 html파일을 만들어버린당..! 그리고 그걸 바로 사용자에게 줘버린다..ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ

 

  즉. 예전처럼 웹 사이트의 모든 html파일을 가지고 있지않아도, html을 어떻게 만들지 정도만 정의해 놓으면 이 WAS라는 친구가 그 요청에 필요한 html을 만들어버리는 것이다.! 구몬을 얼마나 해야 이런 아이디어가 나오지..! 이렇게 되면 모든 리소스를 미리 안가지고 있어도 되는 장점이 생기며 그만큼 부하도 적어지게 되는 것이다. 

 

  잘 생각해보면 이게 가능한 이유는 간단하다. 어떤 글을 요청하던 화면이 크게 바뀌진 않는다. 글을 누르면 제목이 있고 본문이 있고 댓글들이 있고.. 그렇다. 큰 틀은 같은데 안에 정보들만 바꿔주면 되는것이다. 그렇게 이 동적 웹서비스를 가능케 하는게 바로 우리 WAS성님 되시겠다.

 

4. WEB서버 + WAS서버

  자 그럼. WAS서버가 좋다고해서 WAS만 쓸까? 아니다. 여전히 이미지파일이나 소수의 HTML과 같은 정적인 리소스들도 아직도 처리해야하기 때문에 WEB서버도 필요하다. 그래서 아주 간단하다. 같이 쓴다. WEB서버와 WAS서버 둘다 같이 사용하는 것이다. 정적인건 WEB이 그대로 처리하고, 동적인건 WAS가 처리하고. 위와 같은 그림이 될 것이다. 우측에 DB는 아직 머리아프니 나중에 알아보도록 하자.

 

  프로세스를 보면 이런거다. 사용자한테 페이지 요청이 서버에 들어오면 처음에 WEB이 받는다. 만약 간단한거 머 이미지나 css파일 처럼 정적인거면 WEB이 바로 반응을 해준다. 헤헤..이거 필요한거지!? 이런식으로... 그런데 살짝 어려운게 왔다. 동적인 페이지 요청이 왔다하면 WEB이 어찌할줄을 몰라하면서 하.....이거 뭐징...ㅠㅠ 하면서 WAS한테 보내서 걔한테 처리하라고 해야겠다 하고! WAS에게 던진다. 근데 WAS는 똑똑하니까 그 동적 요청을 DB에서 정보들을 끌어와서 그 요청에 맞게 HTML을 작성한다. 그리고 그걸 다시 WEB한테 보내고 WEB은 아하!!!!!!!역시 WAS야! 하면서 WAS에게 받은걸 사용자한테 뿌듯해하면서 준다.

5. Apache Tomcat Server

  와우 이제 마지막 개념정리다. 방금까진 살짝 x밥 같았지만 이제야 좀 그럴싸한 내용이 나왔다. 아.파.치. 톰.캣!! 아주~~널리 쓰고 있는 서버구성의 이름이다. 아직 개념이 안잡히면 헷갈릴 수도 있다. 아니 아파치 서버도 있고 톰캣 서버도 있고 아파치 톰캣 서버도 있고! 대체뭐야! 같은건가? 라고도 생각 할 수 있는데 살짝 다르다.

 

가. Apache Server = WEB Server

  아파치 서버라고 하면 위에 계속 설명했던 WEB 역할을 하는 서버의 이름이다.

 

나. Tomcat Server = WAS Server

  톰캣 서버는 WAS서버의 역할을 하는 서버의 이름이다.

 

다. Apache Tomcat Server = WEB Server + WAS server

  아파치 톰캣 서버는 WEB서버와 WAS서버 두개다 동작하는 서버구성이다. 위와 같다고 생각하면 되겠다. 이렇게 구성해놓고 어떤 요청이왔을때 정적인 리소스를 요청하면 Apache가 처리하고 동적인 요청이 오면 Tomcat에게 넘겨 처리하도록 하는 것이다!

6. WAS의 처리 프로세스

  와우 이제 좀..어려워 졌다.. 하지만 WAS를 좀 구체적으로 그린것 밖에 없고 나머지는 다 똑같다. WAS에 대해 더 알아보자면 컨테이너란 녀석이 WAS가 돌아가는 동안은 24시간동안 당직을 서고 있는다. 이 컨테이너라는 친구가 WEB에서 못해먹겠다고 동적 요청을 받으면 그 요청에대한 정보로 httpServletRequest 객체(정보 뭉텅이라고 생각하면 됨)와 httpServletResponse라는 빈 객체를 만들고 그걸 새 쓰레드(작업 단위라고 생각하면 됨)로 생성한다.

 

  이렇게 해당 작업에 대한 쓰레드에 요청과, 응답 객체를 생성해두고 또 다른 한편으론 Web.xml이라는 파일에 접근해 이 요청을 어떤놈이 처리하는지를 알아가지고 온다. 그 요청을 처리하는 친구가 Servlet 즉 서블릿 이란 친군데 담당 Selvlet을 찾아내면 그 서블릿에대 대고 doGet() 함수와 doPost()함수를 실행시킨다. 즉, httpServletRequest에서 전달받은 데이터들로 새로운 동적 페이지를 만드는 거다. 중간에 필요한 정보들은 DB에서 받아오기도 한다. 이렇게 만들어진 결과 페이지는 아까 만들어 두었던 httpServletResponse 객체에 담아놓고 작업이 완료되면 다시 WEB한테 보내는데 WEB은 HTTP(80포트)만 다루는 친구라 알아먹을 수 있게 HttpResponse 형태로 가공해서 WEB한테 던져주게 된다. 

 

  던져 주면서 동시에 방금 만들었던 httpServletRequest, httpServletResponse 객체들 그리고 해당 쓰레드, 즉 작업했던 것 모든것을 소멸시키고 아까 HttpResponse 를 받았던 WEB은 그와중에 그걸 사용자에게 전달하게 되면 요청이 완료가 되는 것이다.

7. Apache Tomcat Server의 Port

https://extsdd.tistory.com/77

 

[아마존 AWS 무료 EC2 서버 생성하기] #3 EC2 인스턴스 생성 / 구축 / 방화벽이란? / 탄력적 IP

https://extsdd.tistory.com/76 [아마존 AWS 무료 EC2 서버 생성하기] #2 IAM 계정 생성 후 권한 부여하기! https://extsdd.tistory.com/75 [아마존 AWS 무료 EC2 서버 생성하기] #1 AWS 회원가입/ AWS란 1. 서론..

extsdd.tistory.com

 WEB 서버인 Apache는 80포트를 이용하고 WAS서버인 Tomcat은 8080포트를 사용한다. 그리고 Apache랑 Tomcat 사이는 AJP라는 프로토콜을 사용하여 8009번 포트를 사용한다. 

그래서 우리가 저번에 EC2 방화벽 설정을 했을때 80포트와 8080포트를 개방시켜 놓은 이유이기도 하다.

  

자 이제 아파치 톰캣이 무엇인지 WEB 서버와 WAS서버가 무엇인지 개념을 잡았으니, 다음은 데이터베이스에 대해서 알아보도록 하자.

 

#아파치 #톰캣 #차이점 #WEB #WAS #서버 #웹서비스 #아마존 #AWS #EC2 #구축하기 #Apache #Tomcat #Server

 

반응형
  1. 익명 2020.05.14 18:23

    비밀댓글입니다

  2. Arsene H 2021.09.29 17:02 신고

    안녕하세요 질문이 있습니다. 지금 DB를 OracleDB를 써서 8080포트가 겹치는데 톰캣서버를 8090으로 해도 되련지요??

  3. 찰도마도 2021.11.06 01:01

    감사합니다!! 이해하는데 많은 도움이 되었어요

반응형

https://extsdd.tistory.com/77

 

[아마존 AWS 무료 EC2 서버 생성하기] #3 EC2 인스턴스 생성 / 구축 / 방화벽이란? / 탄력적 IP

https://extsdd.tistory.com/76 [아마존 AWS 무료 EC2 서버 생성하기] #2 IAM 계정 생성 후 권한 부여하기! https://extsdd.tistory.com/75 [아마존 AWS 무료 EC2 서버 생성하기] #1 AWS 회원가입/ AWS란 1. 서론..

extsdd.tistory.com

  저번 포스팅을 마지막으로 EC2 서버 구축을 끝냈다. 이제 서버에 접속하는 법에 대해서 알아보자.

  우리는 PuTTY라는 툴을 이용해서 EC2 서버에 붙을 것이다. 이 툴은 원거리에 떨어져있는 장치에 원격으로 접속 할 수 있는 터미널이며, 비전공자들은 아마도 해커가 나오는 영화를 보면 이 비슷한 것들을 봤을 것이다. 계정을 입력하고 원격 클라이언트에 붙어서 휘졌고 다니는 것을.

 

  여기서 원격으로 붙는다의 의미는, 원래 전통적으로 내집에 서버를 올리면  서버컴퓨터를 키고 그 컴퓨터랑 연결된 모니터, 자판기, 마우스를 이용해 직접 그 서버 컴퓨터를 조작했었지만. 이제 클라우드 시대아닌가. 내 서버에 대한 자원은 아마존의 데이터센터에 있다. 어딘지도 모르는 수백, 수천 km 떨어진 곳에 내 EC2서버가 돌아가고 있으니 그 먼거리에있는 장치에 내가 원격 접속하는 원리이다.

1. PuTTY 다운

https://putty.ko.softonic.com/

 

PuTTY

완전하고 안정적인 텔넷 및 SSH 클라이언트

putty.ko.softonic.com

  잔말 그만하고 위 링크로 이동해서 PuTTY를 받자.

1. 페이지에 들어가서 무료 다운로드 클릭

2. 여기서도 무료 다운로드 클릭!

1. 하단에 다운되는 것을 보고 완료시 실행시킨다.

2. 긍정적인 버튼들을 눌러주며 설치를 진행한다.

 

 

2. .pem 파일을 .ppk 파일로 변환

  윈도우키나 시작버튼을 누르고 PUTTY를 검색하면 PuTTY앱과 PuTTYgen이 나온다. 우린 지금 PuTTYgen을 이용해서 .pem파일을 .ppk파일로 변환할 것이다. PuTTYgen을 실행해보자.

1. 상단의 Conversions 메뉴→ Import key 버튼을 클릭하여 전에 생성해줬던 .pem(키페어) 파일을 임포트한다.

※ 여기서 아니 무슨 갑자기 pem파일이야 ㅡㅡ 이게 먼데! 하는 사람들은

https://extsdd.tistory.com/77

 

[아마존 AWS 무료 EC2 서버 생성하기] #3 EC2 인스턴스 생성 / 구축 / 방화벽이란? / 탄력적 IP

https://extsdd.tistory.com/76 [아마존 AWS 무료 EC2 서버 생성하기] #2 IAM 계정 생성 후 권한 부여하기! https://extsdd.tistory.com/75 [아마존 AWS 무료 EC2 서버 생성하기] #1 AWS 회원가입/ AWS란 1. 서론..

extsdd.tistory.com

이 글을 참조하면된다. 중간쯤에 AWS_EC2라고 저장한 파일이 .pem 파일이다.

 

2. Save private key 버튼 클릭! 이때 절대 이 키파일은 외부에 노출되지 않도록 하자!

 

1. 경고창이 나오면 예버튼을 눌러주자.

2. PPK파일 확장자를 확인하고 원하는 위치에 저장한다. 이제 PuTTYgen은 종료해도 된다.

짜.잔. ppk 파일 생성!! 비전공자들에겐..! 그냥..! 공인인증서 정도로 생각하면 쉽다..! 물론.."공인"은 아니지만..

 

3. PuTTY EC2 인스턴스 서버 접속

  자 이제 PuTTY를 이용해서 원격 서버에 접속할껀데 어느 서버에 접속할지 주소를 알아야한다. 바로 IP주소!! 머리가 좋은 사람은 여기서 말한 IP주소가 저번 포스팅에서 했던 탄력적 IP란걸 알고있을 것이다. 모르는 사람들은 밑에 방법으로 알아내면 된다.

https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Addresses:

 

https://ap-northeast-2.console.aws.amazon.com/ec2/v2/home?region=ap-northeast-2#Addresses:

 

ap-northeast-2.console.aws.amazon.com

위 링크에 접속해서 좌측 탄력적 IP를 누르면 내 인스턴스에 할당된 IPv4 주소가 있다. 그게 바로 자기 EC2 인스턴스의 IP다. 바로 주소!!

 

  1. PUTTY를 실행하고 HostName에 자기 IP주소를 넣어준다. 프로토콜은 SSH로 연결할 것이기 때문에 22번 포트로 그대로 둔다.

  2. 좌측에 SSH탭 밑에 AUTH를 눌러주고 우측  Browse 버튼을 눌러 아까 만들어놨던 .ppk 파일을 불러와준다. 

  1. 이 연결을 저장시키기위해 11시방향 세션을 눌러주고 Saved Sessions 텍스트박스에 연결이름을 설정하고 Save 버튼으로 저장한다. 이제 마지막으로 Opne 버튼을 눌러준다.

  2. 연결을 신뢰하냐는 짊누에 예를 눌러준다.

  와우 shit~ 먼가 됐다.

 

ubuntu를 입력하고 엔터를 눌러주자!

shit~~~~~~~~~~~~~ 연결이 되버려따..! 혹시나 

 

이런 메시지가 나오면서 PUTTY상에 "Server refused our key" 메시지가 나왔다면 사용자 이름이 틀렸을 가능성이 있다.

 

우린 Ubuntu AMI로 인스턴스를 생성했기 때문에 이름이ubuntu인거고 다른 AMI로 설치했다면 계정이 달라진다.

 

Ubuntu AMI : ubuntu

Amazon Linux2 : ec2-user

Amazon Lunux AMI : ec2-user

Debian AMI : admin or root

Fedora AMI : ec2-user or fedora

 

위처럼 각 AMI마다 사용자 명이 다르니 알맞게 입력하면 된다.

 

 

이제 이 서버에 원격으로 접속해서 서비스를 하나씩 올려보도록 하자

 

 

 

#아마존 #AWS #EC2 #인스턴스 #서버 #PUTTY #SSH #접속 #PEMPPK변환 #ServerRefusedOurKey

 

 

 

 

 

 

 

반응형
반응형

https://extsdd.tistory.com/76

 

[아마존 AWS 무료 EC2 서버 생성하기] #2 IAM 계정 생성 후 권한 부여하기!

https://extsdd.tistory.com/75 [아마존 AWS 무료 EC2 서버 생성하기] #1 AWS 회원가입/ AWS란 1. 서론 대학생이었을 때는 웹 서비스에 큰 관심이 없었으나, 회사 일을 시작하고 나서부터는 웹 서비스가 재밌다는..

extsdd.tistory.com

이제 사전 셋팅은 끝났고 드디어 실제로 EC2 서버를 생성한다.

https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2

 

https://ap-northeast-2.console.aws.amazon.com/console/home?region=ap-northeast-2

 

ap-northeast-2.console.aws.amazon.com

 

1. 서비스 찾기에서 EC2를 검색해주자.

2. 살짝 내려보면 인스턴스 시작 버튼이 있다 클릭해주자.

  1. 우리는 스프링 프로젝트를 올리기위해서 리눅스 기반인 우분투를 설치해주자! 이때 꼭 프리티어 사용 가능인지를 봐야한다! 안보고 아무거나 했다가는 나중에 요금이 과금될 수 있다.

  2. 서버 성능을 고르는건데 프리 티어는 어차피 t2.micro로 고정이다... 그냥 다른 하드웨어 머있는지나 구경하고 다음단계로 넘어가자. 이것도 역시 프리 티어 사용가능인지 확인하자.

  1. 이전 포스팅에서 만들었던 EC2_role을 IAM역할에 추가해준다.

https://extsdd.tistory.com/76

 

[아마존 AWS 무료 EC2 서버 생성하기] #2 IAM 계정 생성 후 권한 부여하기!

https://extsdd.tistory.com/75 [아마존 AWS 무료 EC2 서버 생성하기] #1 AWS 회원가입/ AWS란 1. 서론 대학생이었을 때는 웹 서비스에 큰 관심이 없었으나, 회사 일을 시작하고 나서부터는 웹 서비스가 재밌다는..

extsdd.tistory.com

못 본사람은 참조하면 된다.

  2. 디폴트는 스토리지 크기가 8기가지만, 프리티어에서 최대 사용가능한 용량은 30기가이기 때문에 30으로 설정해주고 넘어간다.

1. 태그 추가는 그냥 넘어가면 된다.

  자 여기 설정은 좀 봐야 한다. 내 EC2 서버에 방화벽을 설정하는 화면인데, 저기 추가된 포트들만 개방하겠다는 뜻이다. 비 일단은 SSH는 기본적으로 있을 것이고 나머지 HTTP, HTTPS, 사용자 지정TCP, MYSQL/Aurror을 추가해서 위 처럼 입력해준다.

  비전공자도 이해할 수 있도록 쉽게 설명해 보겠다. 내 서버 주변으로 성곽처럼 방화벽이란게 둘러져 있는데, 이 방화벽이란 친구들은 port라는게 있다. 성곽으로 따지면 문이다! 서울 성곽에 동대문, 서대문, 남대문이 있듯이 방화벽이란 친구에겐 0 ~ 65535번 Port까지 가지고 있다. 즉 65535개의 문을 가지고 있는건데, 이 6만5천개의 모든 문을 열어놓으면 보안에 취약할수 밖에 없을것이다. 그래서 서버를 구축할때 서버에 모든 port를 닫고 방화벽에 내가 사용할 Port들만 개방할 수 있도록 등록을 하는 것이다.

 

 자 우리가 알고있듯이 인터넷! 네이버든 다음이던 우리가 주소를 치고 들어갈때 http로 시작하는 주소들을 본적이 있을것이다. HyperText Transfer Protocol의 약자로써 www(world wide web)상에서 정보를 주고받을 수 있는 통신 규약이라고 생각하면 된다. 거기에 더 보안이 강력해져 secure해진 친구가 s가 붙어 https라고 불리며 더 안전한 통신 프로토콜을 보장해준다. 이처럼 우리 인간이 쉽게 이해할 수 있는 http나 https같은 프로토콜들은 컴퓨터가 이해하도록 숫자로 바꿔줘야한다. http는 80포트를 사용하고 https는 443포트를 사용한다. 그래서 저 두포트를 방화벼에 등록시키면 기본적으로 웹 서비스 요청은 서버가 받아들일 수 있다는 것이다! 반면에 FTP요청처럼 등록되지 않은 친구들의 요청이 오면 방화벽이 해당 포트가 열렸는지 확인하고 열리지 않았으면 요청을 반려시킨다.

 

  자 이제 방화벽이뭐고 포트가 뭔지 알아봤으니 우리가 우리 EC2서버 방화벽에 어떤 포트를 개방할지 한번 보자.

 

SSH 22번 포트 : Secure Shell이라고 불리며 우리 EC2서버 구축후 이걸 제어하려면 원격으로 붙어야하는데 그 서비를 지원하는 포트가 바로 이 22번 포트인거다. 그래서 디폴트 값으로 이건꼭 필요하기에 SSH포트는 등록되어 있는 것이다.

HTTP 80포트 : 위에 설명 했듯이 웹 서비스 생각하면 된다.

HTTPS 443포트 : 더 보안이 강력해진 웹 서비스

사용자 지정 TCP 8080 : 스프링 프로젝트를 올려 WAS를 구동시키려면 톰캣을 돌려야하는데 톰캣 포트가 8080이다. 

MYSQL/Auror 3306 : Maria DB 를 이용하기 위해 포트를 개방해준다.

 

  마지막으로 소스 IP주소가 0.0.0.0인 것은 이 포트에 모든 IP를 허용하겠다는 뜻이다. 이제 끝났으니 검토 및 시작 버튼을 눌러주자.

  1. 마지막으로 서머리를 해주는데 훝어보고 시작하기를 눌러보자.

  2. 키 페어를 생성해야하는데 쉽게말해서, 이 EC2서버로 접속하기 위한 인증서라고 생각하면 된다. 우린 기존 키페어가 없으니 새 키페어를 생성해 놓는다. 생성한 키페어는 절대로!!! 잃어버리면 안되니 꼭!!! 어느 위치에 저장할지 기억해 놓자. 키페어 다운로드! 그리고 다운로드가 완료됐으면 인스턴스 시작을 눌러준다!

  와우! 인스턴스가 생성됐다!! 일단 혹시 요금 과금이 무서운 사람들은 결제 알림 생성에 들어가 이메일을 등록해놓도록 하자

  다음 해야할 작업은 탄력적 IP를 등록해야 한다. AWS EC2는 껏다 키거나 시간이 지나면 IP바 바뀌게 되어있는데 IP주소가 바뀌면 웹 서비스를 고정적으로 운영할 수 없게 된다. 그래서 고정 IP를 등록을 해야한다. 프리티어에서는 1개의 고정IP를 무료로 등록할 수 있다. 추가로, 고정 IP를 할당해 놨는데 인스턴스를 연동해놓지 않으면 또 요금이 부과된다. 아마존 입장에서는 고정IP한개가 아무것도 사용하지 않으면 손해가 발생하기 때문이다.

  1. 뭐 별거 없다. 탄력적IP주소 할당을 눌러주자.

  2. 여기도 별거 없다 할당을 눌러주자.

와우~ IP가 생겼다~ 이제 이 발급받은 IP를 내 EC2 서버랑 연결시켜주자! 우측에 "이 탄력적 IP주소 연결"버튼 클릭!

  아까 생성했던 인스턴스를 선택하고 연결하자!

짜잔~ 마침내 AWS EC2 서버구축이 끝났다!

 

다음편부턴 이제 이 EC2 서버에 원격 접속하는 법에 대해 알아보자!

 

#아마존 #AWS #무료 #EC2 #서버 #생성 #구축 #인스턴스 #방화벽 #탄력적IP

반응형
  1. 익명 2020.05.05 23:53

    비밀댓글입니다

  2. 익명 2020.05.06 11:39

    비밀댓글입니다

  3. 익명 2020.05.06 11:41

    비밀댓글입니다

    • 외장_하드 2020.05.06 12:07 신고

      아아 윈도우계열은 원격 접속포트가 3389라서 저건 필수포트니까 저렇게뜬거네요 방화벽헤 3389도 추가하며될것같아요!

  4. 안녕하세요 2021.03.31 20:24

    안녕하세요
    보안 그룹 구성 부분에서
    사용자 지정 TCP / TCP / 8080 / 0.0.0.0/0, ::/0
    부분을 잘 따라서 입력하였는데
    <소스는 CIDR 블록이나 보안 그룹 ID이어야 합니다>
    라는 경고문구가 나오며
    검토 및 시작버튼을 클릭할 수 없습니다
    혹시나 하여 소스를
    내 pc로 설정해보았으나 마찬가지로 넘어갈 수 없었습니다

    혹시 어떻게 해결할 수 있을지 조언부탁드리겠습니다.
    감사합니다

    • 안녕하세요 2021.04.01 12:45

      사용자지정tcp 가 아니라
      그 아래 있는 mysql/aurror 의 소스 설정이 누락된게 문제였습니다ㅎㅎ
      질문을 지우려했으나 비밀번호도 잊었고..
      혹시 저와 같은 실수를 하실 분들을 위해 남겨두겠습니다

      유용한 포스팅 감사합니다 :)

  5. Arsene H 2021.09.30 18:03 신고

    생성 이후에 보안그룹구성 수정할 수 있나요??

+ Recent posts