본문 바로가기

개인공부

[클라우드응용SW개발] 2. 리눅스 기반 웹 서버 구축하기

1주차에서 클라우드의 개념을 잡았다.

이제 직접 서버를 띄워야 한다.

Azure에서 VM을 하나 만들었는데 — 화면이 까맣다.

GUI가 없다. 마우스도 없다. 터미널 하나뿐이다.

클라우드 서버의 대다수는 리눅스다.

리눅스를 다루지 못하면, 클라우드에 서버를 올려놓고도 아무것도 할 수 없다.

리눅스 기반의 웹 서버를 구축해보자.


2-1. 리눅스 기반의 웹 서버 구축 (1)

Unix / Linux의 역사

**유닉스(Unix)**는 1970년대 초 미국 AT&T 벨 연구소에서 켄 톰슨, 데니스 리치 등에 의해 개발된 다중 사용자 운영체제다. 주로 연구소나 대학의 중대형 컴퓨터에서 사용됐다. C 언어로 작성되어 이식성이 높았고, 이후 수많은 운영체제의 뿌리가 됐다.

**리눅스(Linux)**는 1991년 핀란드의 리누스 토르발스(Linus Benedict Torvalds)가 PC용으로 개발한 오픈 소스 운영체제 커널이다. 유닉스의 설계 철학을 계승하면서도 누구나 자유롭게 사용하고 수정할 수 있는 오픈 소스로 공개했다는 점이 결정적 차이다.

리눅스의 특징

리눅스가 서버 운영체제의 사실상 표준이 된 데는 이유가 있다.

 

오픈 소스 — 소스 코드가 완전히 공개되어 있어 누구나 수정하고 배포할 수 있다. 커널부터 드라이버까지 필요한 부분을 직접 손볼 수 있다는 건 임베디드부터 엔터프라이즈 서버까지 유연하게 대응할 수 있다는 뜻이다.

멀티유저 및 멀티태스킹 — 여러 사용자가 동시에 시스템에 접근할 수 있고, 여러 작업을 동시에 수행할 수 있다. 서버 환경에서는 기본 중의 기본이다.

강력한 네트워크 기능 — 안정적인 네트워크 기능을 기본 제공하여 웹 서버, 데이터베이스 서버, 메일 서버 등 각종 인터넷 서비스 운영에 적합하다. TCP/IP 스택 자체가 리눅스 커널의 핵심 구성 요소다.

다양한 파일 시스템 지원 — ext2, ext3, ext4, FAT32, NTFS 등 다양한 파일 시스템을 지원하여 유연한 데이터 관리가 가능하다. 클라우드 환경에서는 주로 ext4나 XFS를 쓰게 된다.

주요 리눅스 배포판

리눅스 커널은 하나지만, 그 위에 어떤 패키지와 도구를 올리느냐에 따라 수많은 배포판이 존재한다.

 

Ubuntu — 데비안 기반으로 사용자 친화적이다. 개인 사용자부터 서버까지 폭넓게 쓰인다. Azure에서 Linux VM을 만들 때 가장 먼저 추천되는 배포판이기도 하다. 6개월마다 새 버전이 나오고, LTS 버전은 5년간 지원된다.

Red Hat Enterprise Linux (RHEL) — 기업 환경에서 가장 많이 쓰이는 상용 배포판이다. 안정성과 보안성이 높고 유료 기술 지원이 제공된다. 금융, 통신, 공공 분야에서 사실상 표준이다.

CentOS / AlmaLinux / Rocky Linux — RHEL의 소스를 기반으로 한 무료 배포판들이다. CentOS는 2021년에 CentOS Stream으로 전환되면서 기존 안정 릴리즈 모델이 변경됐고, 그 대안으로 AlmaLinux와 Rocky Linux가 등장했다. AlmaLinux는 최근 Azure의 공식 지원 배포판으로도 추가됐다.

Debian — 안정성이 높고 패키지 관리(apt)가 잘 되어 있어 서버 환경에서 꾸준히 사용된다. Ubuntu의 상위 배포판이기도 하다.

