2012년 12월 26일 수요일

IT 기본 용어


AP 서버 (Application Server)
- 애플리케이션 서버, 동적 콘텐츠를 반환하는 서버를 말함. 예를 들면 Apache + mod_perl 이 동작하는 웹 서 
  버나 Tomcat 과 같은 애플리케이션 컨테이너다 동작하는 서버.
CND (Content Delivery Network)
- 콘텐츠로 전송하기 위한 네트워크 시스템, 전송성능향상과 가용성 향상을 목적으로 한다. Akamai 등 몇몇 상용
  서비스가 존재하며, 전 세계에 존재하는 캐시 서버 중에 클라이언트에 보다 가까운 캐시 서버를 선택해 서 전송
  함으로써 성능향상 실현하는 것이 구성상 특징임
IPVS (IP Virtual Server)
- LVS (Linux Virtual Server) 프로젝트의 성과물로, 로드밸런서에 불가결한 (부하분산) 기능을 실현함
LVS (Linux Virtual Server)
- 리눅스에서 확장성이있고 가용성이 높은 시스템을 만드는 것을 목표로 하고 있는 프로젝트, 그 성과물 중 하나로
  리눅스 로드 벨런서를 위한 IPVS 가 잇다. 본래는 프로젝트명이지만 관례적으로 LVS 를  리눅스로 만든 로드
  밸런서 라는 의미로 스기도 한다.
Netfilter
- 리눅스 커널 상에서 네트워크 패킷을 조작하기 위한 프레임 워크, 패킷 필터링 등을 수행하는 iptables 나 로드
  밸런스를 실현하기 위한 IPVS 도 Netfilter 의 기능을 이용하고 있다.

NIC (Network Interface Card)
- 본래는 네트워크 기능을 추가하기 위한 카드를 가리키는 용어지만, 확장카드 나 온보드 를 가리지 않고 네트워크
  인터페이스를 총칭해서 사용되기도 한다. LAN 카드, 네트워크 카드, 네트워크 어댑터라고도 한다.
OSI 참조 모델
- 데이터 통신을 위한 네트워크 계층을 설명한 모델, 7개 계층 으로 되어있다.
- 자주 접하는 레이어는 다음과 같다.
- 레이어 7 (애플리케이션 계층) : HTTP 나 SMTP 와 같은 통신 프로토콜
- 레이어 4 (트랜스포트 계층) : TCP 나 UDP
- 레이어 3 (네트워크 계층) : IP 나 ARP, ICMP
- 레이어 2 (데이터 링크 계층) : Ethernet 등

VIP (Virtual IP Address)
- 물리적인 서버나 NIC 가 아니라 유동적인 서비스나 역할에 할당된 IP주소를 말함. 예를 들면, 로드밸런서의 경
  우에는 클라이언트의 요청을 받아들이는 IP주소를 VIP 라고 함,
  이 IP주소는 HTTP 등의 서비스에 관련된 것이기 때문이며, 또한 다중화를 위해 Active/Backup 구성을 할
  경우에는 유일한 마스터가 되는 Active 측의 로드 밸런서가 이 IP를 인계하기 때문에다.
   가상 주소, 가상 IP 라고도 한다.
가용성 (Availability)
- 시스템을 정지시키지 않음을 뜻함. 가용성이 높다 라고 하면 해당 서비스는 거의 멈추지 않는다 라는 의미다.
  또한 문맥에 따라서는 가동률이 높다 거나 연중 가동시간이 길다 라는 의미로도 사용된다.
다중화 (Redundancy)
- 시스템의 구성요소를 여러 개 배치해서 하나가 고장 나서 정지해도 바로 교체 해서 서비스가 멈추지 않도록 하는
  것을 말하며, RAID 가 그 전형적인 예, 이중화라고도 한다.

네트워크 부트 (Network Boot)
- 네트워크를 통해 부팅에 필요한 부트로더나 커널 이미지 등을 전달받아 기동는 것, PXE는 네트워크 부트를 실현
  하기 위한 구성중 하나.

네트워크 세그먼트 (Network Segment)
- 브로드캐스트 패킷이전달되는 범위의 네트워크를 말함. "충돌 도메인"과 동일한 의미 였지만, 전 이중화 구성에
  서는 충돌이 발생하지 않으므로 "네트워크 세그먼트=충돌 도메인" 이라고 하기 어려워졌다.

단일장애점 (Single Point of Failure)
- 장애가 발생하면 시스템 전체가 정지해버리는 부분, 시스템의 급소 SPOF (Single Point Of Failure) 라고도 한
  다. 예를 들어, RAID 나 전원과 같은 서버 내의 요소를 아무리 다중화 하더라도 모든 서버가 한대의 스위칭 허브
  에 연결 되어있다면, 시스템 전체를 볼 때 그 스위치는 단일장애점 이 된다.

데몬 (Daemon)
- 백 그라운드에서 지속적으로 실행되면서 특정 작업을 수행하는 프로그램, 예를 들어 Httpd 나 Bind 등..

