diff --git a/app/Http/Controllers/AcademyController.php b/app/Http/Controllers/AcademyController.php index c020b6d6..e10a1355 100644 --- a/app/Http/Controllers/AcademyController.php +++ b/app/Http/Controllers/AcademyController.php @@ -97,4 +97,13 @@ public function nginxEncyclopedia(Request $request): View|Response return view('academy.nginx-encyclopedia'); } + + public function linuxCommands(Request $request): View|Response + { + if ($request->header('HX-Request')) { + return response('', 200)->header('HX-Redirect', route('academy.linux-commands')); + } + + return view('academy.linux-commands'); + } } diff --git a/resources/views/academy/linux-commands.blade.php b/resources/views/academy/linux-commands.blade.php new file mode 100644 index 00000000..c6912439 --- /dev/null +++ b/resources/views/academy/linux-commands.blade.php @@ -0,0 +1,869 @@ +@extends('layouts.app') + +@section('title', '리눅스 & 서버 명령어') + +@push('styles') + +@endpush + +@section('content') +
+ + {{-- ============================================================ --}} + {{-- 히어로 배너 --}} + {{-- ============================================================ --}} +
+
+
+
+ 아카데미 + + 리눅스 & 서버 명령어 +
+

리눅스 & 서버 명령어

+

서버 운영에 필요한 기본 명령어부터 권한 관리까지 — 초보자를 위한 실전 가이드

+
+
+
+ 🐧 +
+
+
+
+ +
+ {{-- ============================================================ --}} + {{-- 좌측 고정 목차 (TOC) --}} + {{-- ============================================================ --}} + + + {{-- ============================================================ --}} + {{-- 우측 콘텐츠 --}} + {{-- ============================================================ --}} +
+ + {{-- 모바일 목차 --}} + + + {{-- ============================================================ --}} + {{-- 1. 터미널 기초 --}} + {{-- ============================================================ --}} +
+
+

+ 1 + 터미널 기초 +

+ +
+

+ + 터미널이란? + ?터미널(Terminal)은 컴퓨터에게 텍스트로 명령을 내리는 창이다. 마우스 클릭 대신 키보드로 모든 작업을 수행할 수 있다. +

+
+

비유: 카카오톡 대화처럼

+

+ 카카오톡에서 친구에게 메시지를 보내면 답장이 오듯, 터미널에서 명령어를 입력하면 + 컴퓨터가 결과를 보여준다. GUI(그래픽 화면)에서 마우스로 폴더를 더블클릭하는 것을, + 터미널에서는 cd 폴더이름이라고 타이핑하는 것이다. +

+
+
+ +
+

+ + 프롬프트 읽는 법 +

+
pro@sam-server:~$
+
+
+ pro + 현재 로그인한 사용자 이름 +
+
+ sam-server + 접속 중인 서버(호스트) 이름 +
+
+ ~ + 현재 위치. ~는 홈 디렉토리 (/home/pro) +
+
+ $ + 일반 사용자. #이면 관리자(root) 권한 +
+
+
+
+
+ + {{-- ============================================================ --}} + {{-- 2. 파일 탐색 --}} + {{-- ============================================================ --}} +
+
+

+ 2 + 파일 탐색 — "내가 지금 어디에 있고, 뭐가 있지?" +

+ +
+

+ + pwd / cd — 현재 위치 확인 & 이동 +

+
# 현재 위치 확인 +$ pwd +/home/webservice/mng + +# 폴더 이동 +$ cd /home/webservice/api # 절대 경로로 이동 +$ cd storage/logs # 상대 경로로 이동 +$ cd .. # 한 단계 위(부모 폴더)로 +$ cd ~ # 홈 디렉토리로 +$ cd - # 직전 디렉토리로 되돌아가기
+
+ 팁: 폴더 이름을 몇 글자 치고 Tab 키를 누르면 자동 완성된다! +
+
+ +
+

+ + ls / ll — 파일 목록 보기 + ?llls -la의 별칭(alias)이다. 대부분의 서버에서 기본 설정되어 있다. +

