2단계: 서버 환경 설정

← 이전: 클라우드 준비 메인으로 다음: Laravel 배포 →

서버가 준비되었으니 이제 Laravel을 실행하는데 필요한 소프트웨어들을 설치해볼까요? 이 단계에서는 PHP, MySQL, Redis, Nginx 등 모든 필수 요소들을 차근차근 설치할 거예요.

이 단계에서 배울 내용

  • PHP 8.4 설치 및 Laravel 필수 확장 설치
  • Composer 의존성 관리 도구 설치
  • Git 버전 관리 시스템 설치
  • MySQL 8.4 데이터베이스 설치 및 보안 설정
  • Redis 7.x 캐시 서버 설치
  • Nginx 1.28 웹서버 설치
  • Node.js 20.x LTS 설치 (프론트엔드 빌드용)

💡 예상 소요 시간: 40-50분 정도 걸려요.


2.1 PHP 8.4 설치하기

PHP 8.4가 뭐가 좋은가요?

PHP 8.4는 최신 버전으로 엄청난 성능 향상과 새로운 기능들을 제공해요:

  • Property Hooks: getter/setter를 더 간결하게 작성
  • JIT 컴파일러: 코드 실행 속도가 훨씬 빨라져요
  • 새로운 배열 함수: 코드가 더 읽기 쉬워져요
  • 향상된 보안: 더 안전한 애플리케이션 개발 가능

패키지 목록 업데이트

# 최신 패키지 정보 업데이트
sudo apt update

PHP 8.4 코어 설치

Ubuntu 25.10은 기본적으로 PHP 8.4를 제공해요!

# PHP 8.4 코어 및 FPM 설치
sudo apt install -y php8.4-fpm php8.4-cli

💡 PHP-FPM이 뭔가요? FPM(FastCGI Process Manager)은 PHP를 웹서버와 연결해주는 브릿지예요. Nginx와 함께 사용하면 성능이 매우 좋습니다.

Laravel 필수 확장 모듈 설치

Laravel이 제대로 작동하려면 여러 PHP 확장이 필요해요:

# Laravel 필수 확장 한 번에 설치
sudo apt install -y php8.4-mysql php8.4-redis php8.4-xml php8.4-curl \
                   php8.4-zip php8.4-mbstring php8.4-bcmath php8.4-tokenizer \
                   php8.4-gd php8.4-intl php8.4-sqlite3

각 확장이 하는 일

확장 용도
mysql MySQL 데이터베이스 연결
redis Redis 캐시 연결
xml XML 파싱
curl HTTP 요청 보내기
zip 압축 파일 처리
mbstring 멀티바이트 문자열 (한글 등)
bcmath 정밀한 수학 계산
tokenizer 코드 파싱
gd 이미지 처리
intl 국제화 지원
sqlite3 SQLite 데이터베이스

추가 유용한 확장

# 추가 확장 설치 (선택사항)
sudo apt install -y php8.4-soap php8.4-xmlrpc php8.4-imagick

PHP 설정 최적화

이제 PHP를 Laravel에 최적화해봅시다:

# PHP 설정 파일 경로: /etc/php/8.4/fpm/php.ini
# 메모리 제한 증가
sudo sed -i 's/memory_limit = .*/memory_limit = 512M/' /etc/php/8.4/fpm/php.ini

# 파일 업로드 크기 제한 증가
sudo sed -i 's/upload_max_filesize = .*/upload_max_filesize = 64M/' /etc/php/8.4/fpm/php.ini
sudo sed -i 's/post_max_size = .*/post_max_size = 64M/' /etc/php/8.4/fpm/php.ini

# 실행 시간 제한 증가
sudo sed -i 's/max_execution_time = .*/max_execution_time = 300/' /etc/php/8.4/fpm/php.ini

PHP 8.4 JIT 컴파일러 활성화

JIT를 켜면 성능이 크게 향상돼요:

