su-tudy 님의 블로그
#8 개발 환경 구축 — PHP & EditPlus & Docker 본문
📌 서버를 개발 환경으로 확장하기
지금까지 Nginx 웹 서버를 구축하고 MariaDB를 설치했다. 그런데 HTML 파일만으로는 DB에서 데이터를 꺼내오거나 동적인 페이지를 만들 수 없다. PHP를 Nginx와 연동하면 서버에서 코드를 실행해 동적인 웹 페이지를 제공할 수 있다.
EditPlus는 FTP로 서버에 직접 연결해 파일을 편집하는 툴이다. PuTTY에서 vim을 쓰는 대신 로컬 편집기에서 코드를 작성하고 저장하면 서버에 바로 반영된다.
마지막으로 Docker는 애플리케이션을 컨테이너 단위로 격리해 실행하는 기술이다. 6편에서 직접 설치했던 MariaDB를 Docker 컨테이너로 바꿔 실행해 보는 것으로 이 시리즈를 마무리한다.
📌 미리 알아두면 좋은 개념
❑ PHP와 PHP-FPM
- PHP : 서버에서 실행되는 스크립트 언어. HTML 안에 PHP 코드를 섞어 동적 웹 페이지를 만들 수 있다.
- PHP-FPM : FastCGI Process Manager. Nginx는 PHP를 직접 실행할 수 없기 때문에 PHP-FPM이 중간에서 PHP 요청을 처리한다.
- FastCGI : 웹 서버와 외부 프로그램(PHP 등) 사이의 인터페이스. Nginx가 9000번 포트로 PHP-FPM에 요청을 전달한다.
- REMI 저장소 : PHP 최신 버전을 제공하는 서드파티 repo. 기본 yum 저장소의 PHP는 구버전이라 REMI를 별도로 추가해야 한다.
❑ 가상머신 vs Docker
| 가상머신 | Docker → 이번 실습 |
| OS 전체를 가상화 | 프로세스 단위 격리 |
| 커널·라이브러리를 모두 포함해 배포. 용량이 크고 성능 손실이 있다. | 리눅스 커널을 공유해 VM보다 훨씬 가볍다. 성능 손실이 없고 환경을 그대로 재현할 수 있다. |
❑ Docker 구성 요소
요청 흐름
Docker Client —Docker Client→명령 전달→Docker Host (Daemon)→Registry (이미지 저장소)build,pull,run같은 명령을 수행하는 인터페이스
Docker Daemon — 컨테이너와 이미지를 생성·관리하는 Docker 엔진
Registry — Docker Hub 같은 외부 이미지 저장소.pull로 이미지를 받아온다.
❑ 이미지와 컨테이너
| 이미지 (image) | 컨테이너 (Container) |
| 컨테이너를 만들기 위한 읽기 전용 템플릿. 이름 구조 : [저장소]/[이름]: [태그] 예 : mariadb:latest |
이미지로 만든 실행 단위. 이미지는 변경되지 않고, 변경사항은 컨테이너 계층에만 저장된다. 호스트와 완전히 격리된다. |
📌 진행한 실습 과정 정리
❑ PHP 8 설치
기본 저장소에는 PHP 최신 버전이 없다. EPEL과 REMI 저장소를 추가한 후 PHP 8을 설치한다.
# 기존 PHP 완전 제거
sudo yum remove php* -y
# EPEL 저장소 설치
sudo yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm -y
# REMI 저장소 설치
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm -y
# yum-utils 설치 (yum-config-manager 명령어 사용을 위해)
sudo yum install yum-utils -y
# 기존 remi-php 비활성화 후 PHP 8.0 활성화
sudo yum-config-manager --disable 'remi-php*'
sudo yum-config-manager --enable remi-php80
# PHP 8.0 및 필요한 확장 모듈 설치
sudo yum install php php-{common,cli,fpm,mysqlnd,zip,devel,gd,mbstring,curl,xml,pear,bcmath,json,opcache} -y
# 설치 확인
php -v
# PHP-FPM 시작 및 자동 활성화
sudo systemctl start php-fpm
sudo systemctl enable php-fpm

