9주차
리눅스 서버 컨설팅 실제 하는 일
다양한 웹, 메일, 클라우드 등 서버 구축 설계
서버 설정/최적화, 유지보수, 지원
서버 안정화, 보안, SSL, 로드 벨런싱, CDN, RDS 구축
SUDO 권한 추가하기
# 수도 권한 지정 파일
sudo vi /etc/sudoers
vi =>
'아이디 ALL=(ALL:ALL) ALL' 추가하기

NTP 동기화 주소 변경
# ntp서버가 없는 경우 설치
sudo apt-get install ntp
# ntp설정파일 열기
sudo vi /etc/ntp.conf

# ntp 서버 재시작
sudo systemctl restart ntp
# 서버 상태 보기
ntpq -p

로컬 시간 변경
# 시간 바꾸기
timedatectl set-timezone Asia/Seoul
# 시간 보기
date

원격 서버 - 저장소 주소 변경
# 리눅스 기본 저장소 설정 파일
sudo vi /etc/apt/sources.list
# 우분투 서버를 카카오 서버로 바꾸기
vi =>
:%s /kr.archive.ubuntu.com/mirror.kakao.com
원격 접속
root 접속 활성화
# openssh 서버가 없는 경우 설치
sudo apt-get install openssh-server
# ssh 서비스 동작 확인
systemctl status ssh

sudo vi /etc/ssh/sshd_config
# 루트 접속 활성화
vi =>
'PermitRootLogin yes' 주석 해제

현재 서버 ip주소 확인하기
ifconfig

vmware 설정
1. 어뎁터 2 활성화 ( 환경설정 - 네트워크 )

2. 어뎁터 주소 확인하기 ( 도구 - 네트워크 ) => IPv4 Prefix: 192.168.56.1
무선 라우터 또는 ADSL 모뎀의 기본 주소: 192.168.56.1

3. 포트 포워딩 설정 ( 환경설정 - 네트워크 - 어뎁터1 - 포트포워딩)
ssh 전용 포트인 22번 포트로 추가

4. Putty의 Host Name에 호스트 IP를 넣어 접속

터미널 한글 설정
# 한글 추가
locale-gen ko_KR.UTF-8
# 한글 폰트 추가
sudo apt-get install fonts-nanum fonts-nanum-coding fonts-nanum-extra
# 지원 언어 확인
locale
# 입/출력 언어 바꾸기
vi /etc/default/locale
# ko_KR:ko는 한국어, en_GB:en은 영국영어
vi =>
LANG="ko_KR.UTF8"
LANGUAGE=ko_KR:ko:en_GB:en

10주차
프로세스란?
메모리에 적재되어 실행 중인 모든 프로그램
프로세스에 추가되면 고유 번호인 PID가 부여된다.
프로세스는 유저 레벨 프로세스와 커널 레벨 프로세스가 있다.
유저 레벨: Init
커널 레벨: Kthreadd, Sys_clone, _do_fork, Copy_process
Init 프로세스
Init 프로세스는 리눅스 부팅 과정 중에 처음으로 실행되는 프로세스로 '0번 프로세스' 라고도 불린다.
Init 프로세스는 PID번호 1번을 가지고 있다.
런레벨은 시스템의 작동 상태를 나타내며 실행모드에 따라 런레벨이 결정된다.
보통 런레벨 0, 1, 6이 특정 의미를 가지며, 서버는 기본 3레벨을 가지고 있다. ( OS 설치 시, 5 ▶ 3 )
Sibiling 프로세스
같은 위치에 있는 형제 프로세스
Demon 프로세스
부팅 시 자동 실행되는 프로세스
주로 서버나 백엔드 서비스를 구동하며, 네트워크 연결, 파일 시스템 관리, 로그 기록 등과 같은 백그라운드 작업을 처리한다.
Zombie 프로세스
실행 완료 이후, 반환되지 않은 프로세스로 defunct 상태라고 한다.
메모리 공간에 남아있어 리소스 낭비 초래
PS 명령어
PID 확인하는 명령어
ps 명령어의 속성
-a: 모든 사용자, 모든 프로세스
-e: 모든 프로세스 정보 출력
-u: 사용자 정보와 프로세스 시작 시간 등 출력
-x: 제어 터미널을 갖지 않는 프로세스 출력
-l: Long Format 정보 출력
-f: Full Format 정보 출력
ps 결과 컬럼 의미
UID: 사용자
PID: 내 프로세스 아이디
PPID: 부모 프로세스 아이디
TTY: 프로세스와 연결된 터미널
TIME: 총 CPU 사용시간
CMD: 프로세스의 실행 명령행

