카테고리 Archives: linux

AWS 의 EBS 스냅샷

현재는 EC2의 Lifecycle manager 의 등장으로 인해 오래된 snap-shot 의 삭제가 자동으로 이루어 지기 때문에 크게 필요가 없는 스크립트 이다.

물론 Lifecycle manager 에 비해 기능이 좀더 많다.

AWSCLI 를 사용하기 때문에 설치가 필요로 하다 ‘ㅅ’a

 

기능적으로는 아래와 같다.

1. AWS_REGION_ARR 에 선언된 리전을 타겟으로 한다.

2. RETENTION_LIMIT 에 지정된 일자(7개월) 만큼 매월 1일 데이터를 보관한다.

3. RETENTION_DAILY 에 지정된 일자(1개월) 만큼 매일 데이터를 보관한다.

4. BACKUP=ON 이 선언될 경우 작동중인 인스턴스의 모든 EBS 볼륨의 snap-shot을 생성한다.

5. SC_MODE=TEST 가 실제 작동이 아닌 어떤 작동을을 하게 될지 echo로 출력한다.

 

AWS 클라우드 인스턴스 크기 선택

물리서버에서 오랜 경험이 있는 엔지니어의 경우

일반적으로 서버 사양 선택을 직접 하지 않거나 구매 시점의 가장 가성비가 좋은 일반적인 구매(보통 판매자 추천) 사양을 사용하여

서비스 구현을 하기 마련이므로 클라우드 진입을 고려할때 일반적으로 인스턴스 크기 선택 장애가 발생 한다.

 

그럼 클라우드로 넘어갈때 가장 중요한 인스턴스 선택은 무엇으로 해야 하는가?

 

1. 웹서버 ( prefork )

웹서버는 일반적인 운영 환경에서는 1% 미만의 load 가 발생한다.

마더 프로세스 에서 차일드 프로세스를 호출하기때문에 기본적으로 멀티쓰레드화 되어 있다.

mod_php 를 사용할 경우 메모리 사용량은 프로세스당 14.7MB 정도이다. (물론 더 커지기도 한다.)

HTTPD 메모리 사용량 체크

Prefork 기본 mpm 설정상 150 커넥션을 활성화 하기 때문에 2,100MB 의 메모리 용량이 필요로 하다.

구글링을 통해 검색하여 max client 값을 1024 등으로 설정 했다면 최소 15G 의 메모리를 필요로 한다. (저런거 따라하지 맙시다.)

MaxConnectionsPerChild 는 지정된 횟수 만큼의 커넥션을 처리하고 프로세스가 종료 되고 새로운 차일드가 생성되도록 하는 옵션이다.

프로세스는 어려 작업을 실행함에 따라 메모리 사용량으 증가하고 이 값을 0 으로 하거나 너무 크게 잢을 경우 메모리 부족에 허덕이게 된다.

반면 너무 작게 할경우 차일드를 종료 하고 새롭세 스폰 할때 오버 헤드가 발생하여 cpu 사용량을 늘어나 악 영향을 준다.

prefork 에서의 추천하는 값은 5000 정도…

 

2. 웹서버 ( worker / event )

Worker/event mpm의 경우 기본적으로 250 커넥션을 가지며 1개의 차일드가 25개의 커넥션을 담당 한다.

즉 10개의 차일드가 각각 25커넥션을 담당 하며 각 차일드의 메모리 사용량은 적당한 평균치가 없다. 너무 격차가 심하기 때문에..

다만 사용하는 메모리는 prefork 대비 작은편이고 약 1024 커넥션의 경우 12기가 정도의 메모리 사용량을 확인한 적이 있다.

MaxConnectionsPerChild 는 약 50000 정도가 적당 하였다.

 

3. 웹서버 ( nginx )

메모리 사용량은 비 튜닝 기준으로 120~150MB 정도 이다.

일반적으로 정적 데이터 처리 및 Revers Proxy 용도로 사용 했다.

rewrite 룰셋을 바꿔야 하는 불편한 점이 있기 때문에 다중 사이트 보다는 한개의 사이트를 운영하기엔 유리 하다.

 

4. 웹서버 ( tomcat )

tomcat 은 기본값으로 200 connect 를 처리할 수 있으며 메모리 사용량은 500 MB 이상이며 일반적인 사용에서 900MB 정도의 메모리 사용량을 보인다.

 

5. DB 서버( mysql )

cpu와 메모리를 많이 사용한다.

프로세스를 보고 있으면 50% 는 기본적으로 먹고 간다. 기본값에서는 기본 메모리 500M 정도를 사용하고 DB가 증가함에 따라 사용량이 늘어 난다.


AWS 클라우드 에서 범용 상품군은 크게 t2, m4, m5, c4, c5 이다.

이중 t2 상품군의 경우 기본적으로 다른 상품군 보다 저렴 하지만.. cpu 과점이 될경우 추가 사용료가 청구 된다.

 

AWS 테스트 서버를 올리고 (일반적으로 free tier 인 t2.micro) 사용하다 방치하게 될 경우 해킹을 통해 CPU 가 과점상태가 되어 막대한 추가 비용이 발생 한다.

 

