반응형
반응형

vm환경에서 CentOS를 사용하다가, 특정 프로세스가 메모리점유를 많이해버려서, 메모리가 부족하게 되면,

커널 설정에 따라, oom-killer가 동작을 하고, 원하지 않는 서비스가 제멋대로 kill되어 버리는 상황이 발생한다.


메모리가 부족해도 서비스가 돌아가야 하는 상황에서는, vm.overcommit_memory 값을 변경하여

프로세스가 kill되지 않도록 할 수 있다.


vm.overcommit_memory값은 0~2까지 설정할 수 있으며, 값에 대한 정의는 아래와 같다.

- 0 : 메모리 부족 시 프로세스를 kill

- 1 : 항상 overcommit 허용 (kill하지 않음)

- 2: vm.overcommit_ratio에 설정된 범위만큼만 overcommit을 허용)


여기서는 항상 overcommit을 허용하도록 세팅을 해보도록 하겠다.

$ sysctl vm.overcommit_memory = 1     # 커널 설정 변경
$ echo "vm.overcommit_memory=1" >> /etc/sysctl.conf  # 재부팅 시에도 유지할 수 있도록 파일에 추가
$ sysctl -a | grep overcommit_memory   # 확인


반응형
,
반응형

upstart는 /etc/init 이하에 있는 설정 파일들을 자동으로 읽어들일 수 있게끔 구성이 되어 있기 때문에,

서비스로 구동 시킬 서비스의 configuration 파일을 /etc/init/{서비스명}.conf 형태로 작성을 하면 된다.


docker-compose를 이용해 구성한 컨테이너들도 서비스로 등록이 가능하다.


설정파일 예시 (ex: /etc/init/docker-registry.conf)

description "Docker Registry"  

# 아래 start, stop의 runlevel은 왠만해선 바꿀일이 없기 때문에, 그냥 사용하면 된다.
start on runlevel [2345]  
stop on runlevel [016]

# 자동 재시작을 설정한다. (아래에 있는 limit 설정만 있으면 기능 동작이 안됨)
respawn   

# 자동 재시작 (뒤에 두개의 argument는 COUNT, INTERVAL이다. 제한을 없애려면 unlimited만 적어준다.)
# 즉, 5초동안 10번 재시작해도 재시작에 실패하면 그냥 재시작하지 않겠다는 의미
respawn limit 10 5 

# 디렉토리 변경
chdir /root/docker-registry

# 명령어 실행 (가급적이면 절대경로)
exec /usr/local/bin/docker-compose up


upstart로 띄운 서비스의 로그 확인은 /var/log/upstart/{서비스명}.log 에서 확인이 가능함.

반응형
,
반응형

vagrant의 공식 reference에 보면, cpu, memory에 대해서 설정하는 부분이 나와있지만,

