꼬반 Blog

[Node.js] 다수의 웹 서비스 상태 체크하기

안녕하세요. 꼬반 입니다. 지난번에 한번 회사에서 관리하는 웹 서비스들의 상태를 확인하기 위해 Url Check V1 을 포스팅 한적이 있는데.. 이번에 V2로 변경하면서 새로 작성합니다. 사실 지난번 V1은 이틀동안 날림으로 작업하면서 여러 문제점들이 있는 상태여서 이번에도 이틀의 시간이 소요되긴 했지만 나름 개선해서 아래와 같이 변경되었습니다. 이번 버전에서는 비동기로 동작하는 부분을 잘 이해하지 못하고 코드를 날림으로 작성해서 사실 클라이언트에서 테이블에 제대로 바인딩도 안되던 문제가 있었습니다. 이번엔 DB에 점검 URL을 읽어와서 상태를 확인하고 응답시간을 체크해서 DB에 업데이트 후 해당 내용을 클라이언트에 전송해서 정상적으로 바인딩 되게 코드를 수정했습니다. (지금도 날림인건 마찬가지..) ..

Read More

[nodejs / pageres] 웹 서비스 상태 확인하기

회사에서 관리하는 웹 서비스가 약 40개 가량 되다보니 모니터링이나 관리가 필요하여 어제, 오늘 간단하게 만들어보았습니다. 물론 해당 서버들에는 nagios 나 whatap, whatsup 등으로 모니터링을 하고 있고 서비스가 다운되면 메일로 알림이 오긴 하지만 아무래도 한눈에 지금 사이트들이 다 정상인지 아닌지 확인하기는 좀 어려운 부분이 있는건 사실입니다. 그래서 다음과 같은 요구 사항을 가지고 만들었습니다. 1. 모니터링 도메인의 추가/삭제 가능2. 해당 도메인의 현재 상태 (response 응답 코드) 확인 가능 (대시보드에 접속했을때 동작) 3. 해당 사이트에 메인 페이지 스크린샷 저장 가능 일단은 위 요구사항을 기본으로 다음과 같이 작성하였습니다. URL 부분은 가려두었습니다. 액션부분은 아직..

Read More

오늘 삽질한 문제

nodejs 로 RESTful back-end 를 구성했다. 그런데 이게 get 메소드는 정상적으로 동작하는데 post 메소드에서는 계속 에러가 발생하는 것이 아닌가? 뭐지? bodyparser 를 잘못 사용했나 아니면 어디에 문제가 있나 한참 봤지만. 문제는 발견하지 못하다가.. 읭?? 바로 function(req, res) 이 부분을 function(res, req) 로 되어 있는 것을 발견.. 이럴수가. 고치고 나니 아주 잘 동작 한다. 쩝.. 이걸로 오늘 오전부터 방금까지 삽질.. 삽질의 연속이로구나. 어쨌든 오늘까지 쇼핑몰 관리자 페이지쪽 상품 목록 조회, 등록 기능 (기초적인 것) 구현하였고 front-end 쪽은 angularjs 빼고 작업 (ㅠㅠ) 메인에 최신 상품 리스트 출력 - 해당 제..

Read More

오픈 소스는 항상 변화무쌍 하다.

nodejs 2013년도에 발행된 책을 가지고 있다가 이번에 쇼핑몰을 만들어야 되서 nginx + html5 + angularjs (front-end) + nodejs(back-end) 로 구성하고 있는데 nodejs 를 백앤드로 REST 제공하고 이걸 front-end 에서 받아서 사용하려고 한다. 하여 책을 참고하며 기본 back-end 를 작성하다보니 세상에.. 책하곤 이미 사용방법이 너무나 많이 달라진 부분이 많다... express 안의 middle-ware 단은 다 밖으로 떨어져 나와있다니..

Read More

Node.js 에서 Hex로 파일 출력하기

사용하다보면 row level 에서 파일 입출력이 필요한 때가 있다. 해당 부분을 nodejs 로 하다가 파싱한 정보를 bmp로 저장해야 되는데 이때 저장을 hex 코드 자체로 저장해야만 정상적으로 동작한다. 그러기 위해서 여러 방법을 찾아보다가 아래를 통해 해결! http://stackoverflow.com/questions/18880301/node-js-convert-hexadecimal-number-to-bytearray?answertab=active#tab-top 역시 스택오버플로우님이 짱이시다. new Buffer("250001000192CD0000002F6D6E742F72", "hex") 해당 버퍼를 파일로 저장하면 끝.

