2016년 6월 25일 토요일

Shell 숫자 비교 | Shell Number Comparison

http://www.cyberciti.biz/faq/comparing-numbers-in-bash-shell/

AWS CloudWatch 메모리 감시 | AWS CloudWatch Memory Monitoring

Step 1
Make a policy for CloudWatch monitoring at IAM.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "cloudwatch:GetMetricStatistics",
                "cloudwatch:ListMetrics",
                "cloudwatch:PutMetricData",
                "ec2:DescribeTags"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

Step 2
Add CloudWatch monitoring policy to an IAM user, and get AWSAccessKeyID and AWSSecretKey .

Step 3
Run this script.

#!/bin/bash
set -e

sudo su -p <<HERE
# yum packages
yum -y install perl-Switch perl-DateTime perl-Sys-Syslog perl-LWP-Protocol-https

# install cloudwatch monitoring scripts
cd /opt/aws
curl http://aws-cloudwatch.s3.amazonaws.com/downloads/CloudWatchMonitoringScripts-1.2.1.zip -O
unzip CloudWatchMonitoringScripts-1.2.1.zip
rm -rf CloudWatchMonitoringScripts-1.2.1.zip
touch /opt/aws/aws-scripts-mon/awscreds.conf

# awscreds
echo 'AWSAccessKeyId=XXXXXXXXXXXXXXXX' >> /opt/aws/aws-scripts-mon/awscreds.conf
echo 'AWSSecretKey=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' >> /opt/aws/aws-scripts-mon/awscreds.conf

# crontab
echo '*/1 * * * * /opt/aws/aws-scripts-mon/mon-put-instance-data.pl --mem-util --mem-used --mem-avail' >> mycron
crontab mycron
rm -rf mycron
HERE

Step 4
Now you can get metrics about memory at CloudWatch.

빈 crontab에 job 더하기 | Add a job to an empty crontab

echo '*/1 * * * * /path/job' >> mycron
crontab mycron
rm -rf mycron

2016년 6월 24일 금요일

2016년 6월 22일 수요일

캐시 Redis 설정 | Redis configuration as a cache

You may use Redis as a database. However, in order to use Redis as a cache, you have to modify the configuration.

Default configuration

Modification options

maxmemory 100mb
maxmemory-policy allkeys-lru
stop-writes-on-bgsave-error no

Entire configuration as a cache

# Default - http://download.redis.io/redis-stable/redis.conf

bind 127.0.0.1
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error no
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 100mb
maxmemory-policy allkeys-lru
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

How to set timeout for a key-value set?

Use this command instead of SET [key] [value].

SETEX [key] [expire-time(seconds)] [value]

Read more

2016년 6월 21일 화요일

AWS Amazon Linux EC2에 Nginx와 pm2, nvm을 이용해서 Node.js 서버 구축 | Deploy Node.js server with Nginx, pm2 and nvm on AWS Amazon Linux EC2

deploy.conf - Configuration file for deploy scripts

#!/bin/bash
set -e

YUM_PACKAGES='gcc gcc-c++ git nginx'
NODEJS_VERSION='4.4.5'
PROJECT_NAME='aws-nodejs'
WEB_ROOT='/var/www'
PROJECT_DIR=$WEB_ROOT'/'$PROJECT_NAME
SSH_HOST='aws-nodejs'

_initialize - Deploy script to initialize EC2 and start Node.js application

set -e

source ./deploy.conf

sudo su -p <<HERE
set -e

# Set locale to C
echo 'LC_ALL=C' >> /etc/sysconfig/i18n
export LC_ALL=C

# yum packages
yum -y update
yum -y install $YUM_PACKAGES

# nvm
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.1/install.sh | bash
source ~/.bashrc
nvm install $NODEJS_VERSION
nvm use $NODEJS_VERSION

# user www-data
mkdir -p $PROJECT_DIR
useradd www-data
usermod -a -G www-data ec2-user

# Extract project
tar -xzf /home/ec2-user/$PROJECT_NAME.tar.gz -C $PROJECT_DIR

# directory permission
chown -R www-data:www-data $WEB_ROOT
chmod 2775 $WEB_ROOT
find $WEB_ROOT -type d -exec sudo chmod 2775 {} +
find $WEB_ROOT -type f -exec sudo chmod 0664 {} +

# npm install
cd $PROJECT_DIR
npm install --save

# pm2
npm install -g pm2
pm2 start $PROJECT_DIR/server.js
pm2 save
pm2 startup amazon -u www-data
chmod u+x /etc/init.d/pm2-init.sh
chkconfig --add pm2-init.sh
chown -R www-data:www-data ~/

# nginx
yes | cp -rf $PROJECT_DIR/deploy/nginx.conf /etc/nginx
chkconfig nginx on

# service
service nginx start
HERE

_release - Deploy script to release Node.js application

#!/bin/bash
set -e

source ./deploy.conf

sudo su -p <<HERE
set -e
source ~/.bashrc

# Extract project
tar -xzf /home/ec2-user/$PROJECT_NAME.tar.gz -C $PROJECT_DIR

# directory permission
chown -R www-data:www-data $WEB_ROOT
chmod 2775 $WEB_ROOT
find $WEB_ROOT -type d -exec sudo chmod 2775 {} +
find $WEB_ROOT -type f -exec sudo chmod 0664 {} +

# nginx
yes | cp -rf $PROJECT_DIR/deploy/nginx.conf /etc/nginx

# service
service nginx restart
service pm2-init.sh restart
HERE

Read More

2016년 6월 13일 월요일

Django에서 Celery 설정 | Celery with Django

pip packages

$ pip install celery

[project]/celery.py

import os
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE', '[project].settings')
app = Celery('[project]')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

[project]/settings.py

from datetime import timedelta

CELERY_TIMEZONE = 'UTC'
CELERYBEAT_SCHEDULE = {
    'schedule-30-seconds': {
        'task': 'helpers.tasks.sum_and_print',
        'schedule': timedelta(seconds=30),
        'args': (1, 2),
    }
}

helpers/__init__.py

(empty)

helpers/tasks.py

from celery import shared_task

@shared_task(time_limit=30)
def sum_and_print(a, b):
    result = a + b
    print(result)

How to execute

$ python manage.py runserver
$ exec celery -A [project] worker -B --loglevel INFO --purge

Read More

2016년 6월 12일 일요일

Shell 사칙연산 | Shell Arithmetic Operations

a=5
b=2
let c=a+b
echo $c
7
a=5
b=2
echo $(($a+$b))
echo $(($a-$b))
echo $(($a*$b))
echo $(($a/$b))
7
3
10
2