# OPcache 및 JIT 활성화
sudo sed -i 's/;opcache.enable=1/opcache.enable=1/' /etc/php/8.4/fpm/php.ini
sudo sed -i 's/;opcache.jit=1205/opcache.jit=1205/' /etc/php/8.4/fpm/php.ini
sudo sed -i 's/;opcache.jit_buffer_size=0/opcache.jit_buffer_size=64M/' /etc/php/8.4/fpm/php.ini

프로덕션 환경 에러 설정

# 에러 표시 끄기 (보안)
sudo sed -i 's/display_errors = .*/display_errors = Off/' /etc/php/8.4/fpm/php.ini

# 에러 로깅 켜기
sudo sed -i 's/log_errors = .*/log_errors = On/' /etc/php/8.4/fpm/php.ini

💡 왜 display_errors를 끄나요? 에러 메시지에 민감한 정보가 포함될 수 있어서 보안상 끄는 게 좋아요. 대신 로그 파일에 기록합니다.

PHP-FPM 서비스 시작

# PHP-FPM 서비스 시작
sudo systemctl start php8.4-fpm

# 부팅 시 자동 시작 설정
sudo systemctl enable php8.4-fpm

# 서비스 상태 확인
sudo systemctl status php8.4-fpm

PHP 설치 확인

# PHP 버전 확인
php --version

# 출력 예시:
# PHP 8.4.x (cli) (built: ...)

# 설치된 확장 모듈 확인
php -m

# JIT 활성화 확인
php -m | grep -i opcache

2.2 Composer 설치하기

Composer가 뭔가요?

Composer는 PHP의 의존성 관리 도구예요. Laravel 프로젝트가 필요로 하는 모든 패키지를 자동으로 설치해줍니다. Node.js의 npm이나 Python의 pip와 비슷한 역할이에요.

Composer 다운로드 및 설치

# Composer 인스톨러 다운로드 및 실행
curl -sS https://getcomposer.org/installer | php

# 시스템 전역 위치로 이동
sudo mv composer.phar /usr/local/bin/composer

# 실행 권한 부여
sudo chmod +x /usr/local/bin/composer

설치 확인

# Composer 버전 확인
composer --version

# 출력 예시:
# Composer version 2.x.x

# 전역 사용 가능 확인
which composer
# 출력: /usr/local/bin/composer

완벽해요! 🎉


2.3 Git 설치 및 설정하기

Git이 왜 필요한가요?

Git은 코드를 관리하고, GitHub에서 프로젝트를 가져오는데 필수적이에요.

Git 설치

# Git 패키지 설치
sudo apt install -y git

Git 전역 설정 (선택사항)

나중에 서버에서 직접 커밋할 일이 있을 수 있으니 설정해둡시다:

# 사용자 이름 설정
git config --global user.name "Deploy User"

# 이메일 주소 설정
git config --global user.email "deploy@example.com"

# 기본 브랜치명 설정
git config --global init.defaultBranch main

Git 설치 확인

# Git 버전 확인
git --version

# 출력 예시:
# git version 2.x.x

# Git 설정 확인
git config --list --global

2.4 MySQL 8.4 설치하기

MySQL 서버 설치

Ubuntu 25.10은 기본적으로 MySQL 8.4를 제공해요!

# MySQL 8.4 서버 설치
sudo apt install -y mysql-server

# MySQL 서비스 시작 및 자동 시작 설정
sudo systemctl start mysql
sudo systemctl enable mysql

MySQL 버전 확인

# MySQL 버전 확인
mysql --version

# 출력 예시:
# mysql  Ver 8.4.x for Linux on x86_64

MySQL 보안 설정

새로 설치한 MySQL은 보안 설정이 느슨해요. 강화해봅시다:

# MySQL 보안 설정 마법사 실행
sudo mysql_secure_installation

보안 설정 과정

차례대로 나오는 질문들에 답해주세요:

1. VALIDATE PASSWORD 플러그인 설치하시겠습니까?
   → Y (비밀번호 강도 검사)

