Category: Linux

Apache Tomcat 연동하기 – mod_jk

Tomcat 을 단독으로 운영하지는 않는다. 여러 서버에서 설치한 후에 이것을 부하분산하는 방법으로 운영하는데, 자주 쓰이는 방법이 Tomcat 앞단에 Apache 웹 서버를 두고 이 둘을 연결해주는 방법으로 사용을 한다.

이때 연결방법이 여러가지가 있는데, Tomcat 과 Apache 를 위한 전용의 모듈이 있는데 그것이 바로 mod_jk 이다. mod_jk 는 AJP 프로토콜을 사용해서 이 둘을 연결해주는데, 다른 연결들보다 성능이 우수하다.

환경

이번 테스트한 환경은 다음과 같다.

  • OS: CentOS7 x86_64
  • Java Version: jdk-1.8.0_u65
  • WAS: Tomcat 8.0.30

그리고 서버는 한대이고 Tomcat 을 여러개 설치했다. 이때에 하나의 Tomcat 을가지고 멀티인스턴스 생성방법을 사용했다. 각각의 WAS 서버의 정보는 다음과 같다.

  • instance1, 8109 AJP Port
  • instance2, 8209 AJP Port
  • instance3, 8309 AJP Port

Apache 웹 서버는 CentOS 7 에 Yum 을 이용해서 설치했다. 이때 설치할때에 “httpd-devel.x86_64” 도 함께 설치해줘야 한다.

mod_jk 설치

mod_jk 는 Apache 홈페이지에서 다운로드 가능하다.

설치는 apxs 를 이용해서 Apache 모듈로 설치를 해주면 끝나게 된다.

위와같이 오류없이 libtool 로 설치가 완료되면 정상이다.

mod_jk 설정

mod_jk 에 대한 설정은 기본적으로 두가지 측면에서 이루어진다. 첫째는 Apache 웹서버에서 mod_jk 를 핸들링을 어떻게 할건지에 대한 설정이고 두번째는 mod_jk 가 Apache로부터 받은 요청을 어떻게 Tomcat 에 전달할 것인지에 대한 것이다.

Apache 웹서버에서 mod_jk 설정

mod_jk 를 정상적으로 컴파일 설치했다면 Apache 웹서버에서 이를 인식시켜주고 설정을 해줘야 한다.

여기서 한가지 주의해야할 것이 있는데, CentOS7 에서 Yum 으로 설치한 Apache 의 경우에는 설정하는데 카테고리별로 디렉토리를 분리를 해놨다.

  • 모듈 로딩 설정 디렉토리: /etc/httpd/conf.modules.d
  • 모듈별 설정 디렉토리:  /etc/httpd/conf.d

모듈을 로딩하기 위해서 다음과 같이 conf.modules.d 디렉토리에서 파일을 작성한다.

이렇게 하고나서 다음과 같이 문법 테스트를 해준다. 이 문법 테스트는 설정을 변경할때마다 해주는 것이 좋다.

 

이제 Apache 에서 mod_jk 에 대한 설정을 다음과 같이 해준다.

기본적인 설정은 위와 같다. 저장한 다음에 “workers.properties”, “uriworkermap.properties” 빈 파일을 만들어 줍니다.  Apache 문법 테스트를 해보고 오류가 없다면 정상이다.

mod_jk worker 설정

이 설정은 Apache 와 Tomcat 간에 어떻게 연결을 해야하는지에 대해 정의한다. 이 파일은 위에 “httpd-jk.conf” 파일에서 “conf.d/workers.properties” 로 정의되어 있다.

여기서 고려해야할 사항은 다음과 같다.

  • worker 이름: worker 이름은 정하기 나름이지만 각각 뒷단의 Tomcat 서버를 구분할 수 있는 이름이여야 한다. 이 worker 이름은 나중에 로드밸런싱을 할때에 Tomcat 에도 적용되어지는 이름이기에 잘 설정해야 한다.
  • worker port: 여기서 말하는 port 는 뒷단 Tomcat 서버의 AJP 포트를 말한다.
  • worker type: 이건 ajp13  으로 설정하면 된다.
  • worker lbfactor: 부하분산을 위한 설정으로 뒷단 Tomcat  서버들에 연결 무게를 설정해준다.

 

