CentOS에서 Zend Guard Loader가 필요한 경우는 대부분 오래된 상용 PHP 프로그램이나 인코딩된 스크립트가 서버에서 실행되지 않을 때입니다.
특히 서버를 이전했거나 PHP를 다시 설치한 뒤 기존 프로그램이 열리지 않고 로더 관련 오류가 뜬다면, Zend Guard Loader가 필요한 환경일 가능성이 큽니다.
다만 Zend Guard는 이미 지원이 종료됐고 PHP 7 이상에서는 동작하지 않기 때문에, 설치 전에 먼저 서버의 PHP 버전과 실제 운영 목적을 확인해야 합니다.
이 글에서는 CentOS에서 Zend Guard Loader를 설치할 때 꼭 확인해야 할 조건과, PHP 5.5·5.6 환경에서 적용할 수 있는 설치 방법을 정리하겠습니다.
2013년 10월 22일에 발행한 글을 보완했습니다.
목차
CentOS에서 Zend Guard Loader가 필요한 이유
Zend Guard Loader는 일반 PHP 확장과 달리, Zend Guard로 인코딩된 PHP 파일을 런타임에서 해석할 수 있게 해주는 모듈입니다. 즉, 프로그램 파일 자체가 평문 PHP가 아니라 인코딩된 상태라면 로더가 없을 때 페이지가 열리지 않거나, 시작 단계에서 로더 관련 오류가 바로 나타날 수 있습니다. 오래된 쇼핑몰, 그룹웨어, 라이선스 기반 상용 솔루션에서 이런 구조가 아직 남아 있는 경우가 있습니다.

