본문 바로가기
BE 📙/주니어백엔드개발자가반드시알아야할실무지식

[CH09] 최소한 알고 있어야 할 서버 지식

by 경아ㅏ 2025. 6. 19.

 

개발자와 서버

 

  • 가상화 장비, 물리장비 / 장비에 설치된 OS / OS 에서 구동하는 프로그램 등을 모두 [서버]라고 부를 수 있지만, 해당 챕터에서 말하는 서버는 애플리케이션 프로그램을 구동하는 OS를 지칭
  • VirtualBox, Vagrant 등을 사용하면 OS를 간단하게 설치하고 설정 가능


 

OS 계정과 권한

 

리눅스에서의 계정과 권한 관리

 

root 계정: 모든 권한을 가진 관리자 계정

보통 인프라 담당만 root 계정 접근 권한을 갖고 나머지 개발자는 별도의 사용자 계정 이용하여 서버에 연결

 

파일 시스템과 권한

ls -l 명령어로 파일 정보를 확인해보자

 

 

 

  • -rw-r--r-- : 파일 권한
  • user: 소유자
  • staff: 소유 그룹


파일 권한에서 첫번째 세글자는 소유자의 권한, 두번째 세글자는 소유그룹의 권한, 마지막 세글자는 다른 사용자에 대한 권한을 표시

 

  • r: 읽기 권한 (숫자로 4)
  • w: 쓰기 권한 (숫자로 2)
  • x: 실행 권한 (숫자로 1)

위의 hello.txt 에서 

 

  • 소유자의 권한: rw (읽기, 쓰기)
  • 그룹의 권한: r(읽기)
  • 다른 계정의 권한: r(읽기)

 

chmod 명령어를 통해 권한 변경이 가능

chmod 754 run.sh

 

 

개별 항목(u, g, o, a)에 특정 권한(rwx) 변경도 가능

 

  • u(사용자), g(그룹), o(다른 사용자), a(모두)
  • +(추가), -(삭제), =(지정)
  • r, w, x

chmod u+x run.sh // 사용자 권한에 x(실행 권한) 추가
chomd o=rx run.sh // 다른 사용자 권한을 rx(읽기 + 실행 권한)으로 지정

 

 

sudo로 권한 주기

systemd 같은 데몬 프로그램은 대부분 root 권한이 있어야만 실행 가능 (ex. 리눅스에서 systemctl start docker)

일반 계정으로 접속한 경우 명령어 앞에 sudo를 붙여 root 권한을 가져와 실행해야 함

 


sudo에 대하여 굉장히 흥미로웠던 것은...

sudo로 root 권한을 가져와서 명령을 실행할 수 있다... 는 설정은 /etc/sudoers 파일에 정의되어있다...!
macOs 기준으로 /etc/sudoers 를 열어보면(visudo)

 

 

%admin ALL = (ALL) ALL 

 

  • admin 그룹 사용자는 sudo를 붙이면 모든 명령어[(ALL) 권한 = root 권한]으로 실행할 수 있게 하겠다는 의미
  • 나의 user 계정은 admin 그룹에 속하기 때문에 sudo 를 붙여서 명령어를 실행하면 모든 명령어를 root 권한으로 실행 가능한 것

 

특정 그룹, 사용자에 대하여 특정 명령어에 대한 sudo 기능을 디테일하게 설정하고 싶을 때 /etc/sudoers 파일에 다음과 같이 추가도 가능

 

user1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl start docker // 리눅스 기준
// user1은 비밀번호를 입력하지 않고도 /usr/bin/systemctl start docker 명령어를 root 권한으로 실행 가능

 

 

프로세스 확인하기

 

프로세스 및 id 확인

 

  • ps aux
  • ps -eaf

 

프로세스 종료

 

  • kill -15 (-s SIGTERM or -TERM): 임시 생성 파일 삭제나 스프링 빈 삭제 등 프로세스 종료에 필요한 작업까지 수행
  • kill -9 (-s SIGKILL or -KILL): 프로세스만 강제 종료
  • 처음에는 -15로 프로세스를 죽여보고, 반복적으로 실행해도 종료가 안되면 -9를 사용하자

 

백그라운드 프로세스

포그라운드 프로세스: 터미널과 연결된 프로세스, 사용자와는 키보드로 상호작용하며 터미널이 종료되면 해당 프로세스도 종료
ex. tail, top, vi

 

백그라운드 프로세스: 터미널 종료와 관계없이 항상 실행되는 프로세스, 키보드나 스크린을 통해 사용자와 상호작용 할 수 없음
ex. API 요청을 받는 웹서버

실행 명령어에 nohup + & 를 붙이면 터미널이 종료되더라도 실행되는 백그라운드 프로세스로 실행 가능
nohup: 터미널 연결이 끊기더라도 HUP 시그널을 전송하지 않음

nohup java -Dserver.port=9090 -jar server.jar > server.log 2?&1 &



디스크 용량 관리

 

다음과 같은 파일들이 디스크 용량을 많이 차지할 때 삭제가 필요

 

  • 로그 파일
  • 임시 저장 파일

 

디스크 용량 확인 명령어

 

  • df -h: 디스크의 파티션 별 사용량 확인
  • du -sh ./* : 하위 디렉토리 및 파일의 용량 확인
  • du -sh */: 하위 디렉토리의 용량 확인

 

  • 오래된 로그를 삭제하거나 로그 파일을 압축하여 추가 공간 확보
  • 한 디렉토리에 저장되는 로그 파일 개수가 무수히 증가하면 어느 순간부터 해당 디렉토리 탐색 속도가 느려지므로 files/2025/07/31과 같이 하위디렉토리를 나누어 저장하자
  • 로그 로테이션을 지정하지 않아서 로그 파일이 계속 커졌고, 서비스가 돌아가는 와중에 해당 파일을 삭제해야 한다?
    rm -rf 로 삭제하면: 파일이 inode 로 참조되고 있기 때문에 삭제된 것처럼 보이지만 디스크 용량은 줄어들지 않음
    cp /dev/null out.log 등의 명령어로 해당 파일의 내용을 지움으로써 디스크 용량을 줄여야 함


시간 맞추기

 

서버 운영시에는 서버 간 시간 동기화가 필요
chrony, ntp 와 같은 서비스를 이용하여 주기적으로 서버 시간 동기화

 

 

크론으로 스케줄링 하기

 

크론

 

  • 리눅스를 포함한 유닉스 계열의 시간 기반 스케줄러
  • crontab에 정의된 스케줄에 맞춰 작업을 수행
  • crontab - l : 크론탭 확인
  • crontab -e: 크론탭  편집

 

크론탭 문법

* * * * * : 분, 시, 일, 월, 요일

 

ex. 0 0 * * * : 매일 0시 0분에
ex. 30 1 1 * * : 매월 1일 1시 30분에
ex. 0 1,2,3 * * *: 매일 1시, 2시, 3시에

ex. 30 1-3 * * *: 매일 1시에서 3시까지 30분에 (1시 30분, 2시 30분, 3시 30분)
ex. */10 1 * * *: 매일 1시의 0분부터 21시 50분까지 10분 간격으로 실행


alias 등록하기

 

현재 터미널 세션에서만 등록하기

alias cdweb='cd /var/www/html'

 

 

셸에 접속할 때 자동으로 alias 적용하기

.bashrc 파일에 정의하기
.bash_profile 파일에는 .bashrc를 실행하는 코드가 포함되어있어 .bashrc에 적용해놓으면 자동으로 로그인 시점에도 적용

#.bashrc
#Source global definitions

...
# alias
alias cdweb='cd /var/www/html'

 

 

 

댓글