CPU가 과다 사용되는 DB 서버의 경우에는 c4, c5 상품군 혹은 r4 상품군이 적합하다고 볼수 있다.

( RDS 서비스도 좋다. ec2 직접 구성 보단 약 10%~20% 가량 비싸지만 백업등등 생각하면 동등 하다고 본다. )

웹서버는 과도한 로드가 발생하지 않을 경우 t2 에서 충분하다 (cpu가 nano = 5% / micro = 10% 미만으로 사용 해야 한다.)

표는 aws 메뉴얼에서  확인할 수 있다.

 

리눅스는 기본적으로 자체 커널을 위해 약 300M~500M 정도의 메모리 사용한다.

nginx + php 만 구성하여 웹서버를 구성하면 약 t2.micro/t2.small 정도면 충분하다.

예약 인스턴스 (1년 선납) 을 한다고 하면 약 40% 정도 할인이 된다. (3년은 60% 정도 할인…)

2018-07-23_144957

한 서버에 DB 및 웹서버를 사용하려면 t2.medium 정도는 사용해야 한다. (cpu 크레딧 사용량이 40% ) ( $504.576 )

그이상은 t2.large 부터는 전혀 효용 가치가 없다 다른 상품군( m5.large )이 가성비가 더 쓸만하다고 생각된다.

 

스타트업 기업에서는

t2.medium/c5.large 으로 LAMP (Linux – Apache – Mysql – PHP)  로 사용하다가

추후 DB 를 분리한다는 구조로 가는게 적합 한듯 하다.

1 클라이언트는 서버에 8개의 tcp 를 동시 접속 하기 때문에 ServerLimit 는 8배로 지정 한다. (최대값 2000)

