[새배내] 배포 인프라 미션을 하며 새로 배운 내용

Junseo Kim·2021년 5월 7일
0

[우아한테크코스3기]

목록 보기
17/27
post-thumbnail

2021.04.27 ~ 2021.05.03


bastion 서버란?

침입 차단 소프트웨어가 설치되어 내부와 외부 네트워크 사이에서 일종의 게이트 역할을 수행하는 호스트. 보호해야할 네트워크에 접근하기 위해 유일하게 외부에 노출되는 호스트를 말한다.

WAS나 DBMS 서버 등은 외부에 노출되어서는 안된다. 따라서 이번 서버들은 사설망에 위치시키고 IP 또한 public이 아닌 private IP로 접근하도록 해야한다.

이때 bastion 서버를 public subnet에 두어 public IP로 접근할 수 있도록 하고, 내부 서버들은 bastion 서버를 통해서만 접근한다.

이를 위해 bastion 서버에는 여러 보안 관련 처리를 해줘야한다.

참고
베스천 호스트

스레드 덤프란?

쓰레드 덤프 -> 프로세스에 속한 모든 쓰레드의 상태를 기록해놓은것. 직접 실행시킨 Java 응용 프로그램의 쓰레드와 JVM 내부적으로 존재하는 쓰레드로 나뉘게 됨.

쓰레드 덤프를 통해 어플리케이션에 발생한 문제를 분석하거나, 성능 최적화에 필요한 정보들을 보여준다.

쓰레드 덤프 분석

쓰레드 상태

  • NEW : 생성되었지만 실행되지 않은 상태
  • RUNNABLE: 현재 CPU를 점유하고 작업 수행 중인 상태
  • BLOCKED: Monitor를 획득하기 위해 다른 쓰레드가 락을 해제하기를 기다리는 상태
  • WAITING: 대기하고 있는 상태
  • TIMED_WAITING: 대기하고 있는 상태. WAITING과 다른 점은 최대 대기 시간을 명시해주면 외부 변화 뿐만 아니라 시간에 의해서도 대기상태가 해제될 수 있다는 점.

[쓰레드이름 우선순위 쓰레드ID 쓰레드상태]로 쓰레드 정보가 나타난다.

참고
스레드 덤프 분석하기

Docker

컨테이너 기반의 오픈소스 가상화 플랫폼이다.

컨테이너

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술을 말한다.

다양한 프로그램(백엔드 프로그램, DB서버 등), 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해주는 것이다.

컨테이너는 이미지를 실행한 상태라고 볼 수 있다.

이미지

이미지는 컨테이너 실행에 필요한 파일과 설정 값 등을 포함하고 있는 것으로 상태 값을 가지지 않고 변하지 않는다.

같은 이미지에서 여러개의 컨테이너를 생성할 수 있으며 컨테이너의 상태가 바뀌거나 컨테이너가 삭제되더라도 이미지는 그대로 남아있다.

이미지는 컨테이너를 실행시키기 위한 모든 정보를 가지고 있기 때문에, 따로 의존성을 설치하거나 할 필요가 없다. 미리 만들어 놓은 이미지를 다운받고 컨테이너를 만들면 된다.

초보를 위한 도커 안내서 - 도커란 무엇인가?

Proxy

서버와 서버 사이에서 중간 다리 역할을 한다. 보안상 이유로 직접 통신할 수 없는 두 서버 사이에서 대신 통신을 수행해주는 것을 말한다.

Forward Proxy

프록시 서버를 클라이언트와 원격 리소스 사이에 위치시키는 방법이다. 프록시 서버는 클라이언트가 요청한 리소스를 원격 리소스에서 가져와 클라이언트에게 응답해준다. 캐시를 이용하여 다음 요청시 캐시된 데이터를 제공해주기도 한다.

Forward Proxy는 대역폭을 감소시킬 수 있고, 접근 정책 구현에 있어 다루기 쉬우면서 비용도 저렴하여 기업 환경에서 많이 사용한다.

Reverse Proxy

프록시 서버를 인터넷 리소스 또는 인트라넷 리소스 앞에 위치시키는 방법이다. 보안 때문에 사용하는 방법이다.

보통 기업 네트워크 환경에서는 내부 네트워크(WAS, DB서버)와 외부 네트워크 사이에 DMZ라고 부르는 구간이 존재한다. DMZ에는 메일 서버, 웹 서버, FTP 서버 등 외부 서비스를 제공하는 서버가 위치하게 된다.Reverse Proxy를 DMZ에 두고 실제 서비스 서버는 내부망에 위치시킨다.

WEB(Apache, nginx) - WAS(Tomcat)으로 분리된 구조에서 WEB부분이 Reverse Proxy라고 볼 수 있다.(한 서버에 WEB, WAS가 둘 다 존재한다면 reverse proxy라고 볼 수 없다.)

보안성 향상, 확장성 향상, 웹 가속(압축/SSL 처리로 백엔드 리소스 확보/캐싱)의 이점이 있다.

참고
포워드 프록시(forward proxy) 리버스 프록시(reverse proxy) 의 차이
Reverse Proxy, Forward Proxy (프록시란?)

로드 밸런싱

로드밸런싱은 여러 서버에 작업량을 분산시켜 웹 사이트, 애플리케이션, DB, 다른 서비스들의 성능과 신뢰성을 향상시키기 위한 인프라이다.

로드밸런싱(Load Balancing) vs 리버스 프록시(Reverse Proxy)

Nginx

