Jekyll TEST

Jekyll TEST

Hello world

#include <stdio.h>
int main() {
	printf("Hello World\n");
}

jekyll

Jekyll은 static websites 생성 프레임워크이다. Ruby로 만들어진 이 것은 Markdown 파일을 _posts 디렉토리에 생성하는 것 만으로 멋진 static website를 만들어준다. Markdown을 사용하는 개발자에게 반가운 이야기일 것이다. 우리도 Markdown을 표준 document format으로 정하고 난 뒤에 Jekyll을 사용해서 Pages를 만들고 기존의 블로그를 이전하고 있다.ndex.html 파일을 git push 하는 것 만으로도 만들 수 있고, 다른 static website generator framework를 사용해도 된다. GitHub에서는 공식적인 Database를 지원하고 있지 않기 때문에 static website(HTML 파일)을 사용해야 한다.

October 19, 2015 | Comments | Tags :


Docker 기반으로 Web Application 환경 구성하기

[toc]

목적

사내 프로젝트로 개발중인 웹 어플리케이션을 개발과 스테이징 환경으로 분리하는 작업중입니다. 이 포스트는 docker를 통해 웹 서비스를 위해 필요한 구성요소인 NGINX,Node.js 및 mongoDB 환경을 구성하기 위한 절차를 정리하기 위해 작성되었습니다. 사용된 기술은 다를 수 있지만 docker를 이용하여 웹 서비스 환경을 구성하실 때 참조하시면 좋을 것 같습니다.

사용된 기술

웹 서비스 개발에 사용된 기술은 아래와 같습니다.

  • Ubuntu 14.04 - Docker Host OS
  • Docker - lightweight container virtualization
  • Docker compose - orchestration for my Docker containers
  • Docker machine
  • nginx - reverse proxy
  • mongodb - database for persistence
  • strongloop - REST API Backend App build, deploy, monitor framework
  • strong-pm - app scaleout, deploy component
  • AngularJS 1.4

Docker Host 설정

제일 먼저 docker가 실행될 Docker Machine에 OS를 설치해야 합니다. 설치할 OS는 ubuntu 14.04입니다. docker로 환경을 구성할때 가장 큰 장점은 서버는 Docker 컨테이너를 위한 Docker host 용도로 사용되기 때문에 host OS는 최소 설치하고 필요한 패키지만 설치하면됩니다. docker를 참조하여 docker를 지원하는 OS를 설치하세요. 이 포스트는 Docker host 용도로 사용된 OS는 Ubuntu 14.04입니다. 서버에 Ubuntu server를 설치합니다.

SSH 관련 보안 설정

host OS가 설치되었으면 보안을 위해 ssh의 기본 포트를 변경합니다. ++변경한 포트를 잃어버리지 않도록 기록해두세요!++

# What ports, IPs and protocols we listen for
Port 3322

root로 login 을 차단합니다.

AuthenticationLoginGraceTime 120
PermitRootLogin no
StrictMode yes

서버에 등록한 유저만 접속할 수 있도록 파일의 마지막 라인에 아래 내용을 추가하고 저장합니다

AllowUsers player

변경한 내용을 적용하기 위해 sshd 를 재기동하고, 변경한 포트가 적용되었는지 ssh로 login 해봅니다.

# sudo service ssh restart
# ssh player@192.168.100.14
ssh: connect to host 192.168.100.14 port 22: Connection refused
player@RNNPDEVTEST:~$ ssh player@192.168.100.14 -p 3322
The authenticity of host '[192.168.100.14]:3322 ([192.168.100.14]:3322)' can't be established.
ECDSA key fingerprint is 92:7a:0b:1e:5b:e7:be:cb:f8:43:12:f3:6e:1a:00:aa.
Are you sure you want to continue connecting (yes/no)?

Firewall 설정 변경

SSH 접속 포트를 변경했으니 호스트 머신의 firewall 설정을 합니다. SSH port 3322만 호스트 머신에 통과될 수 있도록 합니다. iptables 대신 좀 더 사용하기 쉬운 ufw(uncomplicated firewall)를 사용하여 방화벽 설정을 합니다.

