Ubuntu 서버 초기 설정 ③ — 타임존, 자동 보안 업데이트, 스왑

Ubuntu 서버 초기 설정 ③ — 타임존, 자동 보안 업데이트, 스왑

시간이 틀리면 로그가 무의미해지고, 업데이트를 안 하면 보안 패치가 적용되지 않는다. 서버의 기초 체력을 다지자.

1~2편에서 SSH 키 인증, 방화벽, fail2ban까지 보안의 외벽을 세웠다. 이번 편에서는 서버의 내부 기초 체력을 완성한다. 타임존, 시간 동기화, 자동 업데이트, 스왑 — 하나라도 빠지면 나중에 꼭 문제가 생기는 것들이다.

Ubuntu 타임존 변경 방법

대부분의 VPS는 UTC(협정 세계시)로 초기 설정되어 있다. 한국 시간(KST)으로 변경하자.

현재 타임존 확인

timedatectl
               Local time: Mon 2026-05-26 06:00:00 UTC
           Universal time: Mon 2026-05-26 06:00:00 UTC
                 RTC time: Mon 2026-05-26 06:00:00
                Time zone: Etc/UTC (UTC, +0000)

타임존 변경

sudo timedatectl set-timezone Asia/Seoul

변경 확인

timedatectl
               Local time: Mon 2026-05-26 15:00:00 KST
           Universal time: Mon 2026-05-26 06:00:00 UTC
                 RTC time: Mon 2026-05-26 06:00:00
                Time zone: Asia/Seoul (KST, +0900)

Time zone: Asia/Seoul (KST, +0900)이 보이면 성공이다. ✅

💡 타임존이 중요한 이유: - cron 스케줄러0 3 * * *이 UTC 기준이면 한국 시간 정오에 실행됨 - 로그 분석 — 장애 발생 시각이 UTC로 찍혀 있으면 한국 시간으로 변환해야 함 - SSL 인증서 — 시간이 크게 어긋나면 HTTPS 인증서 검증이 실패할 수 있음


NTP 시간 동기화 설정

서버의 시계는 시간이 지나면 서서히 어긋난다(drift). NTP(Network Time Protocol)로 인터넷 시간 서버와 주기적으로 동기화해야 한다.

Ubuntu 24.04는 기본적으로 systemd-timesyncd가 설치되어 있다.

동기화 상태 확인

timedatectl show-timesync --all

또는 간단하게:

timedatectl

출력에서 NTP service: active가 보이면 이미 동기화 중이다.

동기화가 비활성화되어 있는 경우

sudo timedatectl set-ntp on

더 정확한 동기화가 필요한 경우 — chrony

금융, 로그 분석 등 밀리초 단위 정확성이 필요하다면 chrony를 설치한다.

sudo apt install chrony -y
sudo systemctl enable chrony
sudo systemctl start chrony

# 동기화 상태 확인
chronyc tracking

일반적인 웹 서버라면 기본 systemd-timesyncd로 충분하다.


호스트명 변경

호스팅 업체가 자동 생성한 호스트명(localhost, vps-12345 등)을 서버 용도에 맞게 바꾸면 관리가 편해진다.

# 호스트명 변경
sudo hostnamectl set-hostname web-prod-01

# /etc/hosts에도 반영
sudo nano /etc/hosts

/etc/hosts 파일에 아래 줄을 추가하거나 수정한다.

127.0.1.1   web-prod-01

변경 확인:

hostnamectl
 Static hostname: web-prod-01
       Icon name: computer-vm
         Chassis: vm 🖥️
      Machine ID: xxxxxxxx
         Boot ID: xxxxxxxx
  Operating System: Ubuntu 24.04 LTS
            Kernel: Linux 6.8.0-xx-generic
      Architecture: x86-64

로케일을 UTF-8로 설정

한글이나 이모지가 깨지지 않으려면 로케일이 UTF-8로 설정되어 있어야 한다.

현재 로케일 확인

locale

LANG=en_US.UTF-8 또는 LANG=C.UTF-8이면 대부분 문제없다.

한국어 로케일을 추가하려면

sudo locale-gen ko_KR.UTF-8
sudo update-locale LANG=en_US.UTF-8

💡 팁: 서버의 기본 로케일은 en_US.UTF-8을 유지하는 것을 권장한다. 한국어로 바꾸면 일부 CLI 도구의 오류 메시지가 한국어로 나와서 검색할 때 불편할 수 있다.


unattended-upgrades로 자동 보안 업데이트

보안 패치가 나와도 사람이 직접 apt upgrade를 실행하기 전까지는 적용되지 않는다. unattended-upgrades는 보안 업데이트를 자동으로 설치해주는 도구다.

설치

