(주)에버스톤 · 부산 해운대 BCC 613호

노후 PHP 서버 이전 절차 — CentOS 7·PHP 7.0에서 PHP 8.3까지 하루 만에 옮긴 순서

지원이 끝난 CentOS 7·PHP 7.0 서버를 Rocky Linux 8·PHP 8.3으로 옮긴 실제 절차입니다. 서버 밖 전체 백업, 로컬 리허설, OS 재설치, 라이브 점검 순서와 전환 당일 막힌 방화벽·SELinux·메일 문제까지 담당자가 그대로 따라 할 수 있게 정리했습니다.

에버스톤7분 분량AI · 개발웹 · 업무 시스템 구축

지원이 끝난 PHP 서버를 옮길 때 가장 중요한 것은 새 서버 설정이 아니라 되돌아갈 수 있는 백업과 미리 해 본 리허설입니다. 저희는 CentOS 7·PHP 7.0으로 운영되던 그누보드 홈페이지와 업무용 웹 시스템을 Rocky Linux 8·PHP 8.3으로 옮겼고, 아래 순서를 지켜 OS 재설치부터 HTTPS 적용까지 하루 안에 마쳤습니다. 데이터 손실과 PHP 치명 오류는 0건이었습니다.

  • 전환 전에 DB·첨부파일·설정을 서버 밖으로 전부 백업하고 해시로 무결성을 확인합니다
  • 목표 스택을 로컬 Docker로 띄워 리허설하면 실서버에서 터질 오류를 미리 고칠 수 있습니다
  • 설치·배포를 스크립트로 만들어 두면 전환 당일은 실행과 점검만 남습니다
  • 당일 문제는 대부분 코드가 아니라 방화벽·SELinux 같은 서버 환경에서 나옵니다

PHP 7 서버를 지금 옮겨야 하는 이유

PHP 7.0은 2019년 1월, CentOS 7은 2024년 6월에 보안 지원이 끝났습니다. 새 취약점이 나와도 패치가 없고, 공공기관의 PHP 보안 권고 대상이 됩니다. 겉으로 잘 돌아가도 위험은 쌓이고 있는 상태입니다.

구성 이전 이후
OS CentOS 7 (지원 종료) Rocky Linux 8
PHP 7.0 (지원 종료) 8.3
DB MariaDB 10.3 MariaDB 10.11
CMS 그누보드 5.2 그누보드 5.6
접속 HTTP만 HTTPS (무료 인증서, 자동 갱신)

이번에는 같은 서버에서 OS를 재설치하는 방식을 택해 공인 IP가 그대로 유지됐고, DNS를 건드리지 않고 전환했습니다. 새 서버를 따로 만든다면 전날 DNS TTL을 낮춰 두어야 합니다.

전환 전 준비 — 백업과 리허설이 전부입니다

전환 성공 여부는 당일이 아니라 준비 단계에서 정해집니다.

  1. 서버 밖 전체 백업 — DB 덤프, 첨부파일, 웹서버·PHP·DB 설정, 크론까지 받습니다. 파일마다 SHA256 해시를 만들어 복원 후 대조하고, 사본은 두 곳 이상에 둡니다
  2. 로컬 리허설 — Docker로 같은 OS·PHP·DB 버전을 띄우고 실제 코드와 DB로 화면을 하나씩 눌러 봅니다. 저희는 여기서 영문 하위 페이지가 빈 화면으로 나오는 문제와 게시판 편집 화면의 500 오류를 찾아 미리 고쳤습니다. 둘 다 PHP 8에서 엄격해진 포함 경로·전역 변수 처리 때문이었습니다
  3. 코드 정리 — 이미 사라진 개발용 도메인과 절대경로 URL을 상대경로로 바꿉니다. 본문에 박힌 이미지 주소는 SQL로 일괄 치환합니다
  4. 스크립트화 — 기반 설치, 코드·데이터 배포, HTTPS 발급을 각각 스크립트로 만듭니다
  5. 호스팅사 확인 — OS 재설치 뒤 IP와 방화벽 정책이 유지되는지, 443 포트가 열려 있는지 미리 물어 둡니다

전환 당일 순서

당일에는 정해 둔 순서대로 실행하고, 단계마다 확인 항목을 통과해야 다음으로 넘어갑니다.