Kali Linux — 보안 테스트 및 침투 테스트용 도구가 기본 탑재된 배포판이다. 일반 서버 용도가 아니라 보안 감사용이다.

리눅스의 장단점

장점:

  • 비용 효율성 — 대부분 무료이며 라이선스 비용이 없다
  • 안정성 — 높은 안정성으로 서버 운영에 적합하다. 리눅스 서버는 수년간 리부팅 없이 운영되는 경우도 흔하다
  • 보안성 — 다중 사용자 체제로 설계되어 권한 관리가 체계적이며, 바이러스나 멀웨어 위협이 상대적으로 적다
  • 커스터마이징 — 오픈 소스이므로 커널 레벨부터 필요에 맞게 수정할 수 있다

단점:

  • 초기 학습 곡선 — CLI(명령줄 인터페이스)에 익숙하지 않으면 진입 장벽이 있다
  • 소프트웨어 호환성 — Adobe, MS Office 같은 일부 상용 소프트웨어가 리눅스를 지원하지 않거나 설치가 번거롭다
  • 하드웨어 호환성 — 특정 하드웨어에 대한 드라이버 지원이 부족할 수 있다 (클라우드 환경에서는 거의 문제 없음)

리눅스의 응용 분야

리눅스는 생각보다 훨씬 넓은 영역에서 쓰이고 있다.

 

서버 운영 — 웹 서버, 데이터베이스 서버, 파일 서버 등 서버 시장에서 압도적 점유율을 가진다. 전 세계 상위 500대 슈퍼컴퓨터는 사실상 100%가 리눅스다.

임베디드 시스템 — 안드로이드 스마트폰이 리눅스 커널 기반이다. 라우터, IoT 기기, 스마트 TV 등 임베디드 분야에서도 광범위하게 사용된다.

개인 컴퓨터 — 데스크톱 점유율은 낮지만, 개발자와 기술자들 사이에서는 개발 환경으로 인기가 높다. WSL(Windows Subsystem for Linux)의 등장으로 Windows에서도 리눅스를 편하게 쓸 수 있게 됐다.

Azure에서 리눅스 서버 설치

Azure는 Linux optimized hypervisor 위에서 다양한 리눅스 배포판을 공식 지원한다. Azure Marketplace에서 제공되는 주요 배포판:

  1. Red Hat Enterprise Linux (RHEL)
  2. Ubuntu
  3. CentOS
  4. Debian
  5. SUSE Linux Enterprise Server (SLES)
  6. Oracle Linux
  7. AlmaLinux
  8. Rocky Linux
  9. CBL-Mariner (Microsoft의 Azure Linux)

대부분의 배포판은 Azure에 최적화되어 있고, Azure Linux Agent가 사전 설치되어 있어 바로 사용 가능하다. 커스텀 Linux 이미지를 직접 업로드하는 것도 지원된다.


2-2. 리눅스 기반의 웹 서버 구축 (2)

SSH (Secure Shell)

클라우드에 띄운 리눅스 서버에 접속하려면 **SSH(Secure Shell)**를 사용해야 한다.

SSH는 1995년에 개발된 프로토콜로, 기존의 Telnet이나 rlogin이 평문으로 통신하던 것을 대체하여 모든 통신 내용을 암호화해서 전송한다. 원격 서버 관리의 사실상 유일한 표준이다.

 

SSH의 주요 특징:

  • 모든 데이터를 암호화하여 전송
  • 기본적으로 22번 포트 사용
  • 클라이언트-서버 모델로 동작
  • 대칭키, 비대칭키, 해시 알고리즘을 사용하여 인증 및 암호화 수행

접속 명령어:

# 기본 접속
ssh user@192.168.0.1

# 포트 지정
ssh -p 2222 user@example.com

# SSH 키 파일 지정
ssh -i ~/.ssh/my_key.pem user@example.com

# 상세 로그 출력 (디버깅용)
ssh -v user@example.com

Azure VM에 접속할 때는 VM 생성 시 다운로드한 SSH 키 파일(.pem)을 -i 옵션으로 지정하는 방식이 가장 일반적이다.

