호스팅, SSH, FTP, 배포

IDC의 서버를 임대하는 방법에 대해 알아봅니다. 또 원격 서버에 SSH와 FTP 및 RSYNC, SCP 등 여러 프로토콜로 연결해 필요한 작업을 수행해봅니다.
IDC, 호스팅, SSH, FTP, RSYNC, SCP, Deployment, 배포


호스팅 (Hosting)

지금까지 서버 프로그램을 로컬 머신에서 개발하고 실행했습니다. 하지만 실제로 로컬의 서버 프로그램과 클라이언트 사이에 네트워킹이 이루어지려면, 서버 프로세스가 공인 아이피를 갖는 호스트에서 실행되어야 합니다. 이를 위해서 기업용 공인아이피를 구매하고, 원할한 트래픽을 위해서 네트워크 인프라를 구축 할 수 있습니다.

IDCIDC

하지만 아무래도 부대비용이 만만치 않기 때문에 주택을 임대해주듯 IDC(Internet Data Center)의 서버를 임대해주는 호스팅(Hosting) 서비스가 존재합니다. 호스팅의 몇가지 형태에 대해서 알아보겠습니다.

방식설명제한용도
코로케이션IDC에 자사의 머신을 입주시키고 관리를 맡김기업에서 운영중인 네트워크 인프라의 관리를 아웃소싱 할 때
서버 호스팅IDC에 위치한 물리적 서버를 단독으로 임대서버의 root 계정을 갖음자원이 많이 필요하거나, 최고 관리자 권한이 필요한 경우
클라우드 호스팅IDC의 가상화된 서버 자원을 단독으로 임대서버의 root 계정을 갖음서버의 물리적 자원 및 OS 등을 손쉽게 조정 가능
탄력적인 자원이 필요하며, 최고 관리자 권한이 필요한 경우
웹 호스팅IDC에 위치한 물리적 서버를 여러 임차인이 공유일반 유저 계정을 갖으며, 보조기억장치, 메모리, 포트 등 자원을 제한 받음소규모 웹 서비스(블로그, 쇼핑몰, 단순 홈페이지 등)를 운영 할 경우

AWS 클라우드 서비스의 IDCAWS 클라우드 서비스의 IDC

용도에 따라서 적절한 임대 방식을 선택 할 수 있겠습니다. 이때 고려 할 점은 서비스의 규모, 최고 관리자 권한이 필요한지, 또는 주요 고객의 위치(IDC가 국내인지 해외인지), 또 서버 자원을 탄력적으로 조절 할 필요가 있는지 등의 요소가 있겠습니다. 검색 엔진에서 서버/클라우드/웹 호스팅 또는 server/cloud/web hosting으로 검색해보면 국내외 수 많은 호스팅 업체들을 확인 할 수 있습니다.

실제 서버를 임대하는 과정은 생략합니다. 검색 엔진을 통해 적절한 업체를 선택하신 후, 학습용으로 저사양의 가상 서버(클라우드)를 임대하시길 추천드립니다. (물리적 서버 호스팅은 보통 비용이 높습니다) 아래에서는 여러분들이 서버 호스팅이나 클라우드 호스팅을 통해 단독 서버(Unix 계열 OS)를 임대하여 최고관리자 권한을 획득한 상태로 가정하고 내용을 진행합니다.

원격 제어

우리가 임대한 서버에서 어떤 작업을 하고 싶을 때마다 원격 서버가 존재하는 IDC까지 직접 이동해서 작업을 하긴 힘듭니다. 서버를 호스팅 받고 나면 일반적으로 서버 아이피, root 패스워드 또는 SSH 개인키/공개키(나중에 다룹니다)가 주어집니다. 이 정보를 이용해서 원격으로 서버를 제어하는 방법에 대해 알아보겠습니다.

GUI 원격 제어

Windows Remote DesktopWindows Remote Desktop

먼저 원격 데스크톱 프로토콜(RDP; Remote Desktop Protocol)을 통해 서버를 GUI로 제어 할 수 있습니다. RDP는 MS사에서 개발한 프로토콜로, Windows에는 원격 데스크탑 프로그램(서버 및 클라이언트)을 포함되어 있습니다.

Windows 서버는 PowerShell이라는 프로토콜을 통해 CLI로 원격 제어를 할 수도 있습니다.