mod_jk uriworkermap 설정

이 설정은 특정 URI 에 대해서 mod_jk 의 woker 가 동작하도록 해서 요청을 Tomcat 에 넘길 수 있도록 해준다. Apache – Tomcat 구조에서 최초의 요청은 Apache 가 받아 URI 를 해석하는데, 이 설정을 해주면 특정 URI 에 대해서 Apache 가 Tomcat 에게 넘기게 된다.

여기서 간단한 시나리오를 생각해보자. 현재까지 설정은 부하분산(Loadbalance) 가 없는 것이다. 각 3대의 Tomcat 인스턴스에 대해서 동일한 무게를 주었을 뿐이다. 이렇게되면 특정 URI 요청이 있을때에 어느 Tomcat 인스턴스로 보낼것인지도 문제가 된다.

테스트를 위해서 Tomcat 설치시 나오는 메인페이지를 기준으로 하기로 했다. 이 페이지를 들여다보면 jsp, png, css 파일들로 이루어져 있다. 그러면 jsp 는 instance1 서버가 서빙을 하게하고 png 는 instance2 이 css 는 instance3 이 하게 하면 어떨까하는 시나리오를 만들고 이를 설정에 적용해 보자.

 

테스트

테스트는 간단하다. 브라우저를 실행시키고 http://apache-server-ip/index.jsp 주소로 이동해보는 것이다. 이때 Tomcat 초기 메인화면이 나온다면 정상이다.

그런데, 설정에서 jsp 는 instance1이 png 파일은 instance2 이 css 파일은 instance3 이 처리하도록 설정했었다. 그렇다면 실제로 그렇게 되고 있는지 확인을 해야하는데 확인방법은 각각 Tomcat 인스턴스에 접속 로그를 확인하면 된다.

내가 확인해본 바로는 원하는대로 로그가 찍혔다.

로드밸런스 설정

앞에 예제들은 로드밸런스 설정과는 관계가 없다. 로드밸런스라고 하면 instance1 인스턴스가 응답하지 않을 경우에 다른 서버들이 그 역활을 대신하는 것을 말한다. 이를 위해서는 woker 설정과 urlworkermap 설정을 변경해주어야 한다.

일단, 테스트를 위한 시나리오는 앞에서 서빙했던 jsp, png, css 파일들은 각각의 인스턴스들이 모두 제공하는 것으로 한다. 이렇게되면 urlworkermap 설정은 다음과 같이 바꿔주면 된다.

worker 이름을 balancer 라고 했는데, 이는 worker 설정파일에서 사용할 것이다.

로드밸런스는 특정 인스턴스가 죽었을 경우에 다른 서버가 그 역활을 대신하는 것이다. 이를 위해서 로드밸런스 역활을 위한 worker 이름을 정의하고 그 worker 에 로드밸런스를 위한 worker 이름을 정의해주면 된다. 기존의 worker 파일에 다음과 같이 로드밸런스 내용을 추가하면 된다.

강조한 라인을 주의깊게 보기 바란다.

한가지 더, Tomcat 인스턴스들에게 설정을 해줘야 한다. JvmRoute 설정이라고 하는데, 이 설정을 위한 방법은 두가지가 있다. 첫째는 System.property 를 이용한 방법이고 두번째는 server.xml 을 편집하는 방법이다.

첫번째 방법은 Tomcat 인스턴스 구동시에 커맨드라인으로 값을 넣어주는 것으로 다음과 같이 해주면 된다.

보통 Tomcat 의 시작 스크립트는 JVM_OPTS 옵션을 인식한다. 위와같이 Tomcat 인스턴스의 시작 스크립트에 커맨드 라인 옵션으로 jvmRoute 이름을 주면 인식하게 된다.