2. 비밀번호 정책 레벨을 선택하세요 (0=LOW, 1=MEDIUM, 2=STRONG)
   → 1 (또는 2)

3. Root 비밀번호를 설정하세요
   → 강력한 비밀번호 입력 (잘 기억해두세요!)

4. 익명 사용자를 제거하시겠습니까?
   → Y (보안 강화)

5. root 사용자의 원격 로그인을 금지하시겠습니까?
   → Y (보안 강화)

6. test 데이터베이스를 제거하시겠습니까?
   → Y (필요 없음)

7. 권한 테이블을 다시 로드하시겠습니까?
   → Y (설정 적용)

🔒 비밀번호 꿀팁: 강력한 비밀번호 예시: MySecure#Pass2024! (대소문자, 숫자, 특수문자 조합)

Laravel 애플리케이션용 데이터베이스 생성

이제 Laravel이 사용할 데이터베이스와 사용자를 만들어봅시다:

# MySQL 접속 (root 계정)
sudo mysql -u root -p

비밀번호를 입력하면 MySQL 콘솔로 들어갑니다:

-- 데이터베이스 생성 (UTF-8 인코딩)
CREATE DATABASE jinyerp_demo CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 애플리케이션용 사용자 생성
CREATE USER 'jinyerp'@'localhost' IDENTIFIED BY 'your_secure_password_here';

-- 데이터베이스 권한 부여
GRANT ALL PRIVILEGES ON jinyerp_demo.* TO 'jinyerp'@'localhost';

-- 권한 새로고침
FLUSH PRIVILEGES;

-- 생성된 데이터베이스 확인
SHOW DATABASES;

-- MySQL 종료
EXIT;

🔒 중요: your_secure_password_here를 실제로 사용할 강력한 비밀번호로 바꿔주세요!

MySQL 연결 테스트

# 새로 만든 사용자로 접속 테스트
mysql -u jinyerp -p jinyerp_demo -e "SELECT 1;"

비밀번호 입력 후 에러가 없으면 성공! 🎉

주요 MySQL 설정 파일 경로

나중에 필요할 때를 위해 알아두세요:

  • 메인 설정: /etc/mysql/mysql.conf.d/mysqld.cnf
  • 클라이언트 설정: /etc/mysql/conf.d/mysql.cnf
  • 데이터 디렉토리: /var/lib/mysql/
  • 에러 로그: /var/log/mysql/error.log
  • 소켓 파일: /var/run/mysqld/mysqld.sock

2.5 Redis 7.x 설치하기

Redis가 왜 필요한가요?

Redis는 초고속 인메모리 데이터베이스예요. Laravel에서는 주로:

  • 세션 저장소: 로그인 정보 저장
  • 캐시: 자주 사용하는 데이터 저장
  • : 백그라운드 작업 관리

Redis 서버 설치

# Redis 7.x 서버 설치
sudo apt install -y redis-server

# Redis 서비스 시작 및 자동 시작 설정
sudo systemctl start redis-server
sudo systemctl enable redis-server

Redis 버전 확인

# Redis 버전 확인
redis-server --version

# 출력 예시:
# Redis server v=7.x.x

Redis 보안 및 성능 설정

설정 파일 백업

# 원본 설정 파일 백업
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.backup

Redis 설정 편집

# Redis 설정 파일 편집
sudo nano /etc/redis/redis.conf

다음 설정들을 찾아서 수정해주세요:

# 메모리 제한 설정 (서버 RAM의 25% 정도)
maxmemory 256mb
maxmemory-policy allkeys-lru

# 보안을 위한 비밀번호 설정
requirepass your_strong_redis_password_here

# 외부 접속 제한 (로컬에서만 접속)
bind 127.0.0.1 ::1

# 위험한 명령어 비활성화 (보안)
rename-command FLUSHDB ""
rename-command FLUSHALL ""