+
# 기본 목록 +$ ls # 파일/폴더 이름만 +$ ls -l # 상세 정보 (권한, 크기, 날짜) +$ ls -la # 숨김 파일(.env 등)까지 포함 +$ ls -lh # 사람이 읽기 쉬운 크기 (KB, MB) +$ ll # ls -la 와 동일 (단축 명령)
+

ls -l 출력 읽는 법:

+
-rw-r--r-- 1 pro pro 4.2K Jan 15 10:30 .env +drwxr-xr-x 5 pro pro 4.0K Jan 15 10:30 storage +│ │ │ │ │ │ └─ 파일/폴더 이름 +│ │ │ │ │ └─ 수정 날짜 +│ │ │ │ └─ 파일 크기 +│ │ │ └─ 소유 그룹 +│ │ └─ 소유자 +│ └─ 링크 수 +└─ 권한 (d=폴더, -=파일 / r읽기 w쓰기 x실행)
+
+
+
+ + {{-- ============================================================ --}} + {{-- 3. 파일 조작 --}} + {{-- ============================================================ --}} +
+
+

+ 3 + 파일 조작 — "읽고, 복사하고, 이동하고, 삭제하기" +

+ +
+

+ + cat / head / tail — 파일 내용 보기 +

+
# 파일 전체 내용 출력 +$ cat .env + +# 파일 처음 20줄만 +$ head -n 20 storage/logs/laravel.log + +# 파일 마지막 50줄만 +$ tail -n 50 storage/logs/laravel.log + +# 실시간 로그 모니터링 (새 내용이 추가되면 자동 표시) +$ tail -f storage/logs/laravel.log # Ctrl+C로 종료
+
+ 실무 팁: 서버 에러가 발생하면 tail -f storage/logs/laravel.log로 실시간 로그를 확인한다. +
+
+ +
+

+ + cp / mv / rm — 복사 / 이동 / 삭제 +

+
# 파일 복사 +$ cp .env .env.backup # .env를 .env.backup으로 복사 +$ cp -r storage/ storage_backup/ # 폴더 전체 복사 (-r 필수) + +# 파일/폴더 이동 (이름 변경에도 사용) +$ mv old_name.txt new_name.txt # 이름 변경 +$ mv file.txt /home/pro/backup/ # 다른 폴더로 이동 + +# 파일 삭제 (⚠️ 휴지통 없음! 바로 삭제됨) +$ rm file.txt # 파일 삭제 +$ rm -r folder/ # 폴더 삭제 (하위 포함)
+
+ 주의: 리눅스에는 휴지통이 없다. rm으로 삭제하면 복구 불가. 중요한 파일은 삭제 전 cp로 백업하자. +
+
+ +
+

+ + mkdir / touch — 폴더 & 파일 생성 +

+
# 폴더 생성 +$ mkdir backup # 폴더 생성 +$ mkdir -p backup/2026/01 # 중간 폴더까지 한번에 생성 + +# 빈 파일 생성 +$ touch memo.txt # 빈 파일 생성
+
+
+
+ + {{-- ============================================================ --}} + {{-- 4. 권한 관리 --}} + {{-- ============================================================ --}} +
+
+

+ 4 + 권한 관리 — "누가 읽고, 쓰고, 실행할 수 있나?" +

+ +
+

+ 리눅스 파일에는 3종류의 사용자 × 3종류의 권한이 있다. +

+
+
+

사용자 구분

+
    +
  • u — 소유자 (Owner)
  • +
  • g — 그룹 (Group)
  • +
  • o — 기타 (Others)
  • +
+
+
+

권한 종류

+
    +
  • r (4) — 읽기 (Read)
  • +
  • w (2) — 쓰기 (Write)
  • +
  • x (1) — 실행 (Execute)
  • +
+
+
+
+ +
+

+ + chmod — 권한 변경 + ?chmod = CHange MODe. 숫자 3자리로 소유자/그룹/기타의 권한을 한번에 설정한다. 예: 755 = rwxr-xr-x +