두번째는 server.xml 파일을 다음과 같이 편집하는 것이다.

위와같이 설정해주면 된다.

만일 두가지 설정을 모두 했을 경우에는 server.xml 파일 설정이 우선되어 적용된다.

테스트

편한 방법으로 설정하고 Apache와 Tomcat 인스턴스를 재시작해주고 index.jsp 를 호출해보면 된다.

HTTP 접속 포트 끄기

이렇게 Apache – Tomcat 연동을 하고나면 반드시 Tomcat 인스턴스의 HTTP 접속 포트를 Disable 해주는걸 잊지 말아야 한다.

 

 

가상 머신에 콘솔 접속하기

CentOS 6/7 혹은 RHEL 6/7 은 KVM 가상화를 지원 합니다. 가상화를 위한 네트워크를 설정하고 가상화 패키지를 설치하면 이제 가상 머신, 게스트 OS 를 설치할 수 있게 됩니다. 그런데, 맨 처음에 게스트 OS 를 설치하고 나면 더구나 DHCP 로 IP를 할당 받는다면 설치가 끝나고 나서 할당된 IP를 모르기 때문에 바로 접속을 할 수가 없습니다.

그래서 virt-manager 를 이용해서 게시트OS 화면에 접속하고 로그인을 하고 IP를 확인한 후에 SSH를 이용해서 외부에서 접속이 가능해 집니다. 하지만 이것말고 호스트 OS 터미널에서 게스트 OS로 virsh 명령어를 이용해서 접속할 수 있는데 이것이 가상 머신에 콘솔 접속하기 입니다.

virsh 명령어

virsh 명령어는 호스트OS에서 게스트OS(가상머신)을 관리하기 위한 명령어 입니다.

가상머신 이름이 나오는데, 이를 이용해서 다음과 같이 직접 게스트OS에 접속이 가능합니다.

하지만 게스트OS에 접속이 안됩니다.

게스트OS Grub 설정 변경

이를위해서 게스트OS에 Grub 에 옵션으로 다음과 같이 ‘console=ttyS0’ 을 추가해 줍니다.

하지만 이렇게 하나하나 다 하기보다는 다음과같은 명령어를 이용하면 편합니다.

CentOS6/RHEL6 의 경우 – grubby

grubby 는 각종 옵션들을 쉽게 설정할 수 있게 해줍니다. 위의 경우에 다음과 같이 할 수 있습니다.

CentOS6/RHEL6 에는 이렇게만 하고 서버를 재시작해줍니다.

CentOS7/RHEL7 의 경우 – /etc/default/grub 편집

CentOS7/RHEL7 의 경우에는 grub2 를 채택하고 있고 공통적인 옵션들은 ‘/etc/default/grub’ 파일에 있습니다. 이 파일을 편집해 줍니다.

이렇게 하고 grub2 를 다음과 같이 갱신해 줍니다.

위와같이 하고 난후에 가상머신을 재시작해줍니다.

접속 테스트

가상머신을 재시작한 후에 호스트OS에서 다음과 같이 접속을 해봅니다.

명령어를 입력해주고 Enter 를 두번 쳐주면 접속 로그인이 나옵니다. Console 접속을 해제하기 위해서는 Ctl+] 를 입력하시면 됩니다.

 

CentOS에서 SNMP 설치 및 설정하기

SNMP(Simple Network Management Protocol) 은 원래 네트워크 장비를 관리하기 위한 통신 규약입니다. 그런데, 이제는 네트워크 장비뿐만아니라 컴퓨터, 전자장비까지 확장해서 사용하고 있습니다. 리눅스 시스템에서도 SNMP를 사용할 수 있습니다.

이를 이용하면 SNMP 를 이용해서 중앙집중식으로 각각의 장비들의 자원, 자원사용량등을 장비에 거의 모든 것을 알 수 있고 가지고 올 수 있습니다. 저의 경우에는 Cacti 라는 시스템 자원 모니터링 시스템에서 원격 시스템의 자원 사용량을 가지고 오기 위해서 각 서버마다 SNMP를 사용합니다.