(4G 메모리 분배 : 커널 500M / Mysql 1G / Apache 2G / 버퍼 500M ) ( 동시 접속자수( Maxclient: 130 // ServerLImit : 1040 ) 정도의 값을 지향한다.
(8G 메모리 분배 : 커널 500M / Mysql 2G / Apache 4.2G / 버퍼 800M ) ( 동시 접속자수( Maxclient: 320 // ServerLImit : 2000 ) 정도의 값을 지향한다.

 

기존 물리서버에서 클라우드로의 이행을 생각한다면 위 표를 참조로 필요 대수와 발생 금액등을 생각한다.

물리서버의 평균 수명인 3년 금액 과 클라우드 3년 사용료를 비용 을 대조 하고

클라우드의 +@인 관리 편의, 백업 편의, 가용성 등을 고려하여 잘 생각한다.

AWS – AMI 리전 복사

AWS 에서 생성하여 운영중인 EC2 를 AMI(Amazon 머신 이미지) 를 생성하여 다른 Region 으로 복사 할 수 있다.

즉 서버 이동이 리전을 이동하여 생성할 수 있기 때문에 많이 쓰이지는 않겠지만…

 

사용된 OS 는 CentOS 7 이고 AMI 복사 및 인스턴스 시작은 문제 없이 진행이 되었다.

리전간 복사한 AMI를 이용하여 인스턴스를 시작할 경우 SSH로 로그인을 할수 없는 경우가 발생 하였다.

2018-06-18_120712

발생한 사유는 selinux 의 fcontext 가 리전간 복제 후 인스턴스를 시작할때 풀려버리는 문제가 있다.

Server refused our key

Disconnected: No supported authentication methods available.

 

정상 값 ssh_home_t

비 정상 값 default_t

 

해결 방법은 아래와 같이 해결이 가능할 것으로 보인다.

  1. 원본 서버에서 selinux 를 disabled 시킨다. ( vi /etc/sysconfig/selinux )
  2. AMI를 생성 한다.
  3. AMI를 다른 리전으로 복사 한다.
  4. 복사된 AMI를 이용하여 인스턴스를 새롭게 띄운다.
  5. selinux 를 enforcing 시킨다.

 

아울러서 복사전에 다음과 같이 authorized_keys 파일의 컨텍스트를 선언해 두는것도 도움이 될 수 있다.

 

graylog 를 통한 syslog 통합 감사(audit)

graylog 는 syslog 처리를 위한 빅데이터 분석 솔루션이다. 기본적으로야 syslog 를 한곳에 적재하여 로그 감사를 하는 목적으로 사용한다.

물론 syslog 뿐만 아니라 웹로그등을 수집하여 분석하는것 역시 가능하다.

Mongodb + elasticsearch + java 를 사용하여 운영 되며 노드를 추가하여 다중 노드에서의 분석 처리가 가능하다.

2018-05-18_111423 위와 같이 대쉬보드를 만들어 한눈에 볼수 있으며 alert 설정을 통해 중요 특정한 이벤트 발생시 손쉬운 확인이 가능 하다.

graylog 의 권장 사항은 4GB의 램을 필요로 하나 구축테스트를 해본 결과 1GB 에 2GB 수준의 swap 으로 정상적인 운영이 가능했다.

오픈소스이기 때문에 유료 프로그램인 kiwi syslog의 라이선스 비용 대비 40% 수준이면 클라우드에 구축하여 운영할 수 있다.
(t2.micro / 1 core – 1GB RAM) CentOS7 에서 graylog 를 설치 하는 방법을 설명한다.

 

1. 가상 서버를 준비하고 기본적인 업데이트 및 hostname 지정 등을 한 뒤에 리부팅 한다.

 

2. 시스템 메모리 및 네트워크 튜닝값을 적용 한다.

 

3.  swap 을 생성한다.(aws-centos7 의경우 swap 설정되어 있지 않다.)

  • 프로그램 초기 설치시 selinux 충돌을 방지 하기 위해 임의 setenforce 0 명령어로 selinux 를 permissive 모드로 변경 후 진행 한다.

  • 재부팅 후에 swap 이 자동 적용 될수 있게 fstab 을 수정한다. ~]# vi /etc/fstab

 

4. elasticsearch 설치

 

5. mongodb 설치

 

6. mongodb 설정

  • mongdb 의 data 파일을 /free/mongo_data 에 적재할 예정 이기 때문에 conf 파일을 수정 하고 selinux 설정을 추가 한다.

 

7. graylog 설치

 

8. graylog 설정

  • conf 파일을 수정하기 전에 pwgen 을 이용하여 secret 값을 생성 하고 shasum 을 이용하여 관리자 패스워드 값을 생성한다.

~]# vi /etc/graylog/server/server.conf     ## 각 값을 찾아서 수정한다.

 

9. graylog 시작 및 systemd 등록

 

10. nginx 설치

  • 여기서는 손쉬운 http/2 구축과 brotli 이미지 압축 등을 위해 codeit – nginx 을 설치 한다.

 

11. nginx 설정

  • DH 파라메터파일을 생성 한다.

  • /etc/nginx/nginx.conf 파일을 수정한다.

  • /etc/nginx/conf.d/default.conf 파일을 수정한다.

 

12. let’s encrypt 를 이용하여 인증서 발급을 진행하였음.  ( https://www.enteroa.com/2016/03/12/lets-encrypt-설치-및-운용centos )

  • nginx 에서 location 으로 let’s encrypt 설정을 /var/www 으로 했기 때문에 아래와 같은 명령어로 인증서 발급이 가능 하다.

 

13. selinux 설정

 

14. graylog 설정

  • graylog 서비스가 모두 정상적이라면 웹접근을 통해서 로그인을 할 수 있다. 2018-05-18_140231
  • 로그인 한 뒤에 먼저 대시보드를 생성한다.
    2018-05-18_142706
  • 이후 input 생성을 하기위해 아래와 같이 설정 진행을 한다. 2018-05-18_140445
  • 기본적으로 아래 다섯 항목을 설정 한다.
    2018-05-18_140416
  • 설정을 하게 되면 input 이 생성되고 곧 running 상태가 된다.2018-05-18_141255

 

15. linux – rsyslog 설정 (UDP 설정)

  • ~]# /etc/rsyslog.conf 파일의 맨밑에 삽입 한다. ( @=UDP / @@=TCP )

  • rsyslog 을 재시작 한다.

 

16.  생성된 input 의 show recived messages 버튼으로 이동하면 아래와 같은 화면을 볼 수 있다. (검색 화면과 같다.)

  • 검색 일자를 선택하고 대쉬보드 추가를 할 수 있다.
    2018-05-18_143141

 

17. L3 – syslog 설정 (cisco)

  • cisco 스위치의 경우 input 생성을 할때 RAW/Plaintest UDP 를 선택해서 진행해야 한다. ( RFC3414 표준이 아님 )
  • 아울러 스위치는 일반적으로 분배의 목적으로 한개의 gateway 밑에 존재하므로 각 스위치마다 별도의 input 을 만든다
  • input 을 만들때 override source 옵션을 통해 특정된 port 에 들어온 메세지의 소스 호스트 네임을 알기 쉽도록 Office-L3 와 같이 설정한다.
  • 일반적인 switch 장비의 log 설정 방법은 아래와 같다.

 

Let’s encrypt 에서 생성된 pem 인증서를 tomcat에서 사용 하기

Let’s encrypt 의 경우 일반적인 apache / nginx 에서 사용이 가능한 pem 파일을 생성 한다.

 

때문에 tomcat 에서 사용을 하기 위해서는 jks 로의 변환을 해서 org.apache.coyote.http11.Http11NioProtocol 프로토콜로 사용을 하거나

apr 및 tomcat-native 설치 하여 org.apache.coyote.http11.Http11AprProtocol 을 사용할 수 있다.

 

먼저 pem 파일을 jks 로 만드는 스크립트 이다. 중요한 부분은 18~22 줄이다.

이후 server.xml 설정에서 아래와 같이 설정하여 https 를 활성화 할 수 있다.


다른 방법으로 Http11AprProtocol 프로토콜을 사용하여 pem 파일을 jks 로 변환 없이 사용할 수 있다.

또한 apr 프로토콜을 사용할하고 tomcat 8.5 혹은 tomcat 9 의 경우 http/2 를 지원 한다.

활성화 하기 위해서는 tomcat-native 을 설치해야 한다.

server.xml 에서는 아래와 같이 설정 한다.