Read More

nodejs + express + cluster 사용하기

====== nodejs + express + cluster 사용하기 ====== nodejs version : v0.10.26 express version : v4.0.0 앞서서 express 가 버전업이 많이 되면서 과거와 다르게 express 만 전역으로 설치해서는 자동으로 프로젝트를 생성해주지 않는다. express-generation 을 설치해야만 이전과 같이 자동으로 프로젝트를 생성할 수 있다. $ npm install express-generation -g 이렇게 설치하고 자동으로 프로젝트를 생성하게 되면 이전 버전과는 실행방법에 약간 차이가 발생한다. 이전버전의 경우는 아래처럼 실행을 했다면 $ node app.js 4. 버전에서는 $ npm start 위와 같이 실행하여 준다. 그러면 b..

Read More

[Node.js] 다수의 웹 서비스 상태 체크하기

안녕하세요. 꼬반 입니다.


지난번에 한번 회사에서 관리하는 웹 서비스들의 상태를 확인하기 위해 Url Check V1 을 포스팅 한적이 있는데..


이번에 V2로 변경하면서 새로 작성합니다.


사실 지난번 V1은 이틀동안 날림으로 작업하면서 여러 문제점들이 있는 상태여서 이번에도 이틀의 시간이


소요되긴 했지만 나름 개선해서 아래와 같이 변경되었습니다.



이번 버전에서는 비동기로 동작하는 부분을 잘 이해하지 못하고 코드를 날림으로 작성해서 사실 클라이언트에서


테이블에 제대로 바인딩도 안되던 문제가 있었습니다.


이번엔 DB에 점검 URL을 읽어와서 상태를 확인하고 응답시간을 체크해서 DB에 업데이트 후 


해당 내용을 클라이언트에 전송해서 정상적으로 바인딩 되게 코드를 수정했습니다. (지금도 날림인건 마찬가지..)


그리고 상단엔 한번에 알 수 있도록 넣었습니다.


다만 이번엔 모든 URL을 다 확인후 DB를 불러오기때문에 로딩시간이 좀 걸립니다...


음.. 그 부분은 어쩔수 없네요. 


이력 관리는 하지 않습니다. 지금 요구사항은 어디서든 한번에 서비스 상태를 확인하기 위한 거라.


추후 히스토리가 추가될 수는 있을수도... 

반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post

[nodejs / pageres] 웹 서비스 상태 확인하기

회사에서 관리하는 웹 서비스가 약 40개 가량 되다보니 모니터링이나 관리가 필요하여


어제, 오늘 간단하게 만들어보았습니다.


물론 해당 서버들에는 nagios 나 whatap, whatsup 등으로 모니터링을 하고 있고


서비스가 다운되면 메일로 알림이 오긴 하지만


아무래도 한눈에 지금 사이트들이 다 정상인지 아닌지 확인하기는 좀 어려운 부분이 있는건 사실입니다.


그래서 다음과 같은 요구 사항을 가지고 만들었습니다.


1. 모니터링 도메인의 추가/삭제 가능

2. 해당 도메인의 현재 상태 (response 응답 코드) 확인 가능 (대시보드에 접속했을때 동작)

3. 해당 사이트에 메인 페이지 스크린샷 저장 가능


일단은 위 요구사항을 기본으로 다음과 같이 작성하였습니다.



URL 부분은 가려두었습니다. 액션부분은 아직 미정인 부분입니다.


메인에 접속하면 모니터링 대상 도메인을 불러와 상태를 확인하고 해당 스크린샷을 찍어서 테이블로 뿌려줍니다.


ui는 bootstrap / nodejs, express, pageres 가 주 모듈이고, DB는 사용하지 않습니다.


개선 사항으로는


1. 스크린샷에서 확인되는 것 처럼 NO가 정렬되지 않고 노출되는 부분에 대한 수정

2. 스크린샷이 현재 시점으로 저장되는데 날짜와 시간을 파일명에 추가하여 이력관리가 가능하도록 할 것