준비

이 문서는 다음과 같은 환경에서 작성되었습니다.

  • CentOS 7
  • X86_64

SNMP는 서버/클라언트 구조를 가지고 있습니다. 중앙 집중식으로 한 곳에서 정보를 모을 경우에는 중앙 서버를 제외하고 SNMP 데몬만 설치해주면 됩니다.

설치

설치는 Yum 을 이용해 다음과 같이 해주면 됩니다.

위에 뒷부분 ‘net-snmp-utils’ 는 SNMP 데몬하고는 아무런 관련이 없기 때문에 설치를 않해되 되지만 SNMP 데몬의 제대로 동작하는지를 테스트하기 위해서는 설치해주는 것이 좋습니다. ‘net-snmp-utils’ 는 말 그대로 SNMP를 다루기위한 여러가지 명령어들이 들어 있습니다.

설정

CentOS7 의 특징은 데몬이 실행될때에 옵션을 제공해 줄 수 있는데, 이를 위해서 ‘/etc/sysconfig’ 디렉토리에 데몬이름으로 파일을 가지게 됩니다. 그러면 데몬 실행 프로그램에서 이를 import 해서 사용하곤 하는데 SNMP 데몬도 이와 같습니다.

먼저 데몬 실행 옵션을 다음과 같이 설정 해줍니다.

위 옵션들은 다음과 같습니다.

  • -Ls 는 로그 메시지 stderr, stdout 으로 내보내고 로그레벨을 정한다. 기본은 -Lsd 로 d 는 LOG_DEBUG 을 말한다. 로그의 수준은 0 ~ 7 까지 존재하는데 다음과 같다.

    이는 -LSwd 나 -LS4d 식으로 숫자와 알파벳으로 지정할 수 있다. -LSed / -LS3d 같은 예제이다. 또, -LS1-5d 처럼 로그레벨 수준을 어디서 어디까지로 정할 수도 있다. 위 예제에서는 데몬 메시지를 syslog 로 보내는데 로그 레벨 1~5까지를 보내라는 뜻이다.
  • -Lf 는 지정한 파일로 로그 메시지를 보낸다. 위 예제에서는 /dev/null 임으로 로그 메시지를 삭제하는 효과를 보인다.
  • -p 는 pid 파일을 지정해 준다.

다음으로 SNMP 자체 설정을 합니다. 아래의 예제는 시스템 자원을 읽기 전용으로만 설정하는 것입니다.

SNMP 설정은 ‘sec.name’ 별로 설정을 할 수 있습니다. sec.name 을 여러게 정의하면 group도 여러개 설정할  수 있고 이렇게 되면 access 도 여러개 설정할 수 있습니다. 주목할 것은 access 에서 뒷부분에 read, write, notif 가 보이는데, 위 예제가 시스템 자원을 읽기만 할 것이기 때문에 read 부분만 all 로 하고 나머지를 none 으로 한 것입니다.

마지막으로 systemd 에 snmpd 를 활성화 해주고 시작해 줍니다.

로깅 변경

위 설정대로 하면 snmpd 로그가 /var/log/messages 에 저장이 됩니다. 하지만 /var/log/messages 는 커널 메시지도 저장되고 하는 중요한 것이여서 별도 파일에 저장하는 것이 좋습니다.

이를 위해서 snmpd 를 위한 별도의 로그 파일 설정을 해주는데, 먼저 /etc/sysconfig/snmpd 설정을 다음과같이 바꿔 줍니다.

rsyslog 데몬에서 다음과 같이 설정해 줍니다.

위에 예제에서 첫번째라인은 로그레벨 6 에 대해서는 /var/log/message 에서 제외하고 로그레벨6은 /var/log/snmpd.log 에 저장하도록 지정한 것입니다.

이렇게 해주고 데몬을 재시작 해줍니다.