global하게 설정하는 방법밖에 나와있지 않다. (https://www.vagrantup.com/docs/virtualbox/configuration.html)


대충 아래와 같이 설정하면 global하게 설정이 됨.

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
   config.vm.provider "virtualbox" do |vb|
       vb.cpus = 2
       vb.memory = 1024
   end
end


저 설정을 응용해서 여러대의 vm이 있는 경우 각 vm에 provider옵션을 추가하여, cpu, memory를 세팅할 수 있다.

# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|

   # 1번 머신
   config.vm.define "ubuntu1" do |ubuntu1|
      ubuntu1.vm.box = "ubuntu14_docker"
      ubuntu1.vm.network "private_network", ip: "192.168.33.10"
      ubuntu1.vm.hostname="ubuntu1604-1"
      ubuntu1.vm.provider :virtualbox do |vb|    
          vb.cpus = 2
          vb.memory = 2048
      end
  end  

  # 2번 머신
  config.vm.define "ubuntu2" do |ubuntu2|
      ubuntu2.vm.box = "ubuntu14_docker"
      ubuntu2.vm.network "private_network", ip: "192.168.33.11"
      ubuntu2.vm.hostname="ubuntu1604-2"
  end

  # 글로벌 설정
  config.vm.provider "virtualbox" do |vb|
       vb.cpus = 2
       vb.memory = 1024
  end
end


1번 머신은 세팅한 대로 2Core에 2GB로 세팅이 되었고, 별다른 설정하지 않은 2번 머신은 글로벌 설정에 따라 2코어에 1GB로 세팅이 되는 것을 확인할 수 있다.

반응형
,
반응형

python에 있는 SMTPLib을 이용해서 cronjob으로 sendmail을 호출하는데, 갑자기 메일이 안보내지길래,

syslog를 까보니, 아래와 같은 에러가 발생하였다. (아래 로그 중 회사관련 정보는 삭제하였음.)

Dec 26 09:02:09 sm-mta[23722]: uBQ929kP023720: SYSERR(root): 도메인 주소. config error: mail loops back to me (MX problem?)
Dec 26 09:02:09 sm-mta[23723]: uBQ929pM023723: 도메인 주소 [127.0.0.1] did not issue MAIL/EXPN/VRFY/ETRN during connection to MTA-v4
Dec 26 09:02:09 sm-mta[23722]: uBQ929kP023720: to=, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=121252, relay=hostname. [127.0.0.1], dsn=5.3.5, stat=Local configuration error
Dec 26 09:02:09 sm-mta[23722]: uBQ929kP023720: uBQ929kP023722: DSN: Local configuration error
Dec 26 09:02:09 sm-mta[23722]: uBQ929kP023722: to=root, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=60000, dsn=2.0.0, stat=Sent
Dec 26 09:02:09 sm-mta[23722]: uBQ929kP023722: to=, delay=00:00:00, xdelay=00:00:00, mailer=esmtp, pri=60000, relay=도메인 주소, dsn=5.3.5, stat=Local configuration error


원인은 머신이 알고 있는 host정보가 유효하지 않아서 발생하는 문제였고,

hostname을 확인하여 /etc/hosts와 /etc/mail/local-host-names에 있는 내용을 각각 바꿔주면 된다.

왠만하면 동일하게 바꿔주는 게 좋다.


[/etc/hosts]

127.0.0.1 hostname


[/etc/mail/local-host-names]

127.0.0.1 hostname


우분투 14.04 기준이기 때문에, 다른 OS는 처리방법이 다를 수도 있다.

반응형

'개발 > Python' 카테고리의 다른 글

[Python] paramiko for SSHClient  (0) 2017.02.10
[Python] requirements.txt  (0) 2017.01.31
[Python] file read / write  (0) 2016.11.09
[Python] multipart file upload  (0) 2016.11.09
[Python] logging to file  (0) 2016.11.09
,
반응형

Node.Js에서 사용할 Mysql ODM을 찾던 중, Sequelize라는 솔루션을 발견하여, 잘 써먹고 있던 도중

.fn('NOW') 함수를 이용하여, datetime 형태의 data를 insert할 경우 UTC 시간으로 입력이 되는 이슈를 발견하였다.


참고 : sequelize link 클릭 시 새창 (http://docs.sequelizejs.com/en/v3/)


이런 경우 sequelize의 constructor를 호출하는 과정에서 아래와 같이 timezone 옵션을 넣어, 한국 시간 (UTC+09:00) 으로 변경을 할 수 있다.


자체적으로 connection pooling 기능도 제공을 하는데, 그것도 constructor의 옵션 중 pool이라는 옵션으로 넣어주면 된다.

 var sequelize = new Sequelize('DB명', '계정', '비밀번호', {
    host: '127.0.0.1',
    dialect: 'mysql',
    timezone: '+09:00',
    pool: {
        max: 20,   // 최대 유지 connection 수
        min: 5,    // 최소 유지 connection 수
        idle: 60000 // connection을 몇ms까지 대기시킬 것인가 (이후엔 버려짐)
    }
});


반응형
,
반응형

윈도우에선 잘 되던 npm start가 linux로 옮기니 아래와 같은 에러가 발생하였다.

sh: 1: concurrent: Permission denied

npm ERR! Linux 3.13.0-32-generic
npm ERR! argv "/usr/bin/nodejs" "/usr/bin/npm" "start"
npm ERR! node v6.9.2
npm ERR! npm  v3.10.9
npm ERR! code ELIFECYCLE


권한이 없어서 발생하는 문제로 node_modules/.bin 폴더의 permission을 755로 바꿔주면 해결된다.


$ chmod 755 node_modules/.bin


반응형
,
반응형

맨날 Jquery + Freemarker만 하다가 Angular2를 시도해보던 중..

특정 ID로 값을 가져오는 방법에 대해 고민을 했었는데, 고민할 거 없이 그냥 JQuery를 사용하면 되는 거였다.


아래와 같이 $ 만 선언해주고, typescript구문에서 사용을 하면 됨..

당연한 이야기지만, html 페이지에 jquery는 사전에 import가 되어 있어야 한다.


declare var $ : any;

var aaa = function() {
    var id = $('#ID').val();     // javascript와 완전히 동일함.
    return id;
}
반응형
,

[Angular2] @Input

개발/Front-End 2016. 12. 19. 14:07
반응형

Angular2에는 @Input이라는게 있는데 외부에서 Parameter(HTML기준으로는 attribute)를 넘겨 받아, 값으로 활용할 때 사용한다.


아래 예를 한 번 보자.

import { Component, Input } from '@angular/core';

@Component({
    selector: 'input-div',
    template: `

{{title}}


` }) export class InputDivComponent { @Input() title: string; // title변수는 외부로 부터 받아서 활용한다. // (이름이 너무 긴 경우 @Input('a')와 같이 argument로 alias name을 넘겨서 활용할 수도 있다.) } // 위에 있는 컴포넌트를 아래 추가할 두개의 컴포넌트에서 동일하게 활용할 것이므로, 변수로 선언함. var inputDivParentTemplate = ``; @Component({ selector: 'input-div-a', template: inputDivParentTemplate }) export class InputDivAComponent { title: string = "A"; } @Component({ selector: 'input-div-b', template: inputDivParentTemplate }) export class InputDivBComponent { title: string = "B"; }


View에서는 아래와 같이 태그만 가져다가 쓰면, Component에 명시한 Template대로 태그가 그려진다.

    loading...
    loading..


Angular2를 처음 접해본 입장에서는 왜 굳이 한 번만 사용할 Component를 두개나 추가로 만들어서 사용하는 지 의문이 들거고..

InputDivComponent 하나만 작성하고, 아래와 같이 html을 작성할 수도 있다.

    loading...
    loading..


실제로 위와 같이 만들어서 돌려보면 loading...만 나올 것이다.

Angular2가 동작하는 매커니즘 상, 최초 초기화시에는 Component를 미리 선언하여 그대로 활용만 하는 것 같고,

HTML단에서 Component에 명시한 selector를 직접 활용하는 것은 별도의 설정 없이는 불가능하거나 Angular2 매커니즘상 허용하지 않는 것 같다.

반응형
,
반응형

Express의 경우 기본적으로 html view engine을 지원하지 않기 때문에,

html파일 로딩을 위해서는 file loading 후에 Content-Type을 변경하여 rendering해주어야 한다.

var fs = require('fs');
var path = require('path');
var express = require('express');
var app = express();

// npm으로 jquery나 angular등을 설치한 경우 node_modules에 들어있는 필요한 js, css 파일 등을 접근해야 하므로
// 아래 구문을 추가하여 direct로 접근할 수 있게끔 설정해준다.
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules'))); 

app.get('/get_html', function(req, res) {
    fs.readFile('static/test.html', function(err, data) {
        if(err) {
            console.log(err);
        } else {
            res.writeHead(200, {'Content-Type': 'text/html'});
            res.end(data);
        }
    });
});

반응형
,
반응형

Express설치는 매우 간단하기 때문에, 아래 링크를 참조해서 잘 깔면된다.

https://www.tutorialspoint.com/nodejs/nodejs_express_framework.htm


Express가 설치되었다는 가정하에, 아래 코드 몇 줄이면 application/json 으로 통신이 가능한 웹 서버를 띄울 수가 있다.

var express = require('express');
var app = express();

var bodyParser = require('body-parser');
app.use(bodyParser.json());     // 이 부분이 Json Protocol을 지원하겠다는 의미

// POST API 등록
app.post('/test_json_api', function(req, res) {
    req.accepts('application/json');
    jsonBody = req.body;     // json parsing
    console.log(jsonBody);
});

// 8081 포트로 서버를 띄운다.
app.listen(8081, function() {
    console.log('server listening on port %s.', 8081);
});


반응형
,
반응형