중요한 점은 CentOS라서 설치한다가 아니라 서버에서 돌리는 프로그램이 Zend Guard Loader를 요구하느냐 입니다.
Zend 공식 릴리스 노트 기준으로 Zend Guard 7은 PHP 5.5와 5.6을 지원하며, 그 이전 PHP 5.3·5.4는 Guard 6 계열을 봐야 합니다. PHP 7 이상은 지원 대상이 아니므로, 현재 서버가 PHP 7.x 또는 PHP 8.x라면 설치 자체보다 프로그램의 호환 버전을 확인하는 쪽이 먼저입니다.
결과 확인은 먼저 php -v로 현재 PHP 버전을 확인하는 것입니다. 여기서 PHP 5.5 또는 5.6이 아니라면, 설치 절차를 진행해도 정상 동작하지 않습니다.
설치 전에 먼저 확인해야 할 조건
이 작업은 최신 CentOS 운영 환경을 위한 일반적인 PHP 설정이 아니라, 레거시 PHP 유지보수에 가까운 작업입니다. 따라서 설치에 들어가기 전에 현재 PHP 버전, PHP 설치 방식, 확장 디렉터리 경로를 먼저 확인해야 합니다. 패키지 저장소 설치인지, 직접 컴파일인지, 제어판 환경이 섞여 있는지에 따라 모듈 경로가 달라질 수 있기 때문입니다.
먼저 아래 두 명령으로 버전과 확장 경로를 확인합니다.
php -v
php -i | grep extension_dir
php -v에서는 현재 PHP가 5.5 또는 5.6인지 확인하고, php -i | grep extension_dir에서는 .so 모듈을 복사해야 할 위치를 확인합니다.
패키지 설치 환경에서는 /usr/lib64/php/modules처럼 표시되는 경우가 많고, 직접 컴파일 환경에서는 다른 경로가 나올 수 있습니다.
결과 확인은 extension_dir에 실제 쓰기 가능한지, 그리고 CLI에서 보는 PHP와 웹서버가 사용하는 PHP가 같은 계열인지까지 함께 확인하는 것입니다. 설치 후 CLI는 되는데 웹에서만 오류가 나는 경우는 이 경로 차이에서 자주 생깁니다.
CentOS에서 Zend Guard Loader 설치하는 방법
이 방법은 PHP 5.5 또는 PHP 5.6이 이미 설치된 서버를 기준으로 합니다.
Zend 공식 안내 기준으로 Zend Guard 7은 PHP 5.5·5.6용이고, Guard Loader는 Zend Guard로 인코딩된 파일을 실행하는 서버마다 설치되어야 합니다. 따라서 로더 파일은 현재 서버의 PHP 버전에 정확히 맞는 것을 사용해야 합니다.
1. 현재 PHP 버전 확인
가장 먼저 해야 할 일은 서버 PHP 버전 확인입니다.
php -v
여기서 확인할 기준은 아래와 같습니다.
- PHP 5.5 또는 5.6이면 Zend Guard 7 Loader 대상
- PHP 5.3 또는 5.4이면 Zend Guard 6 Loader 대상
- PHP 7 이상이면 공식 지원 범위 밖이라 설치를 진행해도 정상 동작을 기대하기 어렵습니다.
같이 확인해두면 좋은 값은 확장 모듈 디렉터리입니다.
php -i | grep extension_dir
이 명령으로 나오는 경로가 나중에 ZendGuardLoader.so를 둘 위치 후보입니다. 공식 문서도 PHP 버전에 맞는 ZendGuardLoader.so를 찾은 뒤 zend_extension=<full_path_to_ZendGuardLoader.so> 형태로 로드하라고 안내합니다.
2. Zend Loader 패키지 준비
Zend 공식 다운로드 페이지에서 현재 PHP 버전과 OS 아키텍처에 맞는 Loader 패키지를 내려받아야 합니다. Zend Guard 7 릴리스 노트에는 Linux에서 다운로드한 tar.gz 파일을 풀어서 사용하라고 되어 있습니다.
보통 서버에서는 로컬 PC에서 받아서 scp로 올리거나, 서버에서 직접 다운로드합니다.
- Zend Guard 7 Loader : zend-loader-php5.6-linux-x86_64_update1.tar.gz
- Zend Guard 6 Loader : ZendGuardLoader-php-5.3-linux-glibc23-x86_64.tar.gz
압축 해제
tar xzvf ZendGuardLoader-php-5.6-linux-glibc23-x86_64.tar.gz
3. 압축 푼 뒤 .so 파일 위치 확인
압축을 풀면 보통 버전별 디렉터리 안에 ZendGuardLoader.so가 들어 있습니다. 먼저 구조를 확인합니다.
find . -name 'ZendGuardLoader.so'
여기서 중요한 건 현재 서버 PHP 버전과 일치하는 파일을 써야 한다는 점입니다.
4. extension_dir 경로에 모듈 복사
앞에서 확인한 extension_dir 경로가 예를 들어 /usr/lib64/php/modules라면, 그 위치로 복사합니다.
cp /root/ZendGuardLoader.so /usr/lib64/php/modules/
실제 파일 위치가 다른 경우에는 find 결과를 넣으면 됩니다. 예를 들면
cp /root/ZendGuardLoader-php-5.6-linux-glibc23-x86_64/ZendGuardLoader.so /usr/lib64/php/modules/
복사 후 권한도 한 번 확인합니다.
ls -l /usr/lib64/php/modules/ZendGuardLoader.so
이 단계의 핵심은 모듈이 실제 PHP가 읽는 확장 경로 안에 있어야 한다는 점입니다.
5. ini 파일 생성
이제 Loader를 읽게 해야 합니다. CentOS의 패키지형 PHP 환경이라면 보통 /etc/php.d/ 아래에 별도 ini 파일을 만드는 방식이 관리하기 쉽습니다.
vi /etc/php.d/ZendGuardLoader.ini
파일 내용은 아래처럼 넣습니다.
[Zend Guard Loader]zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
이 값들은 Zend 공식 문서의 기본 예시와 같습니다.
vi 저장이 익숙하지 않다면 vi 대신 아래처럼 한 번에 생성해도 됩니다.
cat > /etc/php.d/ZendGuardLoader.ini <<'EOF'
[Zend Guard Loader]
zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
EOF
6. 로드 순서 확인
이 부분은 놓치기 쉽습니다. 공식 문서에는 Zend Debugger는 Guard Loader 뒤에 로드, ionCube Loader는 Guard Loader보다 먼저 로드해야 한다고 적혀 있습니다. 서버에 ionCube나 Zend Debugger가 이미 있다면 ini 파일 이름 순서까지 확인하는 게 안전합니다.
php --ini
현재 로드 파일 목록을 보려면 /etc/php.d/ 아래 파일명이 숫자 접두어로 정렬되는 환경이라면, 충돌이 있을 때는 예를 들어 이렇게 이름을 조정합니다.
mv /etc/php.d/ZendGuardLoader.ini /etc/php.d/00-ZendGuardLoader.ini
다만 이 부분은 서버별 환경 차이가 있어, 실제로는 php –ini 출력 순서를 보고 판단하는 게 정확합니다.
7. PHP 설정 문법 점검
서비스 재시작 전에 설정이 깨지지 않았는지 먼저 봅니다.
php -v
정상이라면 버전 정보가 출력되고, 문제가 있으면 시작 단계에서 경고가 보일 수 있습니다. 추가로 모듈 경로가 맞는지 확인하려면 아래 명령어를 실행합니다.
php -m | grep -i zend
8. 웹 서버 또는 PHP-FPM 재시작
환경에 따라 재시작 대상이 다릅니다.
Apache(mod_php) 환경
systemctl restart httpd
systemctl status httpd --no-pager
PHP-FPM 환경
systemctl restart php-fpm
systemctl status php-fpm --no-pager
Nginx
systemctl reload nginx
Zend 공식 문서는 설치 후 웹 서버를 재시작하라고 안내합니다.
9. 적용 확인
CLI에서 먼저 확인합니다.
php -v
정상 적용이면 출력 안에 Zend Guard Loader가 로드됐다는 문구가 보여야 합니다.
10. 자주 나는 오류와 점검 순서
1. Failed loading … ZendGuardLoader.so
가장 흔한 경우는 PHP 버전 불일치 또는 아키텍처 불일치입니다. 공식 자료상 Guard 7은 PHP 5.5·5.6용이고, Guard 6은 PHP 5.3·5.4용입니다. 버전이 안 맞으면 로드 실패 가능성이 큽니다.
php -v
file /usr/lib64/php/modules/ZendGuardLoader.so
uname -m
2. CLI는 되는데 웹만 안 됨
CLI와 웹서버가 서로 다른 php.ini 또는 다른 확장 경로를 볼 수 있습니다. 이때는 둘 다 비교해야 합니다.
php --ini
php -i | grep extension_dir
웹에서는 phpinfo()로 같은 항목을 비교합니다.
3. ionCube와 같이 쓸 때 충돌
공식 문서 기준으로 ionCube Loader는 Zend Guard Loader보다 먼저, Zend Debugger는 뒤에 와야 합니다.
4. 설치는 됐는데 프로그램이 여전히 안 열림
Zend Guard Loader는 Zend Guard로 인코딩된 파일을 실행하는 용도입니다. 프로그램 자체의 라이선스, 인코딩 버전, 별도 요구 모듈 문제는 따로 남을 수 있습니다.
CUI 기준 전체 명령만 빠르게 모아보면
php -v
php -i | grep extension_dir
cd /root
tar xzvf ZendGuardLoader-php-5.6-linux-glibc23-x86_64.tar.gz
find . -name 'ZendGuardLoader.so'
cp /root/ZendGuardLoader.so /usr/lib64/php/modules/
cat > /etc/php.d/ZendGuardLoader.ini <<'EOF'
[Zend Guard Loader]
zend_extension=/usr/lib64/php/modules/ZendGuardLoader.so
zend_loader.enable=1
zend_loader.disable_licensing=0
zend_loader.obfuscation_level_support=3
EOF
php --ini
php -v
php -m | grep -i zend
systemctl restart httpd
# 또는
systemctl restart php-fpm
php -v