로그 로테이션도 설정해 줍니다.

만일 일일이 출력하고 싶지 않다면 /etc/snmp/snmpd.conf 파일에 다음과 같이 설정해 줍니다.

 

Firewalld 설정

CentOS 7 에서는 iptables 에서 firewalld 로 변경되었습니다. snmpd 를 위해 firewalld 를 설정해 줘야 합니다.

먼저 snmp 관련해서 방화벽 열기위한 정보를 xml 파일로 작성해 줍니다.

그리고 다음과 같이 public zone 에 등록해줍니다.

 

Nginx 설정.

이 문서는 Nginx  설정에 대한 문서 입니다. 계속적으로 업데이트가 됩니다.

요청 메소드 제한

요청 메소드는 GET, HEAD, POST, PUT, DELETE 등이 있다. 문제는 대부분 웹 서비스는 GET, HEAD, POST 만 필요로한다는 것이다. Nginx 에서 이를 다음과 같이 제한 할 수 있다.

GZIP 설정

 

Nginx + PHP-FPM + MariaDB 설치 (CentOS 7)

과거에는 APM (Apache + PHP + MySQL)이 인기있는 플랫폼이 였지만 최근에는 Nginx 가 나오고 PHP-FPM 이 나오면서 NPM 으로 많이 대체되고 있는 추세에 있습니다. 이 글은 Nginx,PHP-FPM, MariaDB 설치에 관한 것입니다.

준비

이 글에서 NPM을 설치하는 환경은 다음과 같습니다.

  • CentOS 7.2.1511
  • X86_64
  • Selinux Disable
  • 작성시간: 2015. 12. 27

설치하는 방법은 CentOS 7 에서 제공하는 패키지 관리 프로그램인 YUM을 이용하는 것입니다. 다음과 같이 CentOS 7 를 최신 버전으로 만듭니다.

 

PHP 설치

다음과같이 YUM 을 이용해서 설치해 줍니다.

php-mysql 은 MariaDB 와 연동하기 위한 것임으로 함게 설치해 줍니다.

systemctl 에 등록하고 시작해 줍니다.

php-fpm 의 pool 설정을 다음과 같이 해줍니다.

세션(Session) 디렉토리의 소유권을 cacti 로 변경해 줍니다.

 

MariaDB 설치

MariaDB 의 최신 버전 설치를 위해서 다음과 같이 YUM 저장소를 추가해 줍니다. YUM 저장소 추가는 다음 내용을 파일로 저장해주면 됩니다.

현재 MariaDB 의 최신버전은 10.1 이기 때문에 baseurl 에 버전이 정확해야 합니다. 다음과 같이 설치를 해줍니다.

systemctl 에 등록을 해주고 데몬을 시작해 줍니다.

mysql_secure_installation 을 실행해서 root 패스워드와 불필요한 데이터베이스를 삭제 합니다.

 

Nginx 설치

Nginx 의 최신 버전 설치를 위해서 다음과 같이 YUM 저장소를 추가해 줍니다. YUM 저장소 추가는 다음 내용을 파일로 저장해주면 됩니다.

cacti 서비스를 예를들어 다음과 같이 cacti.conf 파일을 작성합니다.

웹 서비스를 위한 홈 디렉토리가 ‘/home/cacti’ 를 만들어주고 www 디렉토리를 생성해 줍니다.

nginx 문법체크를 하고 systemctl 에 서비스를 등록하고 서비스를 시작해 줍니다.

80(http) 방화벽 설정

80 포트, 즉 HTTP 를 위한 방화벽 설정을 다음과 같이 해줍니다.

 

 

DNS amplification DDos attacks (DNS 증폭 DDos 공격)

최근에 관리하는 서버에 트래픽이 몰리는 현상이 발생했다. 웹 서비스 트래픽도 아니기에 뭔가 싶어 봤더니 53 포트를 통한 input 트래픽이였다. 그래서 ngrep 으로 53 포트를 모니터링 하니 대략 다음과 같이 나왔다.

