Server monitoring: netdata

 

netdata

netdata는 서버의 현재 상태를 보여주는 모니터링 툴로서, 상세한 내용을 미려한 UI로 출력해주고 자동화된 설치 스크립트를 제공하기 때문에 설치와 관리가 쉽다. 데모는 https://london.my-netdata.io/default.html 에서 확인해볼 수 있다.

 

netdata 설치

curl -V

netdata 설치 스크립트는 curl 명령을 이용하므로 먼저 위 명령어로 (V는 대문자) 우분투 서버에 curl이 설치되어 있는지 확인한다.  curl 7.58.0 등의 버전이 출력되지 않고 curl이 설치되어 있지 않다는 메시지가 출력된다면 sudo apt update && sudo apt install curl 명령으로 curl을 설치한다.

sudo apt update
bash <(curl -Ss https://my-netdata.io/kickstart.sh)

패키지 저장소 정보를 업데이트하고, netdata 설치 스크립트를 실행한다. 필요한 패키지를 설치하겠냐는 질문과 netdata 설치를 진행하겠냐는 질문에 응답해주면 netdata 설치가 자동으로 완료된다. 만일 수동으로 설치하고 싶다면 netdata의 설명을 참고한다.

 

방화벽 설정

sudo iptables -A INPUT -p tcp -m tcp --dport 19999 -j ACCEPT

iptables 방화벽에서 netdata가 사용하는 기본 포트 19999를 열어준다. (기본적인 방화벽 세팅은 앞선 글 우분투 서버 기본 설정에서 완료했다.)

sudo netfilter-persistent save
sudo netfilter-persistent reload

iptables 설정 내용을 저장하고 리로드한다. (iptables-persistent는 앞선 글 우분투 서버 기본 설정에서 설치했다.)

 

netdata 접속

 

내부 네트워크에서

내부 네트워크에서 웹 브라우저로 http://서버내부IP:19999에 접속하면 netdata의 서버 모니터링 화면을 볼 수 있다.

 

외부 네트워크에서

netdata는 로그인 인증 기능을 자체적으로 제공하지 않기 때문에 외부 네트워크에서 netdata에 접속하려면 VPN을 통해서 내부 네트워크에 연결한 다음에 접속하거나, VPN을 통하지 않고 외부 네트워크에서 바로 접속하려면 현재 우분투 서버에 운영 중인 웹 서버를 이용해서 로그인 인증 기능을 생성해주는 것이 좋다. 아래는 기존에 운영 중인 Nginx 웹 서버가 있다고 가정하고 설명한다.

sudo sh -c "echo -n 'varins:' >> /etc/nginx/.netdata"

로그인 ID를 결정해서 /etc/nginx/.netdata 파일에 저장한다. 위 예시의 varins를 원하는 ID로 변경해서 실행한다.

sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.netdata"

비밀번호를 암호화해서 /etc/nginx/.netdata 파일에 저장한다. 비밀번호를 묻는 메시지가 나오면 원하는 비밀번호를 입력한다. 암호화 되어 저장된 내용은 cat /etc/nginx/.netdata 명령으로 확인할 수 있다.

그다음, Nginx 서버 블록에 접속 설정을 한다. 앞선 글 웹 서버: Nginx에서 설정한 example.com의 서버 블록을 기준으로 보면 아래와 같다.

sudo nano /etc/nginx/sites-available/example.com

example.com 서버 블록 파일을 nano 편집기로 연다.

upstream netdata {
        server 127.0.0.1:19999;
        keepalive 64;
}


server {
        listen 80 default_server;

        server_name example.com www.example.com;

        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2 default_server;

        server_name example.com www.example.com;

        root /var/www/example.com/html;

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;

        ssl_protocols TLSv1.2;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256;
        ssl_ecdh_curve secp384r1;
        ssl_session_timeout 10m;
        ssl_session_cache shared:SSL:10m;
        ssl_session_tickets off;
        ssl_stapling on;
        ssl_stapling_verify on;
        resolver 1.1.1.1 1.0.0.1 valid=300s;
        resolver_timeout 5s;

        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;
        add_header X-XSS-Protection "1; mode=block";

        index index.html index.htm;

        location / {
                try_files $uri $uri/ =404;
        }

        location = /monitor {
                return 301 /monitor/;
        }

        location ~ /monitor/(?<ndpath>.*) {
                proxy_redirect off;
                proxy_set_header Host $host;

                proxy_set_header X-Forwarded-Host $host;
                proxy_set_header X-Forwarded-Server $host;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
                proxy_pass_request_headers on;
                proxy_set_header Connection "keep-alive";
                proxy_store off;
                proxy_pass http://netdata/$ndpath$is_args$args;

                gzip on;
                gzip_proxied any;
                gzip_types *;

                auth_basic "Protected";
                auth_basic_user_file /etc/nginx/.netdata;
        }

}

이렇게 파일의 첫 부분에 파란색으로 표시한 upstream netdata { } 블록을 추가하고, server { } 블록에 역시 파란색으로 표시한 내용을 추가하는데, 이 예시의 서버 블록은 https 보안 연결만을 허용하는 구성이므로 listen 443 영역에 추가한다.

빨간색 monitor는 접속 주소 https://example.com/monitor의 일부분이 되는 것으로 원하는 것으로 바꾸면 된다. auth_basic_user_file 항목에는 앞서 생성한 로그인 인증 정보를 담은 /etc/nginx/.netdata 파일 경로를 기록한다.

완료했으면 Ctrl키와 x키를 동시에 눌러 nano 편집기를 빠져나오면서 저장한다.

sudo nginx -t
sudo systemctl restart nginx

변경한 서버 블록이 적용되도록 Nginx 기본 문법을 검사한 뒤 Nginx를 재시작한다.

이제 어디에서든 https://example.com/monitor 에 접속하면 로그인 인증 과정이 나타나고 netdata의 서버 모니터링 페이지를 확인할 수 있다.

 

방화벽 삭제

만일 내부 IP 주소를 사용하지 않고 항상 https://example.com/monitor 주소로만 접속한다면, 앞서 iptables 방화벽에서 열어주었던 포트는 방화벽 규칙에서 삭제해도 된다.

sudo iptables -D INPUT -p tcp -m tcp --dport 19999 -j ACCEPT

sudo netfilter-persistent save
sudo netfilter-persistent reload

-D 옵션을 사용하면 규칙이 삭제된다. 삭제 후에는 iptables 방화벽을 저장하고 리로드한다.

 

netdata 설정

netdata 설정 파일은 /etc/netdata/netdata.conf 에 위치한다. 보다 자세한 사항을 설정하고 싶다면 netdata의 설명을 참고한다.

 

netdata 업데이트

netdata는 처음 설치될 때 우분투 서버의 작업 스케줄러 /etc/cron.daily 에 업데이트 스크립트를 등록하므로 별도의 추가 작업 없이 항상 최신 버전으로 유지된다. 만일 수동으로 업데이트 스크립트를 실행하려면

cd /usr/src/netdata.git
sudo ./netdata-updater.sh

netdata의 소스가 저장된 디렉토리로 이동한 다음, netdata 업데이트 스크립트 파일 netdata-updater.sh 을 실행한다.

 

netdata 제거

netdata를 우분투 서버에서 제거하려면 아래의 절차를 따른다.

cd /usr/src/netdata.git
sudo ./netdata-uninstaller.sh --force

netdata의 소스가 저장된 디렉토리로 이동한 다음, netdata 제거 스크립트 파일 netdata-uninstaller.sh--force 옵션으로 실행한다.

 

본 글의 저작권은 작성자 Varins에게 있습니다.
Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

코멘트 없음
맨위로