+
# 숫자 방식 (가장 많이 사용) +$ chmod 755 deploy.sh # rwxr-xr-x (소유자: 모두, 나머지: 읽기+실행) +$ chmod 644 .env # rw-r--r-- (소유자: 읽기+쓰기, 나머지: 읽기만) +$ chmod 600 .env # rw------- (소유자만 읽기+쓰기, 나머지: 접근 불가) +$ chmod -R 775 storage/ # 폴더 하위 전체에 적용 (-R = Recursive) + +# 문자 방식 +$ chmod +x script.sh # 실행 권한 추가 +$ chmod u+w file.txt # 소유자에게 쓰기 권한 추가
+ +

자주 쓰는 권한 조합:

+
+ + + + + + + + + + + + + + + +
숫자문자의미대상
755rwxr-xr-x실행 가능 스크립트deploy.sh, artisan
644rw-r--r--일반 파일*.php, *.html
600rw-------비밀 파일.env, SSH 키
775rwxrwxr-x공유 폴더storage/, logs/
+
+
+ +
+

+ + chown — 소유자 변경 + ?chown = CHange OWNer. 파일의 주인을 바꾼다. 웹 서버가 파일에 접근하려면 올바른 소유자 설정이 중요하다. +

+
# 소유자 변경 +$ chown pro:pro file.txt # 소유자와 그룹을 pro로 +$ chown -R www-data:www-data storage/ # 웹서버가 접근하도록 + +# SAM 서버에서 자주 사용하는 패턴 +$ chown -R pro:pro /home/webservice/mng
+
+
+
+ + {{-- ============================================================ --}} + {{-- 5. 검색 & 필터 --}} + {{-- ============================================================ --}} +
+
+

+ 5 + 검색 & 필터 — "원하는 것을 찾아내기" +

+ +
+

+ + grep — 텍스트 검색 + ?grep = Global Regular Expression Print. 파일 안에서 특정 텍스트를 찾아 그 줄을 출력한다. +

+
# 파일에서 특정 문자열 검색 +$ grep "DB_HOST" .env # .env에서 DB_HOST 찾기 + +# 폴더 전체에서 검색 (-r = 재귀, -n = 줄번호) +$ grep -rn "Exception" storage/logs/ # 로그에서 Exception 검색 + +# 대소문자 무시 (-i) +$ grep -i "error" laravel.log # error, Error, ERROR 모두 검색 + +# 해당 문자열이 없는 줄 찾기 (-v) +$ grep -v "#" .env # 주석 제외하고 보기
+
+ +
+

+ + find — 파일 찾기 +

+
# 파일명으로 찾기 +$ find . -name "*.log" # 현재 폴더에서 .log 파일 찾기 +$ find /home -name ".env" # /home 아래 모든 .env 찾기 + +# 크기 기준 (100MB 이상 파일) +$ find / -size +100M # 디스크 용량 잡아먹는 파일 추적 + +# 최근 7일 내 수정된 파일 +$ find . -mtime -7 # 최근 1주일 내 변경된 파일
+
+ +
+

+ + 파이프 ( | ) — 명령어 연결하기 + ?파이프(|)는 앞 명령의 출력을 뒤 명령의 입력으로 넘긴다. 여러 명령을 조합해서 강력한 작업을 수행할 수 있다. +

+
# 프로세스 중에서 nginx 찾기 +$ ps aux | grep "nginx" + +# 파일 목록을 줄 수 세기 +$ ls -la | wc -l # 현재 폴더의 파일 개수 + +# 로그에서 에러만 뽑아서 최근 10개만 +$ grep "ERROR" laravel.log | tail -n 10
+
+
+
+ + {{-- ============================================================ --}} + {{-- 6. 시스템 모니터링 --}} + {{-- ============================================================ --}} +
+
+

+ 6 + 시스템 모니터링 — "서버 상태 확인하기" +

+ +
+

+ + top / htop — CPU & 메모리 사용량 +