뭔가 자꾸 DNS 서버에 쿼리(Query)를 보내고 있었고 이로 인해서 트래픽이 발생하는게 분명했다.

DNS amplification DDos attacks (DNS 증폭 DDos 공격)

‘DNS amplification DDos Attacks’ 는 DNS 증폭 DDos 공격으로 불리운다. 왜 ‘증폭’ 일까?

DDos 는 대량의 트래픽이 필요하다. 초당 수십 Gbps 를 유발시켜야 하는데 이렇게 할려면 많은 장비가 필요하다. 그러다보니 DDos 공격을 개인이 한다는 건 무리가 있다. 그런데, DNS 서버는 이런 많은 장비 없이도 대량의 트래픽을 유발시킬 수 있는 구조적인 면을 안고 있다.

DNS 는 인터넷을 위해서는 반드시 존재해야만 하는 서버다. 인터넷 전화번호부 라고도 불리우는 서버로 인간의 주로 사용하는 도메인을 컴퓨터가 알아볼수 있는 IP 주소로 변환한다. 브라우저 주소창에 도메인을 입력하면 DNS 서버에 그 도메인의 IP 주소를 질의(Query) 한 후에 받은 IP를 가지고 실제 서버에 접속하는 구조다.

이렇게 DNS 는 질의(Query)를 받아 응답한다. 그런데, DNS 에 보낼 수 있는 질의(Query)는 다양하며 그중에서 재귀적 질의(Recursive Query) 가 문제가 된다. 재귀적 쿼리는 DNS 서버가 보유한 도메인 리스트에 질의한 내용이 없을 경우 이를 다른 DNS 서버에 질의하는 것을 말한다.

예를들어 DNS-A 이라는 DNS 서버에 naver.com 을 질의했다면 DNS-A 서버는 먼저 자신의 도메인 리스트에 naver.com 이 있는지 찾게 된다. 없다면 최상의 DNS 서버인 ROOT-DNS 서버에 DNS-A 서버가 naver.com 서버의 IP가 무엇인지 질의하게 된다. ROOT-DNS 서버는 naver.com 주소의 TLD(Top Level Domain) 인 .com DNS 서버에 물어보라고 DNS-A 서버에 알려주고 다시 DNS-A 서버는 .com TLD 서버에 질의한다. .com TLD 서버는 naver.com 네임서버에게 물어보라고 응답하고 DNS-A 서버는 드디어 naver.com 을 가진 DNS 서버에 IP를 요청하고 이를 받아서 클라이언트에게 응답하는 것으로 임무는 종료 된다.

  • OS에 설정된 DNS-A 서버에 naver.com 의 IP를 요청한다.
  • DNS-A 서버는 자신의 도메인 리스트나 도메인 캐쉬에서 naver.com IP를 찾는다. 있다면 응답하고 끝나게되고 없다면 다음으로 진행.
  • DNS-A 서버에 naver.com 이 없음을 알게된 서버는 최상의 DNS 서버은 ROOT-DNS 에 naver.com IP를 질의한다.
  • ROOT-DNS 는 naver.com 의 TLD (Top Level Domain) 인 .com DNS 에 물어보라고 DNS-A 에게 알려준다.
  • .com DNS 서버는 naver.com 도메인의 DNS 서버에게 물어보라고 DNS-A 에게 알려준다.
  • 마침내 DNS-A 서버는 naver.com 도메인의 DNS 서버에 IP가 뭐냐고 질의한다.

여기에 질의 내용을 ‘ANY’ 로 할 경우에는 응답하는 양이 많아진다. 도메인의 DNS 구성에는 MX, A, TXT, CNAME 등 다양하다. 질의할때에는 어떤 타입을 원하는지를 정할 수 있게 되는데, ANY 타입의 질의는 도메인이 가지고 있는 모든 정보를 원하게 된다.