리눅스 디렉토리 구조

리눅스의 파일 시스템은 루트(/)를 최상위로 하는 트리 구조다.

주요 디렉토리의 역할을 알아두면 서버 운영 시 어디에 뭐가 있는지 감을 잡을 수 있다.

 

/bin 기본 실행 파일 (ls, cp, mv 등)
/sbin 시스템 관리 명령어 (fdisk, reboot 등)
/etc 시스템 설정 파일
/home 사용자 홈 디렉토리
/var 로그, 캐시 등 가변 데이터
/tmp 임시 파일
/usr 사용자 프로그램, 라이브러리
/lib 공유 라이브러리
/opt 서드파티 소프트웨어
/boot 부트로더 관련 파일

리눅스 기본 명령어

서버를 다루려면 최소한 이 정도 명령어는 손에 익어야 한다.

시스템 정보 관련:

date 날짜 및 시간 출력
hostname 호스트명 출력
uname 시스템 정보 출력 (uname -a로 전체 정보)
who 현재 로그인한 사용자 정보
passwd 패스워드 변경
clear 화면 지우기
man 명령어 매뉴얼 보기
ps 현재 프로세스 표시 (ps aux로 전체 프로세스)

파일 및 디렉토리 관련:

ls 현재 디렉토리 파일 목록 (-la 옵션으로 상세 + 숨김파일)
pwd 현재 작업 디렉토리 출력
mkdir 디렉토리 생성 (-p 옵션으로 중간 경로까지 한번에)
cd 디렉토리 이동
rmdir 빈 디렉토리 삭제
cp 파일 복사 (-r 옵션으로 디렉토리 복사)
mv 파일 이동 또는 이름 변경
rm 파일 삭제 (-rf 옵션은 신중하게)

파일 편집 관련:

명령어 설명

cat 파일 내용 출력
touch 빈 파일 생성
grep 파일 내용에서 패턴 검색
vi / vim 터미널 텍스트 편집기

vi는 터미널에서 설정 파일을 수정하거나 스크립트를 작성할 때 필수적이다. GUI 에디터가 없는 서버 환경에서는 사실상 vi(또는 nano)밖에 선택지가 없다.


2-3. 플랫폼 서비스 기반의 웹 서버 구축

Streamlit

Streamlit은 Python 개발자가 웹 애플리케이션을 빠르게 만들 수 있도록 도와주는 오픈소스 프레임워크다.

일반적으로 웹 앱을 만들려면 HTML, CSS, JavaScript, 프론트엔드 프레임워크, 백엔드 API 등 여러 기술 스택을 알아야 한다. Streamlit은 이 과정을 Python 코드 하나로 압축시킨다.

주요 특징:

  • Python 코드만으로 웹 앱 개발 가능 — HTML/CSS/JS 지식이 필요 없다
  • 코드 변경 시 실시간으로 앱이 업데이트되어 빠른 프로토타이핑이 가능하다
  • 슬라이더, 드롭다운, 체크박스, 파일 업로더 등 다양한 인터랙티브 위젯을 내장하고 있다
  • Matplotlib, Plotly, Altair 등 주요 데이터 시각화 라이브러리와 자연스럽게 통합된다

데이터 분석 결과를 빠르게 대시보드로 만들거나, AI 모델의 데모 앱을 구성할 때 특히 유용하다. Flask나 Django처럼 범용 웹 프레임워크는 아니지만, 데이터/AI 영역에서의 프로토타이핑 속도는 압도적이다.

Azure 네트워크 보안 그룹 (NSG)

Azure VM에 웹 서비스를 띄웠다고 해서 바로 외부에서 접근할 수 있는 건 아니다. **네트워크 보안 그룹(NSG, Network Security Group)**을 통해 방화벽 규칙을 설정해야 한다.

NSG는 Azure 가상 네트워크 내 리소스의 네트워크 트래픽을 제어하는 보안 도구다. 인바운드(외부→VM)와 아웃바운드(VM→외부) 트래픽을 규칙 기반으로 필터링한다.

 