3. 액션 추가 (왼쪽 메뉴의 관리, 이력 포함)


정도가 있습니다. 추후 수정하겠죠.. 아마...


주요 소스는 아래와 같습니다.


index.js - router

router.get('/', function(req, res) { fs.readFile('../url.list', 'utf8', function (err, data) { var array_url = data.split("\n"); res.header("Access-Control-Allow-Origin" , "*"); res.render('index', { result: array_url }); }); }); router.get('/load', function(req, res) { fs.readFile('../url.list', 'utf8', function (err, data) { var array_url = data.split("\n"); res.header("Access-Control-Allow-Origin" , "*"); res.send(array_url); }); }); router.post('/check', function(req, res) { var body = req.body; //console.log(body.t_url); check.checkUrlStatus(body.t_url, function(result) { //console.log(result); res.header("Access-Control-Allow-Origin" , "*"); res.send(result+" : "+body.cnt); }); });


checkUrl.js

/**
 * Created by ggoban on 16. 1. 4.
 */
var http = require('http'),
    url = require('url'),
    Pageres = require('pageres');
    require('events').EventEmitter.defaultMaxListeners = Infinity;

exports.checkUrlStatus = function (Url, callback) {
        var options = {
            method: 'GET',
            host: url.parse(Url).host,
            port: 80,
            path: url.parse(Url).pathname
        };

        var pageres = new Pageres({delay: 2})
            .src(Url, ['1024x768'])
            .dest(__dirname+'/public/screenshot');
        pageres.run(function (err) {
            if (err) {
                throw err;
                console.log(err);
            }
            console.log('done');
        });

        http.get(options, function (res) {
            //console.log(options);
            //console.log(res.statusCode);
            callback(options.host+options.path+" : "+res.statusCode);
        }).on('error', function(e) {
            //console.log(options);
            //console.log(e.message);
            callback(options.host+options.path+" : "+ e.message);
        });

}

위 버전은 현재 standalone 버전으로 작성해두었고 원래 진행하고 있는 satm쪽으로 모듈을 추가할 예정입니다.


월, 화 이틀동안 급조하느라 소스가 매우 허접합니다. ㅠ _ㅠ 혹시나 해당 포스팅을 보시게 되면 가감없이


수정할 부분이나 부족한 부분에 대해 지적해주시면 매우 감사하겠습니다.

반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post

오늘 삽질한 문제

nodejs 로 RESTful back-end 를 구성했다.


그런데 이게


get 메소드는 정상적으로 동작하는데


post 메소드에서는 계속 에러가 발생하는 것이 아닌가?


뭐지?


bodyparser 를 잘못 사용했나


아니면 어디에 문제가 있나 한참 봤지만.


문제는 발견하지 못하다가..


읭??


바로 function(req, res) 이 부분을 function(res, req) 로 되어 있는 것을 발견..


이럴수가.


고치고 나니 아주 잘 동작 한다.


쩝.. 이걸로 오늘 오전부터 방금까지 삽질..


삽질의 연속이로구나.


어쨌든 오늘까지 쇼핑몰 관리자 페이지쪽 상품 목록 조회, 등록 기능 (기초적인 것) 구현하였고


front-end 쪽은 angularjs 빼고 작업 (ㅠㅠ) 메인에 최신 상품 리스트 출력 - 해당 제품 상세페이지 연동


이제 리스트 페이지쪽 손 좀 보고 상품 등록 부분을 좀 디테일 하게 고친뒤


로그인, 회원, 게시판 순으로 기능 추가 해야겠다.


http://www.jarambebe.com


반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post

오픈 소스는 항상 변화무쌍 하다.

nodejs 2013년도에 발행된 책을 가지고 있다가 이번에 쇼핑몰을 만들어야 되서


nginx + html5 + angularjs (front-end) + nodejs(back-end) 로 구성하고 있는데


nodejs 를 백앤드로 REST 제공하고 이걸 front-end 에서 받아서 사용하려고 한다.


하여 책을 참고하며 기본 back-end 를 작성하다보니 세상에.. 책하곤 이미 사용방법이 너무나 많이 달라진 부분이 많다...


express 안의 middle-ware 단은 다 밖으로 떨어져 나와있다니..

반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post

Node.js 에서 Hex로 파일 출력하기

사용하다보면 row level 에서 파일 입출력이 필요한 때가 있다.

해당 부분을 nodejs 로 하다가 파싱한 정보를 bmp로 저장해야 되는데

이때 저장을 hex 코드 자체로 저장해야만 정상적으로 동작한다.

그러기 위해서 여러 방법을 찾아보다가 아래를 통해 해결!

http://stackoverflow.com/questions/18880301/node-js-convert-hexadecimal-number-to-bytearray?answertab=active#tab-top

역시 스택오버플로우님이 짱이시다.

new Buffer("250001000192CD0000002F6D6E742F72", "hex")
 
해당 버퍼를 파일로 저장하면 끝.

반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post

nodejs + express + cluster 사용하기

====== nodejs + express + cluster 사용하기 ======

nodejs version : v0.10.26
express version : v4.0.0

앞서서 express 가 버전업이 많이 되면서 과거와 다르게 express 만 전역으로 설치해서는 자동으로

프로젝트를 생성해주지 않는다. express-generation 을 설치해야만 이전과 같이 자동으로 프로젝트를 생성할 수 있다.

<code>
$ npm install express-generation -g
</code>

이렇게 설치하고 자동으로 프로젝트를 생성하게 되면 이전 버전과는 실행방법에 약간 차이가 발생한다.
이전버전의 경우는 아래처럼 실행을 했다면

<code>
$ node app.js
</code>

4. 버전에서는

<code>
$ npm start
</code>

위와 같이 실행하여 준다. 그러면 bin 폴더내의 www 파일이 실행되어 지는데 살펴보면 기존 버전에서 server를 listen 하는
부분이 실행부분으로 분리가 되고 기존 app.js 는 export.module 로 사용되어지는 것 뿐. 방식은 동일하다.

이를 유의하여 cluster 를 적용하면 아래와 같이 된다. 아래 내용은 www 파일을 수정하여 적용한 것이다.


#!/usr/bin/env node
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;
var debug = require('debug')('my-application');
var app = require('../app');

if(cluster.isMaster) {  for(var i=0;i    cluster.fork();
  }
  cluster.on('exit', function(worker, code, signal) {
    console.log('worker' + worker.process.pid + ' died');
    cluster.fork();
  });
} else {
  console.log(" worker:="" %s",="" process.pid);
  app.set('port', process.env.PORT || 3000);

  var server = app.listen(app.get('port'), function() {
    debug('Express server listening on port ' + server.address().port);
  });
}
위와 같이 작성하여 실행하여 보면 cpu core 갯수만큼 worker 가 생성되어 지는 것을 확인할 수 있다.
또한 worker 가 호출되는것을 확인하고자 한다면 router 에서 url 이 호출될때의 worker pid 를 확인하면 된다.

<code>
route/index.js

router.get('/', function(req, res) {
  console.log(process.pid);
  res.render('index', { title: 'Express' });
});
</code>

위와 같이 console.log() 로 process.pid 를 출력하여 보면 각기 다른 worker가 호출되는 것을 확인 할 수 있다.

참고1 : https://gist.github.com/ageldama/1546478
참고2: http://eclipse.or.kr/wiki/%ED%8A%B9%EC%A7%91%EA%B8%B0%EC%82%AC:Node_JS_%EB%A9%80%ED%8B%B0%EC%BD%94%EC%96%B4_CPU_%EC%A7%80%EC%9B%90%ED%95%98%EA%B8%B0

다만 cluster 를 사용하여 구성하는 경우 session 이나 socket.io 와 같이 내부 data 가 공유되지 못하는 부분이 발생하는데

이와 같은 부분인 redis 나 memcache 를 통해 해결할 수 있다.

참고3: http://nodeqa.com/nodejs_ref/55


반응형

Article By 꼬반

*certificate* : VCP 5(2012), RHCSA 7 (2014), RHCE 7 (2015), RHCSA in REDHAT OpenStack(2017) *development language* : Javascript, NodeJS, Golang, html5, css3, shell script *middle ware* : NGINX, Apache, Tomcat, Docker, Docker Swarm, Mesos, Kubernetes, HCI,

Discuss about post