결국 재귀적 질의와 ANY 타입의 질의를 결합해 초당 수백건의 도메인 질의를 보내게 되면 DNS 서버는 이 질의에 응하게되고 수십Gbps 의 응답 트래픽을 발생시키게 된다. 이것이 바로 ‘DNS 증폭 DDos 공격’ 이다.

이 공격은 대부분 DNS 의 잘못된 설정 탓이다. BIND 9 의 경우에는 재귀적 질의를 맞음으로써 간단하게 해결할 수 있다.

BIND 9 의 기본 설정은 ‘recursion yes’ 임으로 이를 바꿈으써 ‘DNS 증폭 DDos 공격’을 막을 수 있다. 이 공격을 막았을 경우 로그는 다음과 같이 쌓인다.

 

gitlab 패스워드 리셋하기

gitlab 패스워드 리셋하기

Gitlab 을 사용하다가 갑자기 패스워드를 잊어버리는 경우가 생길 수 있습니다. 이럴때 보통 Web 에서 ‘Fogot your password’ 링크를 클릭하고 리셋될 패스워드를 가입할때 적어놓은 E-mail 로 발송을 해줍니다. 그런데, E-mail 주소가 없는 거라면 패스워드를 리셋할 수가 없어서 로그인을 못하게 됩니다.

이럴때는 Gitlab 서버에 터미널로 로그인을 해서 gitlab-rails console을 실행하고 패스워드를 바꿀 수 있습니다. 먼저 gitlab-rails console로 접속을 합니다.

여기서 만일 E-mail 주소를 정확하게 알고 있다면 다음과 같이 user 객체를 지정할 수 있습니다.

그런데 위와같이 ‘nil’ 로 나오면 없는 사용자라는 거죠. 그럼 다음은 id 로 검색을 합니다. id 는 내부 데이터베이스에 저장될때에  사용되어진 primary key 인듯 합니다. 보통 사용자가 1명이라면 이 방법이 통하지만 수십명이면 안되겠죠.. (전 집에서 개인적으로 사용하기 때문에 사용자가 1명인 경우입니다. )

뭔가 나오네요… 그런데 이마저도 모르겠다!! 그러면 사용자 로그인 아이디로 검색을 해봅니다.

뭔가 나왔군요. 그러면 user 객체가 생성되어진 겁니다.

패스워드는 다음과 같이 바꾸면 됩니다.

그리고 바로 Web 에서 변경된 패스워드로 로그인이 가능합니다.

Suspend 된 게스트 시작 않될때 해결 방법.

Suspend 는 보통 게스트를 Paused 상태로 만드는 것을 말한다. 이는 동작상태를 하드디스크에 그대로 저장하고 끝내는 것을 말하며 이를 재시작하는 것을 Resume 이라고 한다. 명령어로는 그냥 start 명령어를 쓰지만 Suspend 에서는 부팅이 아닌 저장하고 끝난 부분을 풀고 바로 시작되는 것이 다르다.

그런데, Suspend 한 이미지를 시작하려고 할 때에 다음과 같이 오류가 나왔다.

아무리 Resume 을 할려고 하더라도 위와 같은 오류로 시작도 않되었다. 이럴때는 다음과 같이 해서 부티을 시도하는 것이 좋다.

이는 앞에서도 말했듯이 Supsend 될때에 저장된 이미지를 삭제하도록 한다. 앞에서 오류는 바로 이 저장된 이미지를 풀고 Resume 을 하려고 하는 것인데, 이 이미지가 잘못되었것이다. 이럴때는 어쩔수 없이 부팅을 해야하게이 이를 삭제하고 시작하면된다.

ELK 구축하기 1 – Logstash

ELK 는 ElasticSearch, Logstash, Kibana 를 말하며 보통 이 시스템은 실시간 로그분석 시스템으로 불리웁니다. Logstash 는 로그를 실시간으로 전송하고 ElasticSearch 는 전송된 로그를 검색 인덱스를 만들어 보관하며 Kibana 는 ElasticSearch 의 분석한 자료를 시각화해줍니다.