💡 설정 설명:

  • maxmemory: Redis가 사용할 최대 메모리
  • maxmemory-policy: 메모리 가득 차면 오래된 키 삭제
  • requirepass: 비밀번호 설정
  • bind: 로컬에서만 접속 허용
  • rename-command: 위험한 명령어 비활성화

저장하고 종료: Ctrl + X, Y, Enter

Redis 재시작 및 확인

# 설정 적용을 위한 Redis 재시작
sudo systemctl restart redis-server

# Redis 서비스 상태 확인
sudo systemctl status redis-server

# Redis 연결 테스트 (비밀번호 필요)
redis-cli -a your_strong_redis_password_here ping
# 출력: PONG

# Redis 메모리 사용량 확인
redis-cli -a your_strong_redis_password_here info memory

Redis 설정 파일 경로

  • 메인 설정: /etc/redis/redis.conf
  • 백업 설정: /etc/redis/redis.conf.backup
  • 로그 파일: /var/log/redis/redis-server.log
  • 데이터 디렉토리: /var/lib/redis/

2.6 Nginx 1.28 웹서버 설치하기

Nginx가 뭔가요?

Nginx는 빠르고 효율적인 웹서버예요. Apache보다 메모리를 적게 사용하면서도 더 많은 동시 접속을 처리할 수 있어요.

Nginx 설치

# Nginx 1.28 패키지 설치
sudo apt install -y nginx

# Nginx 서비스 시작 및 자동 시작 설정
sudo systemctl start nginx
sudo systemctl enable nginx

Nginx 버전 확인

# Nginx 버전 확인
nginx -v

# 출력 예시:
# nginx version: nginx/1.28.x

Nginx 기본 동작 확인

# Nginx 서비스 상태 확인
sudo systemctl status nginx

# 웹서버 동작 확인
curl http://localhost

HTML 코드가 출력되면 성공! 🎉

Nginx 설정 문법 확인

# 설정 파일 문법 확인
sudo nginx -t

# 출력 예시:
# nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
# nginx: configuration file /etc/nginx/nginx.conf test is successful

기본 보안 설정

기본 사이트 비활성화

# 기본 사이트 비활성화
sudo rm -f /etc/nginx/sites-enabled/default

서버 토큰 숨기기

# Nginx 버전 정보 숨기기 (보안)
sudo sed -i '/server_tokens/s/^#//' /etc/nginx/nginx.conf
sudo sed -i 's/server_tokens on/server_tokens off/' /etc/nginx/nginx.conf

# 설정 적용
sudo systemctl reload nginx

💡 왜 서버 토큰을 숨기나요? Nginx 버전 정보가 노출되면 해당 버전의 취약점을 이용한 공격을 받을 수 있어요.

Nginx 주요 설정 파일 경로

  • 메인 설정: /etc/nginx/nginx.conf
  • 사이트 설정: /etc/nginx/sites-available/
  • 활성 사이트: /etc/nginx/sites-enabled/
  • 추가 설정: /etc/nginx/conf.d/
  • 에러 로그: /var/log/nginx/error.log
  • 액세스 로그: /var/log/nginx/access.log

2.7 Node.js 및 NPM 설치하기

Node.js가 왜 필요한가요?

Laravel의 프론트엔드 에셋(CSS, JavaScript)을 빌드하는데 필요해요. Vite나 Laravel Mix를 사용하려면 필수입니다.

Node.js 20.x LTS 저장소 추가

# NodeSource 저장소 스크립트 다운로드 및 실행
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

# 패키지 목록 업데이트
sudo apt update

Node.js 및 NPM 설치

# Node.js 패키지 설치 (NPM 자동 포함)
sudo apt install -y nodejs

# 필수 빌드 도구 설치
sudo apt install -y build-essential

Node.js 설치 확인

# Node.js 버전 확인
node --version
# 출력: v20.x.x

# NPM 버전 확인
npm --version
# 출력: 10.x.x

NPM 최신 버전으로 업데이트

# NPM을 최신 버전으로 업데이트
sudo npm install -g npm@latest