ufw가 설치됐는지 확인합니다. 설치가 안되있다면 #sudo apt-get install ufw로 설치합니다. 기본은 아래와 같이 disable 상태입니다.

$ sudo ufw status
Status: inactive

변경한 ssh port를 열어줍니다. 그리고 기본적으로 모든 incoming 요청은 막고, outgoing 요청은 허용하도록 변경합니다.

$ sudo ufw allow 3322/tcp
$ sudo ufw deny incoming
$ sudo ufw allow outgoing

기본 방화벽 설정이 완료되었으면 ufw를 활성화 시킵니다.

$ sudo ufw enable
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
3322/tcp                   ALLOW       Anywhere
3322/tcp (v6)              ALLOW       Anywhere (v6)

Docker 설치

Docker Host 설치가 완료되었으면 이제 Host에 Docker 및 Docker compose를 설치합니다. docker 링크를 참조하여 해당하는 OS에 해당하는 설치방법에 따라 docker 및 compose를 설치합니다.

docker를 설치합니다.

$ wget -qO- https://get.docker.com/ | sh

docker가 설치되었으면 이제 여러 컨테이너들을 한번에 구성해서 설치하는데 편한 docker-compose를 설치합니다.

$ curl -L https://github.com/docker/compose/releases/download/1.4.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

$ chmod +x /usr/local/bin/docker-compose

$ docker-compose --version
docker-compose version: 1.4.2

$ docker를 사용자 그룹계정에 추가합니다.

$ sudo usermod -aG docker player

로그 아웃한 후에 docker 설치가 제대로 됐는지 확인합니다.

$ docker run hello-world
player@RNNPDEVTEST:~$ docker run hello-world

Hello from Docker.
This message shows that your installation appears to be working correctly.
...
Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

부팅시에 docker가 시작될 수 있도록 아래와 같이 설정합니다.

$ sudo update-rc.d docker defaults

마지막으로 다른 host에서 docker container에 접근할 수 있도록 docker port 2375를 방화벽에서 허용하도록 합니다. 먼저 기본 방화벽 정책을 아래와 같이 수정합니다.

$ sudo vim /etc/default/ufw

DEFAULT_FORWARD_POLICY 값을 DENY에서 ACCEPT로 변경합니다.

DEFAULT_FORWARD_POLICY="ACCEPT"

변경된 ufw 설정을 다시 적용합니다.

$ sudo ufw reload

Docker 포트 2375 요청 연결을 허용합니다.

$ sudo ufw allow 2375/tcp

Docker Architecture

웹 어플리케이션을 서비스하기 위해 필요한 전체 콤포넌트 아키텍쳐입니다. 각각의 컨테이너는 단일 목적으로 구동되는 마이크로 서비스이고, 서로 독립적이기 때문에 다른 마이크로 서비스에 영향을 주지 않습니다. 그리고 필요에 따라 인스턴스를 scale out할 수 있습니다. 서비스를 위해 필요한 전체 컨테이너 아키텍처는 다음과 같습니다.

웹 어플리케이션을 서비스하기 위해 필요한 콤포넌트는 아래와 같습니다.

nginx reverse proxy

외부에서 유입되는 요청은 80 포트를 통해서만 유입되며 reverse proxy인 nginx가 내부적으로 해당 컨테이너로 redirect 하도록 합니다.

  • www.example.com:80 => 내부적으로 8081 포트를 listen하고 있는 website로 redirect하기 위해 docker link를 추가합니다.
  • www.example.com:80/api => 내부적으로 3001 포트를 listen하고 있는 REST API 서버로 redirect 통신을 위해 docker link를 추가합니다.

nginx static website

reverse proxy와 link로 연결되었기 때문에 둘 사이에는 통신이 가능합니다. host의 /data/docker/html 디렉토리를 생성합니다. 이 위치에 실제 website의 파일들을 복사되며 container 내에서는 /var/www/html로 마운트합니다.

REST API