하지만 Unix 계열 OS는 기본적으로 RDP 프로그램를 포함하지 않습니다. 물론 RDP와 유사한 많은 오픈 프로토콜들이 개발되어 Unix 계열 서버를 GUI를 통해 원격 제어하는 것도 불가능하지는 않습니다.

CLI 원격 제어

PUTTYPUTTY

반면에 Unix 계열 OS는 SSH(Secure Shell) 프로토콜을 통해 서버를 CLI로 제어 할 수 있습니다. SSH는 서버와 클라이언트간의 인증 및 패킷 암호화를 위한 프로토콜 또는 그 프로그램을 일컫으며, 쉽게는 SSH는 안전한 원격 셸이라고 생각해도 좋겠습니다. Unix 계열 OS는 기본적으로 SSH 프로그램(서버 및 클라이언트)을 포함하고 있습니다.

OSSSH 서버SSH 클라이언트
Unix 계열sshd (SSH Daemon)ssh
Windows( cygwin 을 통해 에뮬레이트; openssh )Putty

SSH는 Unix 계열 서버의 원격 제어를 위한 프로토콜이지만, Windows용 클라이언트 또한 여러 종류 개발되어 있습니다. Putty 같은 프로그램을 설치해도 좋고, Git Bash에서 바로 ssh나 sshd를 실행 할 수 있습니다.

SSH (Secure Shell)

sshd는 기본적으로 22번 포트를 사용하며, 대부분의 Unix 계열 OS는 sshd를 부팅시 자동으로 실행합니다. 호스팅한 서버에서도 22번 포트에서 sshd 프로세스가 실행 중에 있겠습니다. sshd의 설정을 변경하고 재시작하는 등의 내용은 다루지 않습니다.

원격 서버에 로그인원격 서버에 로그인

SSH는 연결시 원격 서버와 인증 과정을 거치게 됩니다.

로그인

dehypnosis-mac:~ dehypnosis$ ssh benzen.io

접속시 유저명을 생략하면 현재 로컬 셸의 로그인한 유저 이름으로 로그인을 요청합니다. 즉 benzen.io 서버의 dehypnosis로 로그인합니다.

유저 이름을 명시하여 로그인

이메일 주소의 형식으로 @ 앞에 유저를 명시 할 수 있습니다. benzen.io 서버의 kim 계정으로 접속합니다. 이렇게 서버에 로그인 할 때 입력 할 비밀번호는 서버에 해당 계정에 설정된 비밀번호와 동일합니다.

dehypnosis-mac:~ dehypnosis$ ssh kim@benzen.io

패스워드 기반 인증

dehypnosis-mac:~ dehypnosis$ ssh kim@benzen.io
dehypnosis-mac:~ dehypnosis$ kim@benzen.io's password:
dehypnosis-mac:~ dehypnosis$ Permission denied, please try again. # 잘못 입력한 경우
dehypnosis-mac:~ dehypnosis$ kim@benzen.io's password:
Last login: Wed Jun 14 15:02:05 2017 from 121.xx.xx.xx # 로그인 성공

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
[kim@ip-172-xx-xx-xx ~]$ ls
benzen.io
[kim@ip-172-xx-xx-xx ~]$ pwd
/home/kim
[kim@ip-172-xx-xx-xx ~]$ exit
logout
Connection to benzen.io closed.

인증에 성공한 경우 ssh는 원격 서버에서 bash 같은 CLI 셸(엄밀히 말하면 ssh는 원격 통신을 중개할 뿐 셸이 아닙니다)을 실행합니다. 이제 로컬 셸에서처럼 원격 서버를 제어 할 수 있습니다. 서버 작업 후 원격 셸을 종료하려면 exit를 이용합니다.

비대칭키 기반 인증

dehypnosis-mac:~ dehypnosis$ ssh kim@benzen.io
Permission denied (publickey).

원격 서버 측 sshd의 설정에 따라서, 위와 같이 로그인이 실패 할 수 있습니다.

SSH Key 방식 인증SSH Key 방식 인증