# 업데이트 확인
npm --version

NPM 전역 패키지 권한 설정 (선택사항)

# 전역 패키지 디렉토리 생성
mkdir ~/.npm-global

# NPM 설정 변경
npm config set prefix '~/.npm-global'

# PATH 환경 변수 추가
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.profile

# 설정 적용
source ~/.profile

2.8 서버 설정 완료 확인

모든 소프트웨어를 설치했어요! 이제 제대로 설치되었는지 최종 확인해봅시다.

모든 서비스 상태 확인

# 모든 설치된 서비스 상태 한 번에 확인
sudo systemctl status php8.4-fpm mysql redis-server nginx --no-pager

모두 active (running) 상태면 성공! 🎉

서비스 포트 확인

# 각 서비스가 사용하는 포트 확인
sudo netstat -tlnp | grep -E ':22|:80|:443|:3306|:6379'

출력 예시:

tcp   0.0.0.0:22    LISTEN   (SSH)
tcp   0.0.0.0:80    LISTEN   (Nginx HTTP)
tcp   0.0.0.0:443   LISTEN   (Nginx HTTPS)
tcp   127.0.0.1:3306   LISTEN   (MySQL)
tcp   127.0.0.1:6379   LISTEN   (Redis)

메모리 사용량 확인

# 메모리 사용량 확인
free -h

설치된 버전 요약

# 모든 버전 한 번에 확인
echo "=== PHP ===" && php --version | head -1
echo "=== Composer ===" && composer --version
echo "=== Git ===" && git --version
echo "=== MySQL ===" && mysql --version
echo "=== Redis ===" && redis-server --version
echo "=== Nginx ===" && nginx -v 2>&1
echo "=== Node.js ===" && node --version
echo "=== NPM ===" && npm --version

✅ 2단계 완료 체크리스트

모든 단계를 완료하셨나요? 체크리스트로 확인해봅시다!

  • PHP 8.4 설치 및 확장 모듈 설정
  • PHP JIT 컴파일러 활성화
  • PHP-FPM 서비스 실행 확인
  • Composer 설치 및 전역 사용 가능
  • Git 설치 및 기본 설정
  • MySQL 8.4 설치 및 보안 설정
  • MySQL 데이터베이스 및 사용자 생성
  • Redis 7.x 설치 및 보안 설정
  • Nginx 1.28 설치 및 기본 보안 설정
  • Node.js 20.x LTS 및 NPM 설치
  • 모든 서비스 정상 동작 확인

문제 해결

문제 1: PHP 확장이 설치 안 돼요

E: Unable to locate package php8.4-xxx

해결 방법:

# 패키지 목록 다시 업데이트
sudo apt update

# 사용 가능한 PHP 패키지 검색
apt-cache search php8.4

문제 2: MySQL root 비밀번호를 잊어버렸어요

해결 방법:

# MySQL 안전 모드로 시작
sudo systemctl stop mysql
sudo mysqld_safe --skip-grant-tables &

# 비밀번호 없이 접속
mysql -u root

# 비밀번호 재설정
ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

# MySQL 재시작
sudo systemctl restart mysql

문제 3: Redis가 시작 안 돼요

해결 방법:

# Redis 로그 확인
sudo tail -f /var/log/redis/redis-server.log

# 설정 파일 문법 확인
redis-server /etc/redis/redis.conf --test-config

# 권한 확인
ls -la /var/lib/redis/

문제 4: Nginx 설정 테스트 실패

해결 방법:

# 상세한 에러 메시지 확인
sudo nginx -t

# 설정 파일 문법 확인
sudo nano /etc/nginx/nginx.conf

# 에러 로그 확인
sudo tail -f /var/log/nginx/error.log

다음 단계

축하합니다! 2단계를 완료하셨어요! 🎉

서버 환경이 모두 준비되었으니 이제 Laravel 프로젝트를 배포할 차례입니다!


← 이전: 클라우드 준비 메인으로 다음: Laravel 배포 →