데이터 센터 (Data Center)
- 서버 등의 기기를 수용하기 위해 만들어진 전용시설의 명칭, 공조, 정전대책, 소화, 지진대책과 같이 24시간
  365일 서비스를 수행하기 위해 필요한 설비가 갖춰져 있다.

라운드 로빈 (Round Robin)
- 여러 개의 노드에 대해 순서대로 할당하거나 분산하는 것.
  예를 들면, 하나의 FQDN (Fully Qualified Domain Name - 전체 주소 도메인명)에 복수의 A 레코드 (IP주소)
  를 할당해서 엑세스를 분산하는 DNS 라운드 로빈 이나, 복수의 서버에 순차적으로 요청을 분산하는 로드 벨런
  서의 밸런스 알고리즘 등이 있다.

로드 밸런서 (Load Balancer)
- 클라이언트와 서버 사이에 위치해서 클라이언트의 요청을 백엔드(Backend)의 여러 서버로 적절하게 분산하는
  역할을 하는 장치, 다르게 표현하면, 여러 서버를 묶어서 하나의 고성능 가상서버에 준하는 성능을 내기 위한
  장치, 부하분산기 라고도 한다.

리소스 (Resource)
- CPU, 메모리, HDD 등 서버가 지닌 H/W 적인 자원

메모리 파일 시스템 (Memory File System)
- HDD 와 같은 영구 기억장치가 아닌 메모리상에 만든 파일 시스템, 디스크 상의 파일 시스템과 동일하게 사용할
  수 있으나, 메모리상에 있기 대문에 재부팅하면 데이터가 사라지는 반면, R.W를 고속으로 수행가능한 장점.

부하 (Load)
- 여러 종류가 있으며 크게 CPU 부하 와 I/O 부하로 나눌 수 있다. 부하를 계산하기 위한 지표는 Load Average
  등 몇가지가 있으며 부하를 계측하기 위한 명령어로는 top 나 vmstat 등 몇가지가 있다.

병목 (Bottleneck)
- 시스템 전체의 성능을 떨어뜨리는 원인이 되는 지점.

블록되다 (Blocked)
- 읽기 또는 쓰기 처리가 완료되기를 기다리기 위해 다른 처리를 할 수 없는 상태를 "I/O 대기로 블록되어 있다" 라
  고 한다. 주로 디스크 I/O 나 네트워크 I/O 에 대해 사용된느 용어지만 입출력 처리 일반에서도 사용되기도함.

서버팜 (Server Farm)
- 수 많은 서버가 모여서 구성된 인프라 시스템을 말한다. 문맥에 따라서는 데이터 센터와 같은 시설을 나타내는
  의미로 사용되기도 한다.

스위칭 허브 (Switching Hub)
- 현재 시장에 있는 거의 모든 허브는 리피터 허브가 아니라 브리지 기능을 지닌 스위칭 허브이다. L2 스위치 또는
  그냥 스위치라고도 한다.

스케일 아웃 (Scale-out)
- 서버를 여러대 두고 분산함으로써 시스템 전체의 성능을 향상시키는 것

스케일 업 (Scale-Up)
- 단일 서버의 성능을 높임으로써 시스템 전체의 성능을 향상시키는 것

스테이징 환경 (Staging Environment)
- 실 서비스에 적용하기 전에 최종적인 동작을 확인하기 위한 환경

장애극복 (FailOver)
- 다중화된 시스템에서 Active 인 노드(서버나 네트워크 기기 등) 가 정지 했을 때 자동적으로 Backup 노드로
  전환되는 것, 페일오버, 아울러, 자동이 아닌 수동으로 전환되는 것은 일반적으로 스위치 오버 라고 한다.

전송량 (Throughput)
- 네트워크 와 같이 데이터 통신 측면에서 사용할 경우, 단위시간당 데이터 전송량을 의미한다. 예를 들어 말하자
  면 (같은 자동차라도 F1 머신보다 버스가 승차가능 인원이 많으므로 "전송량"이 크다) 라고 할수 있다.

지연시간 (Latency)
- 네트워크와 같이 데이터 통신 측면에서 사용할 경우, 데이터가 도달할 떄까지의 시간을 의미한다.

콘텐츠 (Contents)
- 웹 서비스와 관련해서 사용할 경우, 브라우저와 같은 클라이언트로 반환하는 HTML 이나 이미지 데이터를 의미
  한다.

- 정적 콘텐츠 : 내용이 변화하지 않는 HTML 이나 이미지등
- 동적 콘텐츠 : 매 요청마다 내용이 다른 데이터 등
- 데이터 자체가 아니라 동적인 데이터를 출력하는 서버측 프로그램을 "동적 콘텐츠" 라고도 한다.

패킷 (Packet)
- 주로 IP에서 데이터의 최소 단위 묶음을 의미한다.

페일백 (Failback)
- Active 노드가 정지 한 후 장애극복된 상태에서 원래의 정상상태로 복귀하는 것.

