본문 바로가기
Programing & OS

서버 이전 후 $_GET 관련 문제 정리 (CentOS → Rocky, nginx 변경)

by 자루스 2026. 2. 28.

 

 

서버 이전 후 $_GET 관련 문제 정리 (CentOS → Rocky, nginx 변경)

이번 서버 이전 작업(CentOS → Rocky Linux)과 nginx 버전 변경 과정에서 이상하게도 $_GET 관련 문제가 반복적으로 발생했다.

CLI에서는 정상 동작하지만, 웹(nginx + php-fpm)에서는 특정 조건에서만 비정상 동작하는 현상이 나타났다.


1. 증상 정리

  • CLI 실행 → 정상
  • 웹에서 기본 URL 호출 → 정상
  • ?mode=data 같은 GET 파라미터 포함 시 → 비정상
  • 코드에서 $mode='data' 강제 고정 → 정상

즉, GET 파라미터가 들어올 때만 흐름이 달라지는 문제가 발생했다.


2. 실제로 겪었던 유형들

① QUERY_STRING 관련 이슈

Undefined index: QUERY_STRING

nginx + php-fpm 환경에서 fastcgi_param 설정 차이로 인해 CLI와 웹 환경의 $_SERVER 값이 달라지는 현상.

② GET 값 존재 여부에 따른 분기 변화

$mode = $_GET['mode'] ?? 'data';
$mode = trim($mode);
if (!in_array($mode, ['data','record','summary'], true)) {
	$mode = 'data';
}

기본값일 때는 정상, GET으로 전달될 때만 로직 흐름이 달라짐. 결과적으로 SQL 결과나 배열 구조가 미묘하게 달라짐.

③ 빈 배열 + SQL IN() 문제

implode("','", $FIds)

FIds가 비어 있을 경우 SQL 구문이 예상과 다르게 생성되어 웹 환경에서만 오류 발생 가능.

④ 환경 차이 (CLI vs FPM)

  • memory_limit 차이
  • php.ini 기본값 차이
  • error reporting 차이
  • fastcgi_param 차이
  • SELinux 영향

코드는 같아도 실행 환경이 다르면 결과는 달라질 수 있다.


3. 왜 이런 일이 반복되는가?

서버 이전 시 가장 흔한 원인은 다음과 같다.

  • php-fpm 기본 설정 변화
  • nginx fastcgi include 파일 차이
  • default charset 처리 방식 차이
  • 버전 업그레이드로 인한 타입 처리 엄격화
  • 기존 환경에서 “우연히 통과하던 코드”가 드러남

즉, 버그가 새로 생긴 것이 아니라 숨겨져 있던 전제가 깨진 것이다.


4. 결론 – 설계 문제였다

이번 경험에서 가장 중요한 깨달음은 이것이다.

HTTP(GET)로 내부 실행 제어를 하지 않는다.

REST는 인터페이스다. 엔진(계산 로직)은 CLI로 분리하는 것이 안정적이다.

최종 구조는 다음과 같이 정리했다.

[CLI / cron]
  → 계산 수행
  → JSON 파일 생성

[REST API]
  → JSON 파일 읽기
  → 응답 반환

이렇게 하면:

  • nginx 영향 제거
  • GET 파라미터 영향 제거
  • 환경 차이 최소화
  • 서버 이전 리스크 감소

5. 앞으로의 원칙

  • 실행 제어는 CLI에서 한다.
  • HTTP는 출력 전용으로 사용한다.
  • GET 파라미터는 조회용으로만 쓴다.
  • 서버 이전 전 설정 diff를 반드시 확인한다.

고레벨로 갈수록 에러도 고레벨이 된다. 문법 에러가 아니라 상태(state)와 환경(environment)의 문제가 된다.

이번 작업은 단순한 디버깅이 아니라, 아키텍처를 한 단계 정리하는 과정이었다.


결론:
$_GET은 문제가 아니다.
실행 구조를 HTTP에 의존한 것이 문제였다. 그러나 나는 $_GET은 정말 조심히 쓸것 같다.
시스템은 완벽하지 않다. 언제나 달라진다.