조합
# 모든 사용자와 모든 프로세스를 출력하기에 부모-자식 관계를 파악할 수 있는 명령어
ps -ef
# 상세 상태하는 명령어
# 메모리 관련 정보도 준다. ( 단위: kb )
# 상태 정보도 주는데, 대부분 S(Sleep), I(Idle) 단계이다.
ps -aux
# 사용자의 실팽 프로세스
ps -ex
# 프로세스 모니터링
ps -U [사용자 명] -u [사용자 명]
# 이름으로 프로세스 검색하기
ps -ef | grep [프로세스 이름]
# PID로 프로세스/사용자 명 검색하기
ps -p [프로세스 번호] -o comm=
ps -p [프로세스 번호] -o user
# 프로세스의 모든 pid 찾기
ps -C [프로세스 이름] -o pid
프로세스 구조 확인 명령어
- pstree
- 실행중인 프로세스(유저 프로세스)들을 트리 구조로 표시해주는 명령어
- fork() 함수를 통해 자식을 생성하고, exec와 같은 시스템 콜 함수를 사용하여 프로세스의 내용이 변경된다.
- ps -ejH
- 유저, 커널 상관없이 모든 프로세스들을 트리 구조로 표시해주는 명령어
pstree -ah | more
ps -ejH
프로세스 직접 실행하기
- 포그라운드
- 기존 명령어 사용하면 포그라운드에 실행이 된다.
- 백그라운드
- 프로세스명 &
프로세스 실행 목록 보기
jobs -l
프로세스 재시작
# 백 -> 포그라운드
fg %[번호]
# 포 -> 백그라운드
bg %[번호]
프로세스 정지
대부분 알아서 정지한다.
or
실행중인 화면에서 Ctrl + z
프로세스 종료
kill -9 [프로세스 번호]
or
실행중인 화면에서 Ctrl + c
프로세스 예약
sudo at now+1 minutes
at> 에 명령어 작성 후,
<EOT> 입력 후에,
Ctrl + d로 저장


해상도 변경
sudo vi /etc/default/grub