+
# 실시간 프로세스 모니터 (기본 내장) +$ top # q 키로 종료 + +# 더 보기 쉬운 모니터 (설치 필요할 수 있음) +$ htop # 컬러풀한 UI, F10 또는 q로 종료
+
+ 확인 포인트: CPU가 100%에 가까우면 서버가 바쁜 것, 메모리(MEM)가 90% 이상이면 메모리 부족 위험. +
+
+ +
+

+ + df / free — 디스크 & 메모리 확인 +

+
# 디스크 용량 확인 (-h = 사람이 읽기 쉬운 형태) +$ df -h +Filesystem Size Used Avail Use% Mounted on +/dev/sda1 50G 32G 16G 67% / + +# 메모리 사용량 확인 +$ free -h + total used free shared buff/cache available +Mem: 3.8Gi 2.1Gi 0.3Gi 45Mi 1.4Gi 1.4Gi + +# 특정 폴더 용량 확인 +$ du -sh storage/logs/ # 로그 폴더 크기 확인 +$ du -sh * # 현재 폴더의 각 항목 크기
+
+
+
+ + {{-- ============================================================ --}} + {{-- 7. 프로세스 & 서비스 --}} + {{-- ============================================================ --}} +
+
+

+ 7 + 프로세스 & 서비스 — "실행 중인 프로그램 관리" +

+ +
+

+ + ps / kill — 프로세스 확인 & 종료 +

+
# 모든 프로세스 보기 +$ ps aux # 전체 프로세스 목록 +$ ps aux | grep "php" # PHP 관련 프로세스만 +$ ps aux | grep "nginx" # Nginx 프로세스 확인 + +# 프로세스 종료 (PID = 프로세스 번호) +$ kill 1234 # 정상 종료 요청 +$ kill -9 1234 # ⚠️ 강제 종료 (최후의 수단)
+
+ +
+

+ + systemctl — 서비스 관리 + ?systemctl은 리눅스의 서비스(=백그라운드 프로그램) 관리 도구다. Nginx, PHP-FPM, MySQL 등을 시작/중지/재시작할 때 사용한다. +

+
# 서비스 상태 확인 (안전, 언제든 OK) +$ systemctl status nginx # Nginx 상태 +$ systemctl status php8.3-fpm # PHP-FPM 상태 +$ systemctl status mysql # MySQL 상태 + +# ⚠️ 서비스 제어 (서비스 중단 위험 — 확인 후 실행) +$ sudo systemctl restart nginx # Nginx 재시작 +$ sudo systemctl restart php8.3-fpm +$ sudo systemctl stop nginx # Nginx 중지 (사이트 접속 불가!) +$ sudo systemctl start nginx # Nginx 시작
+
+
+
+ + {{-- ============================================================ --}} + {{-- 8. 네트워크 --}} + {{-- ============================================================ --}} +
+
+

+ 8 + 네트워크 — "외부와 통신하기" +

+ +
+

+ + curl / wget — URL 요청 & 파일 다운로드 +

+
# URL 응답 확인 (API 테스트에 유용) +$ curl https://sam.codebridgex.com # 응답 본문 출력 +$ curl -I https://sam.codebridgex.com # 헤더만 확인 (상태 코드) + +# 파일 다운로드 +$ wget https://example.com/file.zip # 파일 다운로드
+
+ +
+

+ + ss / netstat — 포트 & 연결 확인 +

+
# 열려있는 포트 확인 +$ ss -tulnp # TCP/UDP 열린 포트 목록 +$ ss -tulnp | grep ":80" # 80번 포트(HTTP) 사용 중인지 확인 +$ ss -tulnp | grep ":3306" # MySQL(3306) 포트 확인
+
+
+
+ + {{-- ============================================================ --}} + {{-- 9. 텍스트 편집 --}} + {{-- ============================================================ --}} +
+
+

+ 9 + 텍스트 편집 — "서버에서 직접 파일 수정하기" +

+ +
+

+ + nano / vi — 터미널 텍스트 편집기 +

+ +
+
+

nano (초보자 추천)

