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를 활성화하는 전체 과정을 다룬다.