경량 웹 서버이다. 더 적은 자원으로 더 빠르게 서비스한다. 클라이언트의 요청에 맞게 정적 파일을 응답해주는 HTTP 웹 서버로 활용할 수도 있고, Reverse Proxy로 활용하여 WAS의 부하를 줄여주는 로드 밸런서로 활용되기도 한다.

Event-Driven 구조로 동작하며 비동기 방식으로 요청들을 동시에 수행할 수 있다. 한 개 또는 고정된 프로세스만 생성해서 사용한다. 새로운 요청이 들어오더라도 새로운 프로세스와 스레드를 생성하지 않는다. 따라서 단일 서버에서도 수만 개의 동시 연결을 처리할 수 있다.

Nginx는 하나의 Master Process와 여러 Worker Process로 구성되어 있다. Master는 설정 파일을 읽기, 유효성 검사, Worker 프로세스 관리의 역할을 한다. Worker는 모든 요청을 처리한다.

참고
Nginx란 무엇인가?

리눅스커맨드 &

백그라운드에서 돌린다는 의미

리눅스는 대소문자를 구별한다..

분명 로컬에서는 잘 나왔던 이미지 파일이 aws에 올렸을 때 잘 나오지 않았다. 원인은 대소문자 구분을 해주지 않았던 것..

브라우저에서 google.com를 요청할 때 통신 과정

  1. url 입력
  2. url 해석(url 구조 확인 protocol://domain:port/path?parameter)
    url 구조에 맞지 않는다면 기본 검색엔진으로 검색.
    url 구조에 맞는다면 HSTS(브라우저의 HSTS캐시에서 목록을 받아와 url주소와 목록이 일치하면 https로 그렇지 않으면 http로 요청을 보냄(google.com -> https://www.google.com/)
  3. DNS 조회
    브라우저와 로컬의 캐시를 확인하여 도메인에 해당하는 IP주소가 있는지 확인한다.
    없는 경우 OS에게 DNS서버(도메인 네임과 IP주소를 한 쌍으로 저장하고 있는 데이터베이스)에 요청하라고 지시한다. DNS서버는 해당 도메인에 해당하는 IP주소를 반환한다.
    Local DNS -> root 네임서버 -> TLD 네임 서버(.com) -> google.com 도메인 DNS(찾은 경우 Local에 캐싱)
  4. 라우터를 통해 IP주소로 요청 보냄
  5. ARP를 통해 IP주소를 물리주소인 MAC 주소로 변환
  6. TCP 소켓 연결(3-way-handshake) https인 경우 암호화 통신을 위한 TLS 핸드쉐이킹 과정 추가
  7. 연결 후 goole.com 페이지를 달라고 서버에 요청하고 서버는 요청에 대한 응답을 생성 후 브라우저에 전달
  8. 브라우저에서 응답을 해석하여 그려줌
  9. 연결 종료

DDoS 공격 대응법

DDoS(다수의 악의적인 사용자가 특정 사이트에 동시 접속하여 과도한 트래픽을 일으켜 정상적인 서비스를 방해하는 크래킹의 일종)

공격받는 지점을 줄인다.(어플리케이션에 도달할 수 있는 가능한 트래픽의 유형을 줄인다.)
- ex. 80과 443 포트만 오픈한다.
- bastion 서버 사용: 22번 포트에 대해 공격을 받아도 SSH 서비스 부분만 장애 발생. service 서버는 영향을 받지 않는다.

생성한 EC2의 스토리지 용량을 재부팅 없이, 늘리려면?

EBS 디스크는 확장가능한 볼륨이다. 1) EBS 볼륨확장, 2) 파일 시스템 확장 과정을 거쳐야한다.

[EBS 볼륨 확장]
1. EC2 -> Elastic Block Store -> 볼륨
2. 원하는 볼륨 선택 후 오른쪽 클릭 '볼륨 수정'
3. 원하는 용량 적어준 후 '수정' 클릭

-> 이 과정을 지나고나면 전체 드라이브의 용량이 늘어난다. 하지만 전체 드라이브가 커진 것이지, 스토리지의 용량이 자동으로 커지진 않는다.

[파일 시스템 확장 과정]
lsblk -> 어떤 파티션의 크기를 조정해야 하는지 확인
df -h -> 디스크 용량 확인

sudo growpart [디바이스 이름][파티션 번호] -> 파티션 크기 조정 ex) sudo growpart /dev/xvda 1
sudo resize2fs /dev/xvda1 -> 파일 시스템 확장

CPU 사용률 100%는 장애를 의미하지 않아요. 그럼에도 파악하는 이유는?

CPU가 포화상태면 처리하지 못하고 대기하는 프로세스가 발생하기 때문에

메모리가 고갈되면 어떤 상황이 발생할까요?

실행속도 저하, 프로그램 다운, 정상적으로 동작하지 않음 등의 문제가 발생할 수 있을 것 같습니다.

디스크가 꽉 차면 어떤 현상이 발생할까요? 그리고 어떤 파일들부터 지우면 좋을까요?

속도가 느려지고 더 이상 파일을 저장할 수 없습니다.
임시 파일이나, 사용자가 저장해놓은 사진 같은 지워도 아무런 문제 없는 파일들부터 지우면 좋을 것 같습니다.

Reverse Proxy를 별도로 구성함으로써 얻는 이점을 설명해주세요.

필터링을 통한 검열.
로드밸런싱을 이용한 분산 부하.

참고
1단계 - 배포하기
2단계 - 운영하기

0개의 댓글