본 문서는 RockyLinux 10 웹서버 구축 시리즈 3편으로, Valkey를 설치하고 PHP 세션 저장소로 사용하는 방법을 정리한 글입니다. 이전 글에서 PHP 8.5와 PHP-FPM을 설치했다면, 이번 단계에서는 PHP의 기본 파일 세션 방식을 Valkey 기반 세션 방식으로 변경합니다.
일반적인 소규모 사이트에서는 PHP 기본 세션 저장 방식인 파일 세션만으로도 큰 문제가 없습니다. 하지만 접속자가 많아지거나, 게시판·CMS·관리자·회원 시스템처럼 세션 사용량이 많은 서비스에서는 파일 세션이 병목이 될 수 있습니다. 특히 여러 대의 웹서버로 확장하는 구조에서는 파일 기반 세션을 그대로 사용하기 어렵습니다.
Valkey는 Redis에서 파생된 오픈소스 인메모리 키-값 저장소입니다. Redis와 호환되는 프로토콜을 제공하기 때문에 PHP의 Redis 확장을 통해 세션 저장소로 사용할 수 있습니다. 이 글에서는 RockyLinux 10 환경에서 Valkey를 설치하고, PHP 세션을 Valkey에 저장하도록 설정합니다.
1. PHP 파일 세션 방식의 한계
PHP는 기본적으로 세션 데이터를 서버의 파일 시스템에 저장합니다. 보통 /var/lib/php/session 같은 디렉터리에 세션 파일이 생성됩니다. 사용자가 로그인하거나 장바구니, 관리자 인증, CSRF 토큰 등을 사용할 때 PHP는 세션 ID에 해당하는 파일을 읽고 씁니다.
파일 세션은 구조가 단순하고 별도의 서버 구성이 필요 없다는 장점이 있습니다. 하지만 트래픽이 많아질수록 다음과 같은 문제가 생길 수 있습니다.
파일 I/O 증가: 모든 세션 읽기와 쓰기가 디스크 접근으로 처리됩니다.
세션 파일 증가: 접속자가 많거나 세션 만료 시간이 길면 세션 파일이 급격히 늘어납니다.
웹서버 확장 어려움: 여러 대의 웹서버를 사용할 경우 각 서버의 로컬 세션 파일이 서로 공유되지 않습니다.
락 경합: 동일 세션에 대한 요청이 동시에 들어오면 세션 파일 락으로 인해 요청이 지연될 수 있습니다.
따라서 접속자가 많은 사이트, 관리자 기능이 많은 CMS, 여러 서버로 확장할 가능성이 있는 서비스라면 세션 저장소를 파일이 아닌 인메모리 저장소로 분리하는 것이 좋습니다.
2. Valkey를 사용하는 이유
Valkey는 메모리 기반으로 동작하는 키-값 저장소입니다. PHP 세션처럼 작은 데이터를 빠르게 읽고 쓰는 용도에 적합합니다. Redis와 호환되는 방식으로 사용할 수 있기 때문에 기존 Redis 세션 구성과 거의 동일하게 적용할 수 있습니다.
PHP 세션 저장소로 Valkey를 사용하면 다음과 같은 장점이 있습니다.
빠른 세션 처리: 세션 데이터를 디스크가 아니라 메모리에서 읽고 씁니다.
중앙 세션 저장소 구성 가능: 웹서버가 여러 대여도 하나의 Valkey 서버를 바라보게 구성할 수 있습니다.
세션 만료 관리 용이: TTL 기반으로 만료 처리가 가능해 불필요한 세션 데이터를 자동 정리할 수 있습니다.
운영 확장성: 이후 캐시, 임시 데이터, 속도 제한, 큐 보조 저장소 등으로도 활용할 수 있습니다.
단, Valkey는 메모리 기반 저장소이므로 서버 메모리 사용량과 데이터 보존 정책을 고려해야 합니다. 세션은 영구 보존이 필요한 데이터가 아니므로 Valkey에 저장하기 적합하지만, 중요한 업무 데이터는 별도 DB에 저장해야 합니다.
3. Valkey 설치
RockyLinux 10에서 Valkey 패키지를 설치합니다. Valkey는 Redis 호환 서버로 동작하므로 기본 포트는 일반적으로 6379를 사용합니다.
dnf install -y valkey설치가 완료되면 설정 파일을 확인합니다.
vi /etc/valkey/valkey.conf단일 서버 내부에서 PHP 세션 저장소로만 사용할 경우에는 외부 접속을 열 필요가 없습니다. 기본적으로 127.0.0.1에 바인딩되어 있는지 확인하는 것이 좋습니다.
bind 127.0.0.1
port 6379외부 서버에서 접속해야 하는 구조가 아니라면 Valkey를 외부에 공개하지 않는 것이 안전합니다. 세션 저장소가 외부에 노출되면 인증 우회, 세션 탈취, 데이터 유출 등의 위험이 발생할 수 있습니다.
4. Valkey 서비스 등록 및 시작
Valkey가 부팅 시 자동으로 실행되도록 등록하고 서비스를 시작합니다.
systemctl enable valkey
systemctl start valkey
systemctl status valkey서비스가 정상적으로 실행되면 active (running) 상태가 표시됩니다. 로그를 확인해야 할 경우에는 아래 명령을 사용합니다.
journalctl -u valkey -f5. Valkey 동작 확인
Valkey 서버가 정상적으로 응답하는지 확인합니다. 패키지 설치 시 CLI 도구가 함께 설치되어 있다면 아래 명령으로 테스트할 수 있습니다.
valkey-cli ping정상 응답은 다음과 같습니다.
PONG만약 valkey-cli 명령이 없다면 Redis 호환 CLI인 redis-cli가 설치되어 있는지 확인하거나, Valkey 패키지 구성을 다시 확인합니다.
6. PHP Redis 확장 설치
PHP에서 Valkey를 세션 저장소로 사용하려면 Redis 프로토콜을 사용할 수 있는 PHP 확장이 필요합니다. Remi 저장소를 통해 PHP를 설치했다면 php-pecl-redis6 패키지를 설치합니다.
dnf install -y php-pecl-redis6설치 후 PHP에서 redis 확장이 로드되는지 확인합니다.
php -m | grep redis또는 확장 정보를 자세히 확인하려면 아래 명령을 사용합니다.
php --ri redis정상적으로 설치되었다면 Redis extension 관련 정보가 출력됩니다. Valkey를 사용하더라도 PHP 확장 이름은 Redis입니다. 이는 Valkey가 Redis 호환 프로토콜을 사용하기 때문입니다.
7. PHP 세션 설정 변경
PHP의 세션 저장 방식을 파일에서 Redis 방식으로 변경합니다. 이전 2편에서 만든 /etc/php.d/z-php.ini 파일에 설정을 추가합니다. 이 파일은 알파벳 순서상 뒤쪽에서 로드되기 때문에 기본 설정을 덮어쓰기 좋습니다.
vi /etc/php.d/z-php.ini아래 내용을 추가합니다.
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"이 설정은 PHP 세션 데이터를 127.0.0.1:6379에 실행 중인 Valkey 서버에 저장하겠다는 의미입니다. 같은 서버 안에서만 사용하는 구조라면 이 방식이 가장 단순합니다.
세션 만료 시간을 명시적으로 조정하고 싶다면 아래 설정도 함께 검토할 수 있습니다.
session.gc_maxlifetime = 28800
session.cookie_lifetime = 0session.gc_maxlifetime는 서버 측 세션 데이터의 최대 유효 시간을 의미합니다. 위 예시는 8시간입니다. session.cookie_lifetime = 0은 브라우저가 종료될 때 세션 쿠키가 사라지는 방식입니다. 로그인 유지 기능을 별도로 구현하는 경우에는 이 값을 서비스 정책에 맞게 조정해야 합니다.
8. PHP-FPM Pool 설정에서 중복 설정 제거
PHP-FPM Pool 설정 파일에 세션 설정이 중복으로 들어가 있으면 어느 설정이 최종 적용되는지 혼란이 생길 수 있습니다. /etc/php-fpm.d/www.conf 파일을 확인합니다.
vi /etc/php-fpm.d/www.conf파일 하단에 아래와 같은 설정이 있다면 주석 처리하거나 제거합니다.
;php_value[session.save_handler] = redis
;php_value[session.save_path] = "tcp://127.0.0.1:6379"세션 설정은 z-php.ini 한 곳에서 관리하는 편이 운영상 단순합니다. 여러 위치에서 같은 값을 설정하면 장애 발생 시 확인해야 할 지점이 늘어납니다.
9. PHP-FPM 재시작
PHP 설정과 확장 설치가 끝났다면 PHP-FPM을 재시작합니다.
systemctl restart php-fpm
systemctl status php-fpmPHP-FPM이 정상적으로 재시작되지 않는다면 설정 문법 오류나 확장 로드 문제일 수 있습니다. 이 경우 아래 명령으로 PHP 설정을 확인합니다.
php --ini
php -i | grep "session.save"session.save_handler가 redis로 표시되고, session.save_path가 tcp://127.0.0.1:6379로 표시되면 설정이 적용된 것입니다.
10. PHP 세션 저장 테스트
실제로 PHP 세션이 Valkey에 저장되는지 확인하기 위해 간단한 테스트 파일을 만들 수 있습니다. 웹 루트에 임시 테스트 파일을 생성합니다.
<?php
session_start();
if (!isset($_SESSION['test_count'])) {
$_SESSION['test_count'] = 0;
}
$_SESSION['test_count']++;
echo 'Session ID: ' . session_id() . '<br>';
echo 'Count: ' . $_SESSION['test_count'] . '<br>';
echo 'Handler: ' . ini_get('session.save_handler') . '<br>';
echo 'Path: ' . ini_get('session.save_path') . '<br>';브라우저에서 해당 파일에 접속한 뒤 새로고침할 때마다 Count 값이 증가하면 세션이 정상적으로 동작하는 것입니다.
Valkey CLI에서도 세션 키가 생성되었는지 확인할 수 있습니다.
valkey-cli keys '*'운영 서버에서는 keys '*' 명령을 자주 사용하지 않는 것이 좋습니다. 키가 많은 환경에서는 부하를 줄 수 있습니다. 운영 환경에서는 scan 명령을 사용하는 것이 더 안전합니다.
valkey-cli scan 011. 세션 TTL 확인
세션 키가 생성되었다면 TTL이 정상적으로 부여되는지 확인합니다. 먼저 키 목록을 확인한 뒤 특정 키의 TTL을 조회합니다.
valkey-cli scan 0
valkey-cli ttl 세션키이름TTL 값이 초 단위로 표시되면 만료 시간이 설정되어 있다는 의미입니다. -1이 표시되면 만료 시간이 없는 키이고, -2는 키가 존재하지 않는다는 의미입니다.
PHP 세션은 보통 session.gc_maxlifetime 설정을 기준으로 만료 시간이 관리됩니다. 장시간 로그인 유지가 필요한 서비스라면 세션 정책과 쿠키 정책을 함께 설계해야 합니다.
12. Valkey 메모리 사용량 확인
세션 저장소는 메모리를 사용하므로 운영 중 메모리 사용량을 주기적으로 확인해야 합니다.
valkey-cli info memory여기서 used_memory_human, used_memory_peak_human 등의 값을 확인할 수 있습니다. 세션 데이터가 과도하게 쌓이면 메모리 사용량이 증가할 수 있으므로 세션 만료 시간과 접속자 수를 고려해 설정해야 합니다.
필요하다면 /etc/valkey/valkey.conf에서 최대 메모리와 메모리 정책을 설정할 수 있습니다.
maxmemory 512mb
maxmemory-policy volatile-lruvolatile-lru는 만료 시간이 설정된 키 중에서 오래 사용되지 않은 키를 우선 제거하는 정책입니다. 세션 저장소 용도에서는 만료 시간이 있는 키를 대상으로 제거하는 정책을 검토할 수 있습니다. 단, 메모리 부족으로 세션이 제거되면 사용자가 로그아웃될 수 있으므로 서버 규모에 맞게 신중히 설정해야 합니다.
13. 보안 설정 시 주의사항
Valkey를 PHP 세션 저장소로 사용할 때 가장 중요한 것은 외부 노출을 막는 것입니다. 내부 단일 서버에서만 사용할 경우 bind 127.0.0.1 설정을 유지하고, 방화벽에서도 6379 포트를 외부에 열지 않아야 합니다.
외부 포트 개방 금지: 6379 포트를 공인망에 노출하지 않습니다.
bind 확인: 내부 사용만 한다면
127.0.0.1로 바인딩합니다.권한 분리: 운영 규모가 커지면 별도 서버 또는 별도 네트워크 대역에서 접근을 제한합니다.
민감 데이터 저장 금지: 세션에는 필요한 최소 정보만 저장합니다. 비밀번호, 인증 토큰 원문, 개인정보 원문은 저장하지 않는 것이 좋습니다.
14. 장애 발생 시 확인할 항목
PHP 세션이 정상적으로 유지되지 않는다면 다음 항목을 순서대로 확인합니다.
Valkey 서비스 상태:
systemctl status valkey로 실행 여부를 확인합니다.PHP Redis 확장 로드 여부:
php -m | grep redis로 확장 로드를 확인합니다.PHP-FPM 재시작 여부: 설정 변경 후
systemctl restart php-fpm을 실행했는지 확인합니다.세션 설정 적용 여부:
php -i | grep "session.save"로 최종 설정값을 확인합니다.Valkey 접속 가능 여부:
valkey-cli ping으로 응답을 확인합니다.
15. 전체 명령어 요약
실제 작업 시 빠르게 참고할 수 있도록 주요 명령어를 정리하면 다음과 같습니다.
dnf install -y valkey
vi /etc/valkey/valkey.conf
systemctl enable valkey
systemctl start valkey
systemctl status valkey
valkey-cli ping
dnf install -y php-pecl-redis6
php -m | grep redis
php --ri redis
vi /etc/php.d/z-php.inisession.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"systemctl restart php-fpm
php -i | grep "session.save"마무리
PHP의 기본 파일 세션은 간단하고 편리하지만, 트래픽이 많은 사이트나 여러 대의 웹서버로 확장할 가능성이 있는 서비스에서는 한계가 있습니다. Valkey를 세션 저장소로 사용하면 세션 처리 속도를 높이고, 이후 서버 확장 구조에도 대응하기 쉬워집니다.
이번 글에서는 RockyLinux 10 환경에서 Valkey를 설치하고, PHP Redis 확장을 통해 PHP 세션 저장소를 Valkey로 변경하는 방법을 정리했습니다.