+
$ nano .env + +# 편집 후: +# Ctrl+O → 저장 +# Ctrl+X → 종료
+
+
+

vi / vim (고급)

+
$ vi .env + +# i → 편집 모드 진입 +# Esc → 편집 모드 종료 +# :wq → 저장 후 종료 +# :q! → 저장 안하고 종료
+
+
+
+ 팁: vi에서 빠져나오지 못할 때는 Esc를 여러 번 누른 후 :q!를 입력하면 된다. +
+
+
+
+ + {{-- ============================================================ --}} + {{-- 10. 위험 명령어 --}} + {{-- ============================================================ --}} +
+
+

+ 10 + 위험 명령어 — "절대 주의!" +

+ +
+

아래 명령어들은 서버를 망가뜨릴 수 있다. 실행 전 반드시 확인하자.

+

SAM 서버 정책: 이 명령어들은 팀장/관리자에게 확인 후에만 실행한다.

+
+ +
+
+
+ 치명적 + rm -rf / +
+

서버의 모든 파일을 삭제한다. 절대 실행하면 안 된다.

+
# ❌ 절대 금지 +rm -rf / # 서버 전체 삭제 +rm -rf /* # 서버 전체 삭제 (같은 의미) +rm -rf ~ # 홈 디렉토리 전체 삭제 + +# ✅ 올바른 사용: 삭제할 대상을 명확히 지정 +rm -r /home/pro/backup/old-logs/
+
+ +
+
+ 위험 + chmod -R 777 +
+

모든 사용자에게 모든 권한을 부여한다. 보안 구멍이 된다.

+
# ❌ 보안 위험 +chmod -R 777 /home/webservice/ + +# ✅ 올바른 권한 설정 +chmod -R 755 /home/webservice/mng/ +chmod 600 /home/webservice/mng/.env
+
+ +
+
+ 위험 + kill -9 +
+

프로세스를 강제 종료한다. 데이터 손실 위험.

+
# ❌ 데이터 손실 위험 (MySQL 등에 사용 금지) +kill -9 $(pgrep mysql) + +# ✅ 서비스는 systemctl로 안전하게 종료 +sudo systemctl stop mysql
+
+ +
+
+ 주의 + reboot / shutdown +
+

서버를 재부팅/종료한다. 운영 중인 서비스가 모두 중단된다.

+
# ⚠️ 운영 서버에서 함부로 실행 금지 +sudo reboot # 서버 재시작 +sudo shutdown -h now # 서버 즉시 종료
+
+
+ + {{-- 안전 수칙 요약 --}} +
+

안전 수칙 요약

+
    +
  • 1. rm 실행 전, 삭제 대상 경로를 두 번 확인한다.
  • +
  • 2. chmod 777 대신 필요한 최소 권한만 부여한다.
  • +
  • 3. 서비스 중지/재시작은 팀장에게 확인 후 실행한다.
  • +
  • 4. 모르는 명령어는 man 명령어 또는 명령어 --help로 먼저 확인한다.
  • +
  • 5. 중요한 작업 전에는 항상 백업한다. (cp -r 원본 백업경로)
  • +
+
+
+
+ +
+
+ +
+ +{{-- Hover Preview --}} +
+ +
+
+ +{{-- Lightbox --}} + +@endsection + +@push('scripts') + +@endpush diff --git a/routes/web.php b/routes/web.php index 950e55ac..24a5d050 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1476,6 +1476,7 @@ Route::get('/env-management', [\App\Http\Controllers\AcademyController::class, 'envManagement'])->name('env-management'); Route::get('/git-policy', [\App\Http\Controllers\AcademyController::class, 'gitPolicy'])->name('git-policy'); Route::get('/nginx-encyclopedia', [\App\Http\Controllers\AcademyController::class, 'nginxEncyclopedia'])->name('nginx-encyclopedia'); + Route::get('/linux-commands', [\App\Http\Controllers\AcademyController::class, 'linuxCommands'])->name('linux-commands'); }); // SAM E-Sign - 인증 필요