❑ Nginx와 PHP-FPM 연동 설정
Nginx는 PHP 파일 요청을 직접 처리하지 못한다. PHP-FPM이 9000번 포트로 요청을 받아 처리하도록 설정 파일을 만든다.
# PHP 연동용 공통 include 파일 생성
sudo vim /etc/nginx/conf.d/php_vhost.conf.include
# 아래 내용 추가
index index.php index.html index.htm;
root $documentRoot;
location ~ \.php$ {
root $documentRoot;
fastcgi_pass 127.0.0.1:9000; # PHP-FPM 포트
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $documentRoot/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
fastcgi_read_timeout 600;
}
# vhost.conf에 PHP 연동 내용 추가
sudo vim /etc/nginx/conf.d/vhost.conf
# 아래 내용 추가
server {
listen 8011;
server_name _;
set $documentRoot /web/site1/public;
location / {
try_files $uri $uri/ /index.php?$args;
}
include /etc/nginx/conf.d/php_vhost.conf.include;
}
server {
listen 8012;
server_name _;
set $documentRoot /web/site2/public;
location / {
try_files $uri $uri/ /index.php?$args;
}
include /etc/nginx/conf.d/php_vhost.conf.include;
}
try_files $uri $uri/ /index.php?$args;는 요청한 파일이 없을 때 index.php로 넘기는 설정이다. 워드프레스 같은 CMS에서 URL 라우팅이 작동하도록 하는 필수 설정이다.# 설정 문법 확인 후 nginx 재시작
sudo nginx -t
sudo systemctl restart nginx
❑ EditPlus로 PHP 파일 작성 및 업로드 테스트
EditPlus를 FTP로 서버에 연결하면 로컬 편집기에서 저장하는 순간 서버에 바로 반영된다. PuTTY에서 vim을 쓰는 것보다 훨씬 편하게 코드를 작성할 수 있다.
- EditPlus 설치 후 실행 → 파일 → FTP → FTP 설정 → 추가 → 아래 정보 입력
- 연결 후 public 폴더로 이동 →
gugudan.php파일 생성 - 브라우저에서 확인 :
192.168.56.x:8011/gugudan.php?dan=임의숫자&limit=임의숫자
EditPlus FTP서버 연결 정보
서버 : 192.168.56.x
포트 : 21
유저명 : FTP 계정 입력 (site1)
비밀번호 : 설정한 비밀번호 입력
// gugudan.php에 아래 내용 추가
<?php
$dan = intval($_GET['dan']);
$limit = intval($_GET['limit']);
?>
<h1>== <?=$dan?>단 ==</h1>
<?php for ($i = 1; $i <= $limit; $i++) { ?>
<div><?=$dan?> * <?=$i?> = <?=$dan * $i?></div>
<?php } ?>

