안녕하세요, 성장하는 개발자 여러분!
“개발만 하면 되는 거 아니야?”라고 생각했던 시절이 있었습니다. 하지만 실무에 발을 들이면서 깨달은 것은, 훌륭한 개발자가 되기 위해서는 내가 만든 코드가 실제로 어떤 환경에서 돌아가는지 이해하는 것이 필수라는 사실이었습니다.
대부분의 서버는 리눅스 환경에서 동작합니다. 서버에 배포할 때, 로그를 확인할 때, 성능 이슈를 해결할 때… 모든 순간에 리눅스 지식이 필요하죠. 오늘은 제가 실무에서 겪은 시행착오를 바탕으로, 실제로 써먹을 수 있는 리눅스 운영 노하우를 정리해 드리겠습니다.
1. 사용자 및 권한 관리: 서버 보안의 첫걸음
왜 사용자 관리가 중요한가?
서버에는 여러 개발자가 접근하고, 각각 다른 권한이 필요합니다. 신입 개발자에게 root 권한을 주는 것은 위험하고, 반대로 필요한 권한이 없으면 작업을 할 수 없죠.
실전 사용자 관리
# 새로운 사용자 생성
sudo useradd -m -s /bin/bash newdev
# -m: 홈 디렉토리 생성
# -s: 기본 쉘 설정
# 비밀번호 설정
sudo passwd newdev
# 사용자를 특정 그룹에 추가 (예: docker 그룹)
sudo usermod -aG docker newdev
# 사용자 정보 확인
id newdev
sudo 권한 설정
# visudo 명령으로 안전하게 sudoers 파일 편집
sudo visudo
# 특정 사용자에게 sudo 권한 부여
newdev ALL=(ALL) NOPASSWD: /usr/bin/systemctl, /usr/bin/docker
실무 팁: NOPASSWD를 사용할 때는 특정 명령어만 지정하세요. 모든 명령어에 적용하면 보안상 위험합니다.
2. 패키지 관리: 소프트웨어 설치와 업데이트
YUM으로 패키지 관리하기
# 패키지 검색
yum search nginx
# 패키지 정보 확인
yum info nginx
# 패키지 설치
sudo yum install -y nginx
# 설치된 패키지 목록
yum list installed
# 업데이트 가능한 패키지 확인
yum list updates
# 시스템 전체 업데이트
sudo yum update
실무에서 자주 사용하는 패키지들
# 개발 필수 도구들
sudo yum groupinstall -y "Development Tools"
sudo yum install -y git vim htop curl wget
# Node.js 설치 (NodeSource repository 사용)
curl -sL https://rpm.nodesource.com/setup_18.x | sudo bash -
sudo yum install -y nodejs
# Docker 설치
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
3. 로그 관리: 문제 해결의 핵심
로그 파일 위치 이해하기
# 시스템 전반적인 로그
/var/log/messages
# 보안 관련 로그 (ssh 접속, sudo 사용 등)
/var/log/secure
# 웹 서버 로그 (Apache/Nginx)
/var/log/httpd/ # Apache
/var/log/nginx/ # Nginx
# 애플리케이션별 로그
/var/log/[application_name]/
실시간 로그 모니터링
# 실시간 로그 확인 (가장 많이 사용!)
tail -f /var/log/messages
# 특정 패턴 검색하며 실시간 확인
tail -f /var/log/secure | grep "Failed password"
# 여러 로그 파일 동시 모니터링
multitail /var/log/messages /var/log/secure
journalctl로 systemd 로그 확인
# 전체 시스템 로그 확인
journalctl
# 특정 서비스 로그만 확인
journalctl -u nginx
# 실시간 로그 확인
journalctl -f
# 오늘 발생한 에러만 확인
journalctl --since today --priority err
# 특정 시간 범위의 로그
journalctl --since "2025-01-01 00:00:00" --until "2025-01-01 23:59:59"
실무 팁: 로그 확인은 문제 해결의 80%입니다. 에러가 발생하면 무조건 로그부터 확인하세요!
4. 원격 접속 및 보안: SSH 마스터하기
SSH 키 기반 인증 설정
# 1. 클라이언트에서 키 생성
ssh-keygen -t rsa -b 4096 -C "your.email@company.com"
# 2. 공개키를 서버에 복사
ssh-copy-id user@server-ip
# 3. 이제 비밀번호 없이 접속 가능
ssh user@server-ip
SSH 설정 최적화
# /etc/ssh/sshd_config 편집
sudo vim /etc/ssh/sshd_config
# 보안 강화 설정
Port 2222 # 기본 포트 변경
PermitRootLogin no # root 직접 로그인 금지
PasswordAuthentication no # 키 기반 인증만 허용
MaxAuthTries 3 # 인증 시도 횟수 제한
# 설정 적용
sudo systemctl restart sshd
원격 파일 전송
# scp로 파일 전송
scp localfile.txt user@server:/home/user/
scp -r local_directory/ user@server:/home/user/
# rsync로 동기화 (더 효율적!)
rsync -avz --progress local_directory/ user@server:/home/user/remote_directory/
5. 방화벽 관리: 서버 보안 강화
firewalld 기본 사용법
# 방화벽 상태 확인
sudo firewall-cmd --state
# 현재 설정 확인
sudo firewall-cmd --list-all
# HTTP/HTTPS 허용
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
# 특정 포트 허용
sudo firewall-cmd --permanent --add-port=3000/tcp
# 특정 IP만 SSH 접근 허용
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="ssh" accept'
# 설정 적용
sudo firewall-cmd --reload
실무 보안 설정 예시
# 개발 서버 기본 설정
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-port=3000/tcp # Node.js 개발 서버
sudo firewall-cmd --permanent --add-port=8080/tcp # 톰캣 등
# 데이터베이스는 특정 서버에서만 접근
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.1.0/24" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
6. 시스템 모니터링: 성능 문제 미리 발견하기
실시간 시스템 상태 확인
# CPU, 메모리, 프로세스 확인
htop
# 디스크 사용량 확인
df -h
# 실시간 디스크 I/O 모니터링
iotop
# 네트워크 연결 상태
netstat -tulpn
ss -tulpn # 더 빠른 대안
# 현재 로그인 사용자
who
w
성능 문제 진단
# CPU 사용률이 높은 프로세스 찾기
ps aux --sort=-%cpu | head -10
# 메모리 사용률이 높은 프로세스
ps aux --sort=-%mem | head -10
# 특정 프로세스의 자세한 정보
ps -f -p 프로세스ID
# 시스템 리소스 사용량 히스토리
sar -u 1 10 # CPU 사용률을 1초마다 10번 측정
7. 자동화와 스케줄링: 반복 작업 효율화
cron을 이용한 작업 스케줄링
# crontab 편집
crontab -e
# 예시: 매일 새벽 2시에 로그 정리
0 2 * * * /usr/local/bin/cleanup_logs.sh
# 예시: 매 5분마다 애플리케이션 상태 확인
*/5 * * * * /usr/local/bin/health_check.sh
# 등록된 cron 작업 확인
crontab -l
시스템 백업 스크립트 예시
#!/bin/bash
# /usr/local/bin/backup_db.sh
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/backup/database"
DB_NAME="production_db"
# 데이터베이스 백업
mysqldump -u backup_user -p$DB_PASSWORD $DB_NAME > $BACKUP_DIR/db_backup_$DATE.sql
# 7일 이상 된 백업 파일 삭제
find $BACKUP_DIR -name "db_backup_*.sql" -mtime +7 -delete
echo "Backup completed: $DATE" >> /var/log/backup.log
마치며: 리눅스 운영의 핵심은 ‘경험’
리눅스 서버 운영은 이론보다는 실전 경험이 중요합니다. 오늘 소개한 내용들을 하나씩 직접 테스트해보세요. VM이나 클라우드 인스턴스에서 연습하다 보면, 어느새 리눅스가 친숙해져 있을 겁니다.
실무에서 기억해야 할 황금률들:
- 로그는 모든 문제 해결의 시작점입니다
- 백업 없이는 그 어떤 작업도 하지 마세요
- 보안은 편의성과 항상 트레이드오프 관계입니다
- 자동화할 수 있는 건 최대한 자동화하세요
- 문제가 생기면 당황하지 말고 차근차근 로그를 확인하세요
서버 운영 능력은 하루아침에 늘지 않지만, 꾸준히 쌓아가다 보면 분명 더 나은 개발자로 성장할 수 있을 것입니다. 여러분의 리눅스 여정을 응원합니다! 🚀
답글 남기기