NSG의 핵심 개념

  • 가상 머신, 서브넷, 네트워크 인터페이스 등에 적용 가능
  • 각 규칙은 원본(Source), 대상(Destination), 포트, 프로토콜을 지정하여 트래픽을 허용(Allow)하거나 거부(Deny)
  • 규칙은 우선순위(Priority)에 따라 평가되며, 숫자가 낮을수록 높은 우선순위

예를 들어 Streamlit 앱을 외부에 공개하려면, 인바운드 규칙에서 Streamlit의 기본 포트인 8501번을 열어줘야 한다. SSH 접속을 위한 22번 포트는 VM 생성 시 보통 자동으로 열려 있지만, 보안을 위해 소스 IP를 제한하는 것이 좋다.

 


실습 진행

지난 포스팅에서 실습 한 것 처럼, 리소스 그룹을 생성하고,  우분투 리소스 (가상머신) 만들기 까지 진행하고서 시작한다.

생성한 가상머신 IP주소 확인

 

생성된 가상머신의 IP주소를 확인하고, 터미널에서 SSH로 원격 접속해본다.

접속 명령어는 위에서 설명해놓았다.

접속 성공

리눅스 기본 세팅 국룰인 명령어 두개를 먼저 쳐준다.

리눅스 기본 세팅 국룰

 

업그레이드 명령어 이후에는 아래 화면이 뜨니까 재시작 해준다

이후 실습 영상에서는 기본적인 리눅스 명령어를 이것저것 알려주시는데,

이전 블로그 글을 보면 알다시피

이미 리눅스 기본은 어느정도 뗀 사람인지라

도움이 될만한 실습내용만 설명해보자면,

Vim 사용

편집기에서 단축키 i를 눌러 내용 수정 후, ese 및 :w(저장)q(나가기)를 입력하여 저장 후 나가기. 

(영상에서는 코드 편집을 위해 vi를 사용하는데, 개인적으로 vim이 편해서 vim 기준으로 설명하였음.)

 

cat 명령어로 파일 내용 읽기

touch 명령어로 빈 파일 생성하기

정도가 있다.

 

Streamlit 실습으로 넘어가보자.

pip부터 설치

pip가 설치가 안되어있어서 설치하고 나니

예상 못한 오류

영상에서는 없었던 오류가 나왔다.

오류 로그를 보니

이전에 비슷한 오류를 경험해 보았다.

기본 환경(가상환경이 아닌)에서

pip를 사용해서 모듈을 다운로드 받지 못하도록 막아놓은

최신 정책 때문이었다.

 

해결하기 위해서 note에 적힌 옵션 명령어를 같이 적어주었다.

해결 완

야호, 해결되었다.

이후 원격 접속을 해제 후, 다시 접속하여 명령어를 쳐보면

streamlit hello

무언가 실행된 것을 볼 수 있다.

3개의 주소 중 외부 URL을 이용하여 접속해야하는데,

배웠다시피 기본 방화벽 설정 (NSG) 때문에

Azure에서 인바운드 보안 규칙을 설정해주어야한다.

규칙 만들기
규칙 설정 및 저장
접속 성공

규칙 추가 후 접속에 성공하였다.

이제 나만의 streamlit 페이지를 만들어보자

py만들어서 띄워봤습니다.

정말 html, css, js를 쓰는것보다 훨씬 간편하게 구현이 가능했다.


정리

  • 리눅스는 리누스 토르발스가 개발한 Unix 계열 오픈소스 운영체제로, 서버부터 임베디드까지 광범위하게 쓰인다
  • Ubuntu, RHEL, AlmaLinux 등 다양한 배포판이 Azure에서 공식 지원된다
  • 리눅스 서버에 접속할 때는 SSH를 사용하며, 기본 명령어와 디렉토리 구조를 익혀야 한다
  • Streamlit을 사용하면 Python만으로 빠르게 웹 앱을 만들고 VM에 배포할 수 있다
  • VM을 외부에 공개하려면 NSG에서 인바운드 포트를 열어줘야 한다

다음 시간에는 클라우드 기반의 데이터 플랫폼을 배워보자