이를 이용하면 시스템 자체 뿐만 아니라 각종 애플리케이션의 로그들을 분석하고 시각화된 통계자료를 자동으로 얻을 수 있습니다.

첫번째로 Logstash 를 설치해보도록 하겠습니다.

설치

Logstash 는 Java 7 이상이 필요합니다. Java 7 을 설치해야 합니다. 이것이 없으면 동작이 안됩니다.

Logstash 홈페이지에서 다운로드 받아 설치할 수 있습니다. tar.gz 도 있고 우분투, 레드햇 패키지도 있어 자신에게 필요한 것을 받아 설치하면 됩니다.

 

기본개념

Logstash 의 기본 개념을 잠깐 살펴보겠습니다.

마치 쉘(Shell)의 파이프라인(pipeline)처럼 동작합니다. 입력을 받아서 출력을 해주는 구조 입니다. 그리고 입력 받은 내용을 필터링을 하고 출력할 수도 있습니다.

Logstash 에서 Input, Filter, Output 이 핵심이며 다양한 Input, Filter, Output 에 대응하기 위해서 각각 플러그인을 가지고 있습니다. 예를들어 다양한 입력을 받아야 하는 경우에 운영자가 Input 자체를 구성할 수 있지만 누군가 만들어놓은 플러그인 설치하면 끝나게 됩니다.

basic_logstash_pipeline

결국 Logstash 를 운영은 수집하고자 하는 로그에 대해서 Input, Filter, Output 어떻게 만들고 구성할것인가가 핵심이 됩니다. 그래서 설정파일의 형식은 다음과 같습니다.

 

사용법

명령행으로 사용할 수 있습니다.

‘-e’ 옵션은 명령행에서 설정파일을 작성할 수 있도록 해줍니다. 설정 내용을 보면 input 부분에 ‘stdin{}’ 으로 표준입력을 받겠다는 것이고 output 에 ‘stdout{}’ 으로 표준출력으로 결과를 내보내겠다는 뜻입니다.

이제 아파치 로그 파일을 Logstash 설정파일을 만들어 분석해보도록 하겠습니다. 먼저 input 부분을 정의해 줘야 합니다. 예를들면 다음과 같습니다.

‘input{}’ 에는 어떤 형태의 입력을 받을 것인가를 정의하는데 이것을 플러그인(Plugin)이라고 합니다. 그래서 ‘input 플러그인이 무엇이냐?’하는 질문이 가능합니다. 여기서는 ‘file’ 이되며 보다 자세한 사항은 ‘Input plugins‘ 페이지를 참고하시면 됩니다. 그에 따른 세부사항을 설정하도록 되어 있습니다. 위 예제에서는 file 로부터 받을 것이기에 형태를 file 로 했고 세부사항으로 파일의 경로와 ‘start_position’ 을 정의했습니다. file 형태로 입력을 받을 경우에 기본값은 Unix 시스템의 ‘tail -f’ 와 같이 실시간으로 파일에 새롭게 써지는 로그들을 읽도록 되어 있는데 이를 바꾸고자 한다면 ‘start_position’을 이용하면 되고 위 예제에서는 파일의 처음부터 읽도록 바꾸었습니다.

다음으로 filter 을 정의해야 합니다. 아파치 로그를 파싱하기 위한 작업입니다. 역시나 filter plugin 들이 아주 많은데, 여기서는 기본으로 가지고 있는 grok 을 사용해서 다음과 같이 로그 파싱을 정의해줍니다.

아파치로그를 커스터마이징했다면 위의 예제와는 다르게 정의해야 합니다. 위 예제는 아파치로그가 “COMBINED” 로그로 설정되어 있어서 이 형태를 파싱하겠다 것입니다.

Output plugin 은 화면으로 출력을 하기위해 다음과 같이 stdout 을 사용합니다.

이것을 하나의 파일에 저장한 후에 다음과 같이 실행해 줍니다.

위와같이 원하는 결과가 화면에 나옵니다.