sudo apt install unattended-upgrades apt-listchanges -y

자동 업데이트 활성화

sudo dpkg-reconfigure -plow unattended-upgrades

Yes를 선택하면 자동 업데이트가 활성화된다.

세부 설정

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

주요 설정 항목:

// 보안 업데이트만 자동 설치 (기본값, 권장)
Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}-security";
};

// 사용하지 않는 의존성 자동 제거
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// 커널 업데이트 후 자동 재부팅 (새벽 4시)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";

자동 업데이트 주기 설정

sudo nano /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
설정 의미
Update-Package-Lists 1 매일 패키지 목록 갱신
Unattended-Upgrade 1 매일 자동 업그레이드 실행
Download-Upgradeable-Packages 1 업그레이드 패키지 미리 다운로드
AutocleanInterval 7 7일마다 오래된 캐시 정리

동작 확인

# 시뮬레이션 (실제 설치 없이 테스트)
sudo unattended-upgrade --dry-run --debug

오류 없이 완료되면 정상이다. 로그는 /var/log/unattended-upgrades/에서 확인할 수 있다.


스왑 파일 생성과 swappiness 설정

저사양 VPS(RAM 1~2GB)에서는 메모리가 부족해 프로세스가 갑자기 죽는 OOM(Out of Memory) Kill이 발생할 수 있다. 스왑 파일은 디스크의 일부를 임시 메모리로 사용하는 비상용 안전망이다.

스왑 존재 여부 확인

sudo swapon --show

아무것도 출력되지 않으면 스왑이 없는 것이다.

스왑 파일 생성

# 2GB 스왑 파일 생성
sudo fallocate -l 2G /swapfile

# 권한 설정 (root만 읽기/쓰기)
sudo chmod 600 /swapfile

# 스왑 영역으로 포맷
sudo mkswap /swapfile

# 스왑 활성화
sudo swapon /swapfile

확인

sudo swapon --show
NAME      TYPE  SIZE USED PRIO
/swapfile file    2G   0B   -2

재부팅 후에도 유지 (영구 등록)

echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

swappiness 설정

swappiness는 커널이 얼마나 적극적으로 스왑을 사용할지를 결정하는 값이다 (0~100).

동작 적합한 환경
60 (기본값) RAM이 40% 남아 있어도 스왑 사용 시작 HDD 기반 데스크탑
10 RAM이 거의 다 찬 경우에만 스왑 사용 SSD 기반 서버 (권장)
0 가능한 한 스왑 사용 안 함 대용량 RAM 서버
# 현재 값 확인
cat /proc/sys/vm/swappiness

# SSD 서버에 적합한 값으로 변경
sudo sysctl vm.swappiness=10

# 재부팅 후에도 유지
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf

💡 스왑 크기 가이드: - RAM 1GB → 스왑 2GB - RAM 2GB → 스왑 2~4GB - RAM 4GB 이상 → 스왑 2GB면 충분 (비상용이므로)


서버에 설치할 기본 패키지 목록

마지막으로, 서버 운영에 자주 쓰이는 기본 도구들을 한 번에 설치한다.

sudo apt install -y \
  curl \
  wget \
  git \
  htop \
  tmux \
  net-tools \
  unzip \
  jq \
  ncdu
패키지 용도
curl / wget HTTP 요청, 파일 다운로드
git 버전 관리, 코드 배포
htop 시스템 리소스 모니터링 (top의 상위 호환)
tmux 터미널 멀티플렉서 (SSH 끊겨도 작업 유지)
net-tools ifconfig, netstat 등 네트워크 도구
unzip 압축 해제
jq JSON 처리 CLI 도구
ncdu 디스크 사용량 시각적 분석

📝 정리

  • [x] 타임존timedatectl set-timezone Asia/Seoul로 한국 시간 설정
  • [x] NTP 동기화systemd-timesyncd 활성화로 시간 자동 동기화
  • [x] 호스트명hostnamectl set-hostname으로 식별 가능한 이름 설정
  • [x] 로케일 — UTF-8 확인 및 설정
  • [x] 자동 보안 업데이트unattended-upgrades로 보안 패치 자동 적용
  • [x] 스왑 파일 — 2GB 스왑 생성, swappiness 10으로 SSD 최적화
  • [x] 기본 패키지 — curl, git, htop, tmux 등 필수 도구 설치

다음 편 예고

4편: Nginx 설치와 Let's Encrypt HTTPS

서버가 안전하고 기본기가 갖춰졌다. 이제 세상과 연결하자. Nginx를 설치하고 도메인을 연결한 뒤, Certbot으로 Let's Encrypt SSL 인증서를 발급받아 HTTPS를 활성화하는 전체 과정을 다룬다.