서버측 sshd가 비대칭키 기반 인증을 요구하는 경우에는 개인키가 로그인 과정에 필요할 수 있습니다. 그리고 개인키와 쌍을 이루는 공개키가 원격 서버의 kim 유저의 특정 파일(/home/kim/.ssh/authorized_keys)에 등록되어 있어야 합니다. 공개키, 개인키에 얽힌 내용이 상당히 많기 때문에 이는 이후 비대칭키 암호화, 공개키/개인키, 전자서명 등 암호화에 다루면서 다시 언급하도록 하겠습니다.

ssh kim@benzen.io -i 개인키 파일 경로를 통해서 비대칭키 기반 인증을 수행하면 되겠습니다.

dehypnosis-mac:keys dehypnosis$ ssh kim@benzen.io -i ~/works/keys/benzen.io.pem
Last login: Wed Jun 14 15:15:43 2017 from 121.xxx.xxx.xxx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
[kim@ip-172-xxx-xxx-xxx ~]$

SSH는 엄밀히 셸이 아닙니다. 원격 서버에서 실행되는 셸은 실제로 bash, csh 등의 셸 프로그램입니다. SSH는 원격 서버와 암호화 채널을 생성한 후, 원격 프로그램을 실행(기본적으로 bash 등의 셸)하거나, 패킷을 다른 포트로 포워딩하는 용도로 응용될 수 있습니다. 터널링 등 추가적인 응용에 대해서는 이후에 더 다룹니다.

CLI 텍스트 편집기

이제 SSH를 이용해서 원격 서버를 로컬 셸에서처럼 제어 할 수 있습니다. 그런데 실제 웹 서비스 개발의 프로세스를 생각해보면, CLI 셸이 다루기에 편하지만은 않습니다. 가장 먼저 원격으로 소스코드를 작성한다고 생각해보면 어떨까요?

VIMVIM

지금까지 언급한적은 없지만 vim, emacs, nano 등의 CLI 텍스트 편집기(Unix 계열)들이 있습니다. 이를 이용하면 원격 셸에서 텍스트 파일을 바로 작성 할 수 있지만, 아무래도 복사, 붙혀넣기, 커서 이동 등 대부분의 작업을 키보드로 조작해야 하니 사용법이 상당히 복잡합니다.

CLI 텍스트 에디터 러닝커브CLI 텍스트 에디터 러닝커브

CLI 텍스트 에디터에 대해서는 더 이상 다루지 않습니다. CLI에 충분히 익숙해 지신 후에 하나를 선택해서 천천히 익히시는 편을 추천드립니다. 하지만 당장은 아니더라도 원격 서버를 다루기 위해서는 분명히 배우실 필요가 있습니다.

나무위키의 vi 문서에서 vim에 대한 현실적인 소개 및 입문을 위한 매뉴얼을 볼 수 있습니다.

원격 서버의 프로그램 동기화

서버에서 직접 파일을 편집 할 땐 CLI 텍스트 편집기를 이용하면 됩니다. 아래에서는 로컬에서 원격 서버로, 원격 서버에서 로컬로 파일을 전송하는 방법을 알아보겠습니다.

SCP

SCP(Secure Copy)cp 프로그램에서 나아가서 ssh 프로그램을 응용해 로컬과 원격 서버 사이에서 파일을 복사하는 기능을 제공하는 프로그램입니다. scp 프로그램은 내부적으로 ssh 프로그램을 이용하기에 인증 방식은 SSH와 동일하며, 전송되는 데이터 역시 암호화됩니다.

로컬 파일을 원격 서버에 복사 (업로드)

touch x y

# scp [복사하고 싶은 파일들] [원격 계정]@[원격 호스트 주소]:[원격 호스트에 복사될 경로]
dehypnosis-mac:~ dehypnosis$ scp x y kim@benzen.io:~/
kim@benzen.io.com's password:
x                                              100%    0     0.0KB/s   00:00
y                                              100%    0     0.0KB/s   00:00

# 복사 경로에 ~(원격 계정의 홈 폴더)를 쓸 수도, 절대경로로 명시 할 수도 있습니다.
dehypnosis-mac:~ dehypnosis$ scp x y kim@benzen.io:/some/where
kim@benzen.io.com's password:
scp: /some/where: No such file or directory

# -r 옵션으로 폴더를 복사 할 수 있습니다.
dehypnosis-mac:~ dehypnosis$ scp -r test kim@benzen.io:~/
kim@benzen.io.com's password:
.DS_Store                                      100% 6148   972.6KB/s   00:00
any.h                                          100% 4724   846.2KB/s   00:00
any.pb.h                                       100% 10KB   1.6MB/s     00:00
any.proto                                      100% 5236   651.1KB/s   00:00
...