11주차
서버 저장 장치
서버 저장 장비 시장은 고성능, 저전력, 소형화가 주요 트렌드입니다.
PCIE 기반의 멀티 코어 스위칭을 통한 연결 방식이 사용되며, 연결 방식에 따라 DAS, NAS, SAN로 나눌 수 있습니다.
기존의 SAS, SATA 두 방식 외에, NVME(NVM Express) 방식을 새롭게 도입함으로써 병목 현상을 감소시켰고, 빠른 접근이 필요한 페이지와 리소스에 더욱 적합해 졌습니다.
NVME 1.3 버전의 SSD 저장장치가 대중화되었으며, 읽기와 쓰기 성능이 향상되고 저전력 운영이 가능합니다. 이로 인해 서버 도입이 가성비를 고려한 꾸준한 증가를 보이고 있습니다.
서버 I/O 향상을 위해 클라우드 기반 가상화 기술을 적용하고, S/W 소스 코드 최적화와 고성능 저장장치 교체(RAID(S/W)) 등의 기법이 사용됩니다.
패키지 관리
대표 명령어 종류: APT, DPKG, RPM, YUM
패키지 조회
# 전체 패키지 보기
apt list
dpkg -l
# 설치된 S/W 목록
apt --install list
# 패키지 직접 검색
apt-cache search [패키지 명]
# 패키지 세부 정보
apt-cache show [패키지 명]
# 패키지 의존성
apt-cache depends [패키지 명]
패키지 업데이트 & 업그레이드 & 설치
# 업데이트
apt-get update
# 업그레이드 ( 전체, 특정 )
apt-get upgrade
apt-get upgrade [패키지 명]
# 설치
sudo apt-get install [패키지 명]
패키지 삭제 & 정리
# 소프트웨어 삭제하기 ( 패키지만, 추가 설정파일, 전부 )
sudo apt-get remove [패키지 명]
sudo apt-get remove purge [패키지 명]
sudo apt-get autoremove
# 소프트웨어 정리하기 ( 모두, 최신만 남김 )
sudo apt-get clean
sudo apt-get autoclean
하드디스크
하드 디스크 관련 정보 확인
# 현재 마운트 된 파일 시스템의 용량과 사용 현황 보기
df -h
# 시스템에 연결된 하드디스크, SSD, USB 드라이브 등의 정보
lsblk
# 시스템에 연결된 디스크의 파티션 테이블 정보
fdisk -l
# 현재 시스템에 마운트된 파일 시스템의 정보 ( 트리형태 )
findmnt
디스크 별 역할과 의미
udev: dev 장치 관리
tmpfs: 임시 파일 시스템
/dev/loop 번호: 가상 장치
/dev/sda ~ /dev/sdz: 실제 저장 장치
RAID 기법
디스크의 유연한 사용을 위한 저장방법이다.
종류
0번: 디스크 수만큼 빨라짐, 랜덤 접근 (속도 빠름)
1번: 디스크 중복 기록, 속도는 유지, 디스크 최소 2개 이상 (안정성)
5번: 패리티 정보 디스크 사용 (웹서비스)
디스크 추가
1. 물리 저장 장치 추가 ( 설정 - 저장소 - 컨트롤러 )
2. Fdisk로 디스크 추가
fdisk /dev/sda
# m: 전체 명령어 확인
# l: 단축키 확인
# n: 파티션 추가
>> p: Primary (0 ~ 3)
>> e: Extended (5 이상)
# p: 추가된 디스크 파티션 확인
# t: 종류 변경
>> fd: raid 타입으로 변경
# w: 저장하기
3. mkfs 파티션 포맷 - UUID 생성됨
# Ext4 파일 시스템으로 파티션 포맷
mkfs.ext4 /dev/sda1
4 - 1. mount를 통해 파일 시스템을 특정 디렉토리로 연결
mount /dev/sda1 /new_disk
4 - 2. 부팅 시, 자동 로딩 설정
1. UUID 확인
# uuid만 표시
ls /dev/disk/by-uuid
# ext4로 포맷한 디스크의 이름과 연결된 uuid
blkid
2. 등록
vi /etc/fstab
vi =>
/dev/disk/by-uuid/[uuid 번호] /[연결할 폴더] ext4 defaults 0 1
5. RAID 설정 시, 그룹 생성하기
# 레이드 그룹 생성 (sdb1과 sdb2의 그룹)
sudo mdadm --create /dev/md/raid0 --level=0 --raid-devices=2 dev/sdb1 dev/sdb2
# 레이드 그룹 정보 확인
sudo mdadm --detail --scan
# 레이드 마운트
mount /dev/md/raid0 /new_raid0
12주차
자원관리 개요
운영체제가 하는 일
메모리관리(공유, 보호, 확장, 최적화)
계층 순서
CPU ▶ 메인 메모리 ▶ 저장장치
계층 구조의 효율성
캐시 영역의 빠른 메모리 재사용
최종 CPU 접근 시간 감소
주소의 종류
논리/가상주소: 컴파일러나 링커에 의해 지정된 주소로, 상대적인 주소
물리 주소: 하드웨어에 고정된 주소(일반적으로 0부터 시작)
MMU(Memory Management Unit)
CPU에 내장된 장치로, 논리/가상 주소와 물리주소 사이의 변환을 수행한다.
메모리 변환의 문제점 및 해결방법
문제점1. 다수의 프로세스가 쌓이다 보면 메모리에 빈 공간이 발생한다.
해결방법1. 메모리 공간을 작은 단위로 분할하여 할당하는 페이징 기법 사용
문제점2. 페이징 기법은 랜덤 분포 및 순서를 보장하지 못함
해결방법2. CPU가 MMU를 통해 페이지 테이블을 참조, 성능 향상을 위해 캐시 메모리인 TLB 사용
메모리의 종류
공유 메모리: 여러 프로세스가 자주 사용하는라이브러리 등을 공유
가상 메모리: 실제 메모리 공간이 부족한 경우에 사용하며, 디스크의 SWAP 공간을 활용하여 메모리를 확장
서버 기능 저하 요인
복합적, 예를들어 CPU의 부하나 메모리 SWAP 활성화는 CPU 사용률에 큰 하락을 초래
네트워크의 트래픽 과부하는 서버 접속, 프로그램 지연, 과금 등에 영향을 줄 수 있음
자원 모니터링
CPU 자원 확인
# 21:03:21 up 9:45, 1 user, load average: 0.02, 0.08, 0.09
# 현재 시간, 시스템 부팅 시간, 동시 접속자 수, 1분 5분 15분 동안의 시스템 부하 평균
uptime
# 21:07:31 CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
# 21:07:31 all 0.11 0.03 0.08 0.03 0.00 0.02 0.00 0.00 0.00 99.73
# CPU 사용률은 100 - %idle
mpstat
메모리 자원 확인
# CPU, 메모리 등 자원 관리 상태 출력
# r: 실행중인 프로세스의 개수
# swpd: Swap된 메모리의 양
# free: 사용 가능한 메모리의 양
# -s: 으로 상세 메모리 출력
vmstat -s
# 간략한 메모리 사용량 출력
free
실시간 자원 확인
# -b: 전체 상태
# -u: 특정 사용자 상태
top
I/O 자원 확인
# 각 장치의 읽기, 쓰기 속도와 비율을 출력
# CPU 부하 평균치도 함께 보여준다.
iostat
자원 제한하기
# 서비스 및 프로세스의 각 계층 관계 출력
systemd-cgls
# CPU 제한을 백그라운드로 실행
CPULIMIT -l 10 -p [프로세스 번호] &
# CPU제한 10프로, 메모리 제한 500메가, 700메가 이상부터는 자동 프로세스 KILL
systemctl --runtime set-property session-1.scope CPUQuota=10% MemoryHigh=500M MemoryMax=700M
QUOTA 사용해서 제한하기
# 디스크 사용량을 제한
# defaults 뒤에 , usrquota, grpquota 추가
sudo vi /etc/fstab
vi =>
/dev/disk/by-uuid/[uuid 번호] /[연결할 폴더] ext4 defaults, usrquota, grpquota 0 1
cd [연결할 폴더]로 이동
# 설정 파일 생성
quotacheck -augvfm
# 사용자 쿼터 설정
sudo edquota -u root
# 쿼터 활성화 off는 비활성화
sudo quotaon -aug
# 활성화된 쿼터 설정 확인
requota [연결할 폴더]
스래싱(Thrashing)
메모리 사용 및 접근 시에 발생하는 현상으로, 메모리 페이지의 부재(page fault)가 과도하게 발생하고 페이지 교체 작업이 지나치게 많이 수행되는 상태
모니터링
스래싱을 감지하기 위해 top, vmstat 등의 모니터링 도구를 사용
작업 부하가 증가하고 swap 인/아웃이 높아지는지 확인 (높을 경우 스레싱 확률 ▲)
해결 및 예방
다중 프로그래밍 정도(DOM) 줄이기
하드 디스크 대신 빠른 SSD 사용
메모리 늘리기
14주차
웹 서버 S/W 시장 현황
웹 서버 종류
Apache, Nginx, IIS
웹 호스팅 종류
미국: AWS, Godday, google
국내: cafe24, 한비로, 블루웹, 닷홈
클라우드 플랫폼
AWS, MS, 구글
CMS(Content Management System)
워드 프레스, Wix 등
APACHE2 + PHP7 + MYSQL
# 설치
apt-get install php7.4 php7.4-curl php7.4-gd php7.4-json php7.4-mbstring php7.4-xml
libapache2-mod-php7.4 php7.4-mysql apache2 apache2-bin apache2-data apache2-utils
mysql-server phpmyadmin
# apache2 설정
sudo service apache2 start/stop/restart
# mysql 설정
sudo service mysql start/stop/restart
# 서비스 상태 확인
service --status-all