프레임 (Frame)
- 주로 이더넷에서 데이터 데이터의 최소단위 묶음을 의미한다.

프로덕션 환경
- 실제 서비스를 하고 있는 환경

확장성 (Scalability)
- 이용자나 규모가 증대됨에 따라 시스템을 확장해서 대응할 수있는 능력의 정도를 나타낸다.

헬스체크 (Health Check)
- 모니터링이라고 보면된다.

2012년 12월 25일 화요일

nginx - Reverse Proxy 설명 - 1



오늘은 저의 전공에 맞게 조금 기술적인 이야기를 해볼까 합니다. 바로 Reverse Proxy 서버로 많이 사용되는 Nginx에 대해 소개하려고 하는데요, 프로그램 소개에 앞서 Reverse Proxy가 무엇인지 먼저 짚고 넘어가도록 하겠습니다.

일반적으로 웹 서비스나 모바일 백엔드(back-end) 시스템은 외부 인터넷과 연결이 되어 있고, 대부분 서버-클라이언트 모델로 동작합니다. 즉, 모바일 앱이나 웹 브라우저 등의 클라이언트에서 요청을 보내면 서버 컴퓨터에서 처리를 한 뒤 응답하는 방식이죠. Reverse Proxy는 서버 컴퓨터에서 이러한 응답을 받아서 내부 프로세스에 넘겨주는 역할을 합니다. 예를 들어 서버 컴퓨터에 Reverse Proxy 서비스에서 HTTP 요청을 받아 Django나 PHP, Node.js 등 내부 HTTP 처리 프로세스로 넘겨주도록 설정해둘 수 있습니다.

그냥 곧바로 요청을 처리하지 않고 Reverse Proxy를 거쳐서 처리하는 이유는 크게 2가지가 있습니다. 첫째로는 보안 이슈입니다. 대부분의 Reverse Proxy는 기본적인 악의적 공격들을 방어해주는 기능을 포함하고 있습니다. 둘째로, 로드 밸런싱(load balancing)이나 서비스 마이그레이션 등이 용이하다는 점입니다. 요청을 받아 특정 서비스로 전달해주는 지점이 하나밖에 없으므로, Reverse Proxy 설정만 바꾸어주면 바로 요청을 처리할 서비스가 변경됩니다. 여러 서비스(혹은 프로세스)를 띄워놓고 어떤 서비스 혹은 프로세스를 사용할지 그때그때 쉽게 설정해줄 수 있고, 버그를 수정한 버전의 서비스를 띄운 뒤 자연스럽게 이전 서비스를 죽일 수도 있습니다.

이제 Reverse Proxy들중 Apache의 mod_proxy와 더불어 가장 많이 사용되는 Nginx를 어떻게 설정하는지에 대해 살펴보겠습니다. 필자는 우분투(Ubuntu) 리눅스 배포판을 사용하므로 이에 맞추어 설명하도록 하겠습니다. 먼저 Nginx를 설치하고 실행합니다.

$ sudo apt-get install nginx
$ sudo /etc/init.d/nginx start
Nginx 프로세스가 실행된 것을 확인하고 나면 브라우저에서 해당 서버로 HTTP 요청을 보냈을 때 Welcome to Nginx 메시지를 확인할 수 있습니다. 그 다음으로 해줘야할 일은 Reverse Proxy 설정을 해주는 일입니다. Nginx의 설정 파일을 다음과 같이 생성합니다. (아래example 부분은 마음대로 변경해도 됩니다)

$ sudo touch /etc/nginx/sites-available/example.conf
$ sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.conf
$ sudo mkdir /var/log/example
$ sudo vi /etc/nginx/sites-available/example.conf
만약 내부(localhost)의 HTTP 서비스가 8000번 서버에서 돌아가고 있고, 외부 HTTP 요청을 내부 서비스로 넘겨주도록 처리하려면 /etc/nginx/sites-available/example.conf 파일을 다음과 같이 설정합니다.

server {
    listen 80;
    access_log /var/log/example/access.log;
    error_log /var/log/example/error.log;

    location / {
        proxy_pass_header Server;
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_pass http://127.0.0.1:8000;
    }
}
아마도 이 상태로 Nginx를 재시작 하게되면 /etc/nginx/sites-available/default와 HTTP 요청이 겹치면서 우리가 만든 설정이 무시될 것입니다. 따라서 default 파일을 sites-available 디렉터리 밖으로 빼서 백업을 해주면 우리의 설정을 적용할 수 있습니다.

$ sudo mv /etc/nginx/sites-available/default /etc/nginx/default.conf.backup
$ sudo /etc/init.d/nginx reload
일반 HTTP 요청 이외에도 HTTPS(보안 인증된 HTTP)나 SMTP(이메일 전송 프로토콜)과 같은 다양한 요청에 대해서도 프록시 설정이 가능합니다. 다른 프로토콜 요청에 대해서는 이 글에서는 다루지 않습니다.