원격 서버의 파일을 로컬에 복사 (다운로드)

dehypnosis-mac:~ dehypnosis$ scp kim@benzen.io:~/.bash_profile hello
kim@benzen.io.com's password:
.bash_profile                                  100%  213    53.5KB/s   00:00
dehypnosis-mac:~ dehypnosis$ ls
hello         ...

RSYNC

RSYNC(Remote Sync)는 로컬과 원격 파일을 동기화하는데 사용됩니다. scp와 마찬가지로 rsync 역시 기본적으로 ssh를 통해 통신하기 때문에 SSH 인증을 필요로합니다. rsync는 동기화가 목적이기 때문에 효율적으로 변경된 파일만 복사합니다. 이 때문에 rsync는 백업이나, 미러링 등의 용도로 자주 쓰입니다.

원격 서버를 로컬과 동기화 (업로드)

dehypnosis-mac:~ dehypnosis$ rsync -r ~/play kim@benzen.io:~/
kim@benzen.io.com's password:
building file list ... done
play/
play/.DS_Store
play/a
play/b
play/ccccc
play/e
play/f
play/g
play/f2/
play/f2/d
play/f3/
play/pp/
play/pp/c.txt
play/pp2/
play/pp2/c.txt
play/pp2/xxxxx

sent 6954 bytes  received 292 bytes  14492.00 bytes/sec
total size is 6148  speedup is 0.85

# rsync는 변경 사항이 있는 파일만 복사합니다.
dehypnosis-mac:~ dehypnosis$ touch play/abcd
dehypnosis-mac:~ dehypnosis$ rsync -r ~/play kim@benzen.io:~/
kim@benzen.io.com's password:
building file list ... done
play/
play/abcd

sent 380 bytes  received 48 bytes  285.33 bytes/sec
total size is 6148  speedup is 14.36

로컬을 원격 서버와 동기화 (다운로드)

dehypnosis-mac:~ dehypnosis$ rsync -r kim@benzen.io:~/some-folder .
receiving file list ... done
kim/
kim/.bash_history
kim/.bash_logout
kim/.bash_profile
kim/.bashrc
...

FTP

FTP (File Transfer Protocol)는 Unix 계열 OS 뿐만 아니라 Windows 서버에서도 활발하게 쓰이는 파일 전송 프로토콜입니다. 프로토콜의 구체적인 내용과 원격 서버에서 FTP 서버 프로세스를 구축하는 방법은 생략하고, FTP 클라이언트에 대해서만 소개합니다.

ForkLift FTP Client (macOS 용)ForkLift FTP Client (macOS 용)

FTP 클라이언트 프로그램들은 일반적으로 위와 같은 GUI를 제공합니다. 양쪽에 로컬과 원격의 디렉토리 및 파일들이 표시되고, 마우스를 이용해서 서로 간에 파일을 복사하거나 파일을 삭제, 수정 하는 등의 작업을 수행 할 수 있습니다. GUI를 이용해서 손쉽게 파일 작업을 할 수 있는 장점이 있습니다.

SFTP 비대칭키 방식 인증으로 접속SFTP 비대칭키 방식 인증으로 접속

FTP 서버 프로세스는 기본적으로 21번 포트를 쓰는데, FTP 프로토콜은 암호화를 수행하지 않기 때문에 파일 정보 뿐만 아니라, 유저의 계정 정보까지 노출 될 수가 있습니다.

따라서 서버는 보안을 향상시키기 위해서 SSH 프로토콜과 결합된 SFTP (22번 포트), 또는 SSL/TLS(뒤에서 다룸)에서 작동하는 FTPS (21번 포트) 프로토콜을 이용 할 수도 있습니다.

클라이언트 측에서는 서버에서 제공하는 프로토콜에 맞추어 접속하면 되겠습니다.

몇가지 FTP 클라이언트

이름지원 OS
탐색기Windows
FileZillaWindows (서버 프로그램도 제공), Linux, macOS
SmartFTPWindows
ForkLiftmacOS (유료)

Git