REST API 서버는 data persistence를 위해 mongodb와 redis와 연결되어야 합니다. 따라서 mongodb와 redis에 대한 docker link를 추가합니다.

mongoDB

mongdb는 내부적으로 REST API 서버하고만 link로 연결되어 있기 때문에 외부와 차단됩니다.

Redis

Logs

여러 컨테이너에서 생성되는 로그를

Docker machine을 이용하여 Cloud에 구성하기

October 19, 2015 | Comments | Tags : docker strongloop


what is the Post different from the Page

Blog Post와 Page의 차이점

1. 목적

Blog 시작할 때 글을 Post로 작성해야 할지 아니면 Page로 작성해야 하는지 헷갈려했던 경험이 있다. 포스트와 페이지에 대한 성질을 잘 이해하고 있어야 어떤 상황에서는 포스트와 페이지로 작성해야 하는지 알 수 있다.

2. 블로그시 알아야할 개념

2.1 페이지 vs 포스트

  • 페이지 : 사이트의 골격을 형성하는 index, Abount, 인사말 등등과 같은 시간에 관계없이 고정적인 것들은 페이지로 작성g한다.
  • 블로그 : 공지사항, 새소식과 같이 time sensitive 한 내용이나 개인이 생각날때마다 기록하고 싶은 내용은 블로그로 작성된다. 이 때 블로그는 카테고리,태그,날짜 등등으로 구분될 수 있다.

2.2 카테고리와 태그

  • 페이지는 카테고리와 태그가 없기에 분류개념이 없다.
  • 카테고리와 태깅된 포스트는 카테고리 혹은 태그별로 리스트될 수 있다.
  • 카테고리는 hierarchy 구조를 가지지만 태그는 별개이기 때문에 hierachy를 가지지 않는다.

2.3 아카이브

  • 작성자나 날짜별로 포스트를 묶어서 리스트할 수 있다

참고: The Moz Blog:http://moz.com/blog/setup-wordpress-for-seo-success

November 28, 2014 | Comments | Tags :


TLS 소개

TLS

1. 개요

인터넷에서의 정보를 암호화해서 송수신하는 프로토콜. 인터넷에서 정보를 주고 받는 두 peer 간에 보안을 확보하기 위해 첫째로, 서로 신뢰할 수 있는 peer인지 확인하기 위해 전자 서명이 포함된 인증서를 교환하고, 둘째로 제3자에 의한 도청방지를 위해 내용의 암호화가 필요하다. 넷스케이프에서 개발한 SSL에 기반한 기술로 TLS는 IETF에 의해 표준으로 인정받았다.

2. 동작

TLS Handshake

3. HTTPS

TLS/SSL은 다양한 종류의 보안 통신을 하기 위한 프로토콜이며, HTTPS는 TLS/SSL 위에 HTTP 프로토콜을 얹어 통신한다고 생각하면 된다.

November 28, 2014 | Comments | Tags : security tls ssl


SimpleWebRTC.js 와 conversat.io 소개

SimpleWebRTC.js 와 conversat.io 소개

SimpleWebRTC.js 와 conversat.io는 WebRTC project 중에 하나이다. 간단히 이 두 project 에 대한 소개를 하고자 한다. WebRTC는 video 와 audio 스트리밍에 대한 peer-to-peer 간에 연결을 가능하게 해주는 기술이다. 그러나 WebRTC는 Websocket보다도 기술적으로 훨씬 어렵다.

SimpleWebRTC.js

front-end 개발자가 쉽게 WebRTC를 가지고 개발할 수 있도록 해준다. 왜냐하면 개발을 진행하는데 있어서 signaling server 가 필요하다면 http://simplewebrtc.com Server 를 이용할 수도 있다. 필요에 따라 signalmaster 를 사용할 수 있다.

conversat.io

6명까지 video chat을 지원하는 video chat app 이다. conversat.io 역시 SimpleWebRTC.js 를 사용하여 개발되었다.

July 16, 2013 | Comments | Tags : SimpleWebRTC conversat.io