순서 작업 확인할 것
1 디스크 여유·신규 데이터 없음 재확인 백업 이후 바뀐 데이터가 없는지
2 사용자에게 중단 공지 작업 시간 안내
3 OS 재설치(OS만 설치) 새 접속 지문 등록
4 코드·백업 업로드 첨부 용량이 가장 오래 걸림
5 기반 설치 스크립트 웹서버·PHP 8.3·DB·메일·인증서 도구
6 배포 스크립트 코드·첨부·DB 복원, CMS 스키마 업그레이드, 권한
7 HTTP로 전체 점검 오류 로그에 치명 오류 0
8 HTTPS 발급 HTTP 접속이 301로 HTTPS로 넘어가는지
9 쓰기 동작까지 라이브 점검 후 오픈 로그인·글쓰기·업로드·메일

OS 재설치는 신청 후 40분 정도 걸렸고, 가장 오래 걸린 구간은 6.5GB 첨부파일 복원이었습니다. 디스크가 작아 압축본을 올려 푸는 대신 전송하면서 바로 풀어 공간을 아꼈습니다.

당일 막히는 곳은 코드가 아니라 서버 환경입니다

리허설을 거친 코드는 문제가 없었습니다. 막힌 곳은 모두 환경 설정이었습니다.

증상 원인 조치
재설치 후 패키지 설치 등 외부 연결 전부 실패 호스팅 방화벽 아웃바운드 차단 아웃바운드 허용 규칙 추가
페이지는 열리는데 로그인·글쓰기·업로드 실패 SELinux가 웹서버의 쓰기를 차단 httpd_unified 등 SELinux 설정으로 쓰기 허용
HTTPS 접속 안 됨 443 포트 미개방 방화벽 인바운드 443 추가
알림 메일이 스팸함으로 가거나 반송 발신 주소와 SPF 불일치, 한글 제목 처리 미지원 수신 서버 발신 도메인 통일, SPF에 서버 IP 추가, smtputf8_enable=no

SELinux 문제는 페이지를 열어 보는 것만으로는 드러나지 않습니다. 관리자 로그인, 문의 폼 제출, 파일 업로드처럼 실제로 쓰는 동작을 해 봐야 보입니다. 서버 작업을 AI 에이전트와 나눠 할 때 어디서 사람이 확인해야 하는지는 AI 에이전트에게 서버 작업을 맡긴 기록에 따로 정리했습니다.

옮기는 김에 보안까지 정리합니다

이전은 오래된 코드를 다시 읽을 기회입니다. 이번에는 다음을 함께 처리했습니다.

  • 소스에 하드코딩된 로그인 우회용 공용 비밀번호 제거
  • 비회원이 쓰는 문의·지원 폼에 자동등록방지(캡차) 적용, 이식 중 캡차를 숨기던 스킨 버그 수정
  • DB·SSH·FTP 포트는 사무실 IP만 허용하고 웹(80/443)만 공개
  • 자동 백업에 디스크 여유 확인을 넣어 디스크가 가득 차 서비스가 멈추는 일을 방지

이런 업무용 웹 시스템의 구축과 유지보수는 웹 · 업무 시스템 구축 페이지에 정리해 두었습니다.

자주 묻는 질문

PHP 8로 올리면 그누보드 사이트가 깨지나요? 구버전 그누보드는 경고나 빈 화면이 날 수 있습니다. 5.6으로 올리고 스킨·커스텀 코드를 리허설로 점검하면 대부분 해결됩니다.

서버 이전 중 사이트는 얼마나 멈추나요? OS 재설치 방식은 재설치부터 점검까지 멈춥니다. 이번 사례는 하루 안에 끝났고, 첨부 용량이 시간을 좌우합니다.

서버 IP가 바뀌면 무엇을 해야 하나요? 도메인 DNS의 A 레코드를 새 IP로 바꿉니다. 전날 TTL을 낮춰 두면 반영이 빨라집니다.

롤백은 어떻게 준비하나요? 서버 밖 전체 백업이 유일한 롤백 수단입니다. 해시로 무결성을 확인하고 사본을 두 곳 이상 둡니다.

HTTPS 인증서 비용이 드나요? Let's Encrypt 인증서는 무료이고 certbot으로 자동 갱신됩니다. 방화벽에서 443 포트만 열어 두면 됩니다.

저희가 이 이야기를 하는 이유

에버스톤은 13년 동안 앱·웹·게임을 만들고 직접 운영해 왔습니다. 운영을 오래 하다 보면 개발보다 오래 남는 일이 서버와 보안 관리입니다. 이 글은 실제 운영 서버를 옮기며 쓴 체크리스트를 그대로 옮긴 것이고, 오래된 PHP 사이트와 업무 시스템의 이전·유지보수도 같은 방식으로 진행합니다.

다른 글