이전 챕터에서 다뤘던 Git을 통해서 파일을 동기화 할 수도 있습니다. 소프트웨어의 최신 소스코드가 Github 같은 원격 Git 저장소에 저장되어 있다면, git 클라이언트로 간단하게 소스코드를 최신 버전으로 동기화 할 수 있겠습니다.

최초로 원격 서버에 소스코드 저장소를 복제하기 위해서는 ssh로 원격 서버에 접속한 후 git clone을 이용하면 되겠습니다.

git clone
dehypnosis-mac:~ dehypnosis$ ssh kim@benzen.io
dehypnosis-mac:~ dehypnosis$ kim@benzen.io's password:
Last login: Wed Jun 14 19:59:30 2017 from 121.xx.xx.xx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
[kim@ip-172-xx-xx-xx ~]$ ls
benzen.io
[kim@ip-172-xx-xx-xx ~]$ git clone https://github.com/dehypnosis/workshop2.git
'workshop2'에 복제합니다...
remote: Counting objects: 6228, done.
remote: Compressing objects: 100% (99/99), done.
오브젝트를 받는 중:  13% (832/6228), 38.73 MiB | 3.57 MiB/s
...

[kim@ip-172-xx-xx-xx ~]$ ls
benzen.io  workshop2

이후에는 ssh로 원격 서버에 접속한 후 git pull로 최신 소스코드로 동기화 할 수 있겠습니다.

git pull
dehypnosis-mac:~ dehypnosis$ ssh kim@benzen.io
dehypnosis-mac:~ dehypnosis$ kim@benzen.io's password:
Last login: Wed Jun 14 19:46:08 2017 from 121.xx.xx.xx

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2017.03-release-notes/
[kim@ip-172-xx-xx-xx ~]$ cd benzen.io/workshop2/
[kim@ip-172-xx-xx-xx workshop2]$ git pull origin master
Username for 'https://github.com': dehypnosis
Password for 'https://dehypnosis@github.com':
remote: Counting objects: 29, done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 29 (delta 11), reused 29 (delta 11), pack-reused 0
오브젝트 묶음 푸는 중: 100% (29/29), 완료.
https://github.com/dehypnosis/workshop2 URL에서
 * branch            master     -> FETCH_HEAD
   4aae423..64caffc  master     -> origin/master
업데이트 중 4aae423..64caffc
Fast-forward
 sessions/630/web-farm.gif                                            | Bin 0 -> 9878 bytes
 sessions/650/ext1_sshsessionforwarding.jpg                           | Bin 0 -> 30431 bytes
...

배포 (Deployment)

배포배포

서버 프로그램(웹 서버 등)의 배포(Deployment)는 일반적으로 위에서 소개한 방식처럼, 원격 서버에 소스코드를 동기화하고, 재컴파일 한 후에 프로그램을 재실행하는 방법으로 이루어집니다. 물론 플랫폼에 따라서 그 절차는 상이합니다. 예를 들어 Node.js의 경우에는 코드를 동기화하고 바로 node 프로그램만 재실행하면 되겠습니다.

물론 이러한 번거로운 과정들을 자동화하려는 시도가 존재하며, 이를 배포 자동화(Continuous Deployment)라고 합니다. 간단히는 셸 스크립트(Shell Script)를 작성 할 수도 있고, 또는 별도의 소프트웨어나 시스템을 이용 할 수도 있습니다.

쉘 스크립트(shell script)는 쉘이나 명령 줄 인터프리터에서 돌아가도록 작성되었거나 한 운영 체제를 위해 쓰인 스크립트이다. 쉘 스크립트가 수행하는 일반 기능으로는 파일 이용, 프로그램 실행, 문자열 출력 등이 있다… (위키백과)

웹서버 클러스터웹서버 클러스터

서버 프로세스가 단일 호스트에서만 작동하지 않고, 트래픽을 분산하기 위해서 게임, 웹 등의 대형 서비스처럼 복수의 호스트에서 동일한 프로세스를 실행시키는 경우에는 배포 자동화가 필수겠습니다.

목차
6. 개발과 배포
7. 다른 플랫폼으로
저자

김동욱

개발 경력 약 10년, 전문 분야는 웹 및 각종 응용 소프트웨어 플랫폼입니다. Codeflow를 운영하고 있습니다.

2018년 04월 10일 업데이트

지원되지 않는 웹 브라우저거나 예기치 않은 오류가 발생했습니다.