intval()로 입력값을 정수로 강제 변환하는 것은 보안상 중요하다. 사용자 입력을 그대로 사용하면 SQL 인젝션 같은 공격에 취약해 질 수 있다.
❑ Docker 설치
# Docker 설치에 필요한 패키지 먼저 설치
sudo yum install yum-utils device-mapper-persistent-data lvm2 -y
# Docker 공식 저장소 추가
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# Docker CE 설치
sudo yum install docker-ce -y
# 버전 확인
docker -v
# Docker 시작 및 자동 활성화
sudo systemctl start docker
sudo systemctl enable docker
# Docker Compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
# 버전 확인
docker-compose -version
# sudo 없이 docker 명령 실행 (현재 계정을 docker 그룹에 추가)
sudo usermod -aG docker ${USER}
# 반드시 PuTTY 재접속 후 적용 확인
docker ps
usermod -aG docker ${USER}는 현재 세션에 바로 적용되지 않는다. PuTTY를 완전히 종료하고 재접속해야 sudo 없이 docker 명령을 쓸 수 있다.
❑ Docker로 MariaDB 컨테이너 실행
기존에 직접 설치했던 MariaDB를 끄고, Docker 컨테이너로 MariaDB를 띄운다. 데이터 파일은 호스트 경로에 마운트에 컨테이너를 삭제해도 데이터가 보존되도록 설정한다.
# 기존 MariaDB 서비스 중지 (포트 충돌 방지)
sudo systemctl stop mariadb
sudo systemctl disable mariadb
# MariaDB 컨테이너 실행
docker run --name mariadb1 \
-d \
--restart=always \
-e MARIADB_ROOT_PASSWORD=korea1231 \
-p 3306:3306 \
-v /docker/projects/mariadb1/conf.d:/etc/mysql/conf.d \
-v /docker/projects/mariadb1/mysql:/var/lib/mysql \
-v /docker/projects/mariadb1/run/mysqld:/run/mysqld/ \
mariadb:latest
--name mariadb1: 컨테이너 이름 지정. 이후 명령어에서 이름으로 컨테이너를 참조한다.-d: 백그라운드(detached) 실행. 터미널을 점유하지 않고 데몬처럼 실행된다.--restart=always: 서버 재부팅 시 자동으로 컨테이너가 다시 시작된다. systemctl enable과 같은 효과-v(볼륨 마운트) : 호스트 경로와 컨테이너 경로를 연결. 컨테이너가 삭제되어도 데이터가 호스트에 남는다.
# 컨테이너 실행 상태 확인
docker ps
# Docker 컨테이너 안의 MariaDB에 접속
docker exec -it mariadb1 mariadb -u root -p
❑ 자주 쓰는 Docker 명령어
# 자주 쓰는 Docker 명령어
docker ps # 실행 중인 컨테이너 목록
docker ps -a # 전체 컨테이너 목록 (중지된 것 포함)
docker stop mariadb1 # 컨테이너 중지
docker start mariadb1 # 컨테이너 시작
docker rm mariadb1 # 컨테이너 삭제
docker images # 로컬 이미지 목록
docker logs mariadb1 # 컨테이너 로그 확인
⚠️ 오류 / 주의
🚨 요류 — PHP 파일이 다운로드되거나 소스코드가 그대로 보일 때
PHP-FPM이 실행 중이지 않거나, vhost.conf에 include 설정이 누락된 경우다. sudo systemctl status php-fpm으로 상태를 확인하고, nginx 설정 파일에 include /etc/nginx/conf.d/php_vhost.conf.include;가 들어있는지 확인한다.
🚨 오류 — docker run 후 컨테이너가 바로 종료될 때
볼륨 마운트 경로가 없으면 컨테이너가 즉시 종료된다. docker logs mariadb1로 오류 메세지를 확인하고, 마운트 경로 디렉토리를 미리 생성(sudo mkdir -p /docker/projects/mariadb1/...)한 후 다시 실행한다.
🚨 오류 — 기존 MariaDB와 Docker MariaDB가 포트 충돌할 때
둘다 3306 포트를 사용하려 해서 충돌이 생긴다. Docker 컨테이너를 실행하기 전에 반드시 sudo systemctl stop mariadb로 기존 서비스를 먼저 중지해야 한다.
📌 요약
✔️ REMI 저장소를 추가해 PHP 8을 설치하고 PHP-FPM으로 Nginx와 연동
✔️ 공통 include 파일로 PHP 설정을 여러 서버 블록에서 재사용할 수 있게 함
✔️ EditPlus를 FTP로 서버에 연결해 PHP 파일을 작성하고 동적 페이지를 테스트
✔️ Docker를 설치하고 MariaDB를 컨테이너로 전환해 볼륨 마운트로 데이터를 보존
다음 편으로 이동 🔜 #9 실전 배포 — 클라우드 서버 & Docker & Django
'리눅스 > Linux 실습' 카테고리의 다른 글
| #9 실전 배포 — 클라우드 서버 & Docker & Django (0) | 2026.04.23 |
|---|---|
| #7 FTP 서버 구축 — Pure-FTPd & FileZilla & 호스트 전용 어댑터 (0) | 2024.12.10 |
| #6 데이터베이스 구축 — MariaDB & SQLyog (0) | 2024.12.09 |
| #5 웹 서버 구축 — Nginx 설치 & Virtual Hosting (0) | 2024.11.24 |
| #4 보안 설정 — 방화벽(firewalld) & SELinux 비활성화 (0) | 2024.11.23 |