최초 작성일 : 2025-07-30 | 수정일 : 2025-07-30 | 조회수 : 10 |
안녕하세요! 오늘은 Docker 기반의 Ubuntu, Apache, PHP 환경에서 Redis를 연동하여 PHP 세션을 관리하는 방법에 대해 알아보겠습니다.
웹 애플리케이션의 사용자가 늘어나거나 서버를 여러 대로 확장(Scale-out)할 때, 기본 파일 기반 세션은 한계를 드러냅니다. 이때 메모리 기반 스토리지인 Redis를 세션 핸들러로 사용하면, 여러 서버 간에 세션을 손쉽게 공유할 수 있고 속도 또한 비약적으로 향상됩니다.
이 글에서는 Docker 컨테이너 내부에서 Redis PHP 확장을 설치하고, CLI와 Apache 환경 모두에 설정을 적용하여 안정적으로 세션 공유를 구현하는 전체 과정을 안내합니다.
가장 먼저 PHP가 Redis와 통신할 수 있도록 redis.so 확장 모듈을 설치해야 합니다. Docker 컨테이너 내부에 접속하거나 Dockerfile에 아래 명령어를 추가하여 실행하세요.
Bash
# apt 패키지 리스트 업데이트 및 필수 패키지 설치
apt-get update && apt-get install -y \
php-pear \
php-dev \
gcc \
make \
autoconf
# pecl을 통해 redis 확장 모듈 설치
pecl install redis
💡 pecl 설치 후에는? pecl install redis 명령이 성공적으로 끝나면, PHP가 모듈을 인식할 수 있도록 설정을 활성화해야 합니다. 가장 깔끔한 방법은 phpenmod를 사용하는 것입니다. PHP 버전에 맞게 아래 명령어를 실행하세요. (예: PHP 7.4)
Bash
phpenmod -v 7.4 -s ALL redis
이 명령어는 php.ini 파일을 직접 건드리지 않고, 모듈별 설정 파일을 체계적으로 관리하게 해 주어 유지보수에 매우 유리합니다.
PHP는 실행 환경(CLI, Apache 등)에 따라 다른 php.ini 설정 파일을 로드합니다. 따라서 커맨드 라인(CLI)용과 웹 서버(Apache)용 설정을 반드시 각각 진행해야 합니다.
여기서는 php.ini를 직접 수정하는 대신, conf.d 디렉터리에 별도의 설정 파일을 생성하여 관리하는 모범 사례를 따릅니다.
Cron 작업이나 배치 스크립트 등 커맨드 라인에서 실행되는 PHP 스크립트가 Redis 세션을 사용하도록 설정합니다.
설정 파일 위치 확인:
Bash
php --ini
출력된 내용에서 Loaded Configuration File 항목을 통해 설정 파일의 전체 경로를 확인합니다. (예: /etc/php/7.4/cli/php.ini)
Redis 세션 설정 파일 생성: conf.d 디렉터리에 세션 설정 파일을 생성합니다. 파일 이름 앞의 숫자는 설정 파일의 로딩 순서를 의미합니다.
Bash
# /etc/php/7.4/cli/conf.d/30-redis-session.ini 파일 생성 및 설정 추가
echo 'session.save_handler = redis' > /etc/php/7.4/cli/conf.d/30-redis-session.ini
echo 'session.save_path = "tcp://127.0.0.1:6379"' >> /etc/php/7.4/cli/conf.d/30-redis-session.ini
사용자가 웹 브라우저를 통해 접속할 때 사용되는 PHP 환경에 Redis 세션을 적용합니다.
설정 파일 위치 확인:
⚠️ 주의: 잘못된 방법 터미널에서 php -i | grep "Loaded Configuration File" 명령어를 실행하는 것은 Apache용 설정이 아닌 CLI용 설정 경로를 보여주므로 절대 사용하면 안 됩니다.
가장 확실한 방법은 웹 서버에 <?php phpinfo(); ?> 코드를 담은 PHP 파일을 만들고, 웹 브라우저로 접속하여 Loaded Configuration File 항목을 직접 확인하는 것입니다. 일반적으로 경로는 /etc/php/7.4/apache2/php.ini 입니다.
Redis 세션 설정 파일 생성: CLI와 마찬가지로 Apache용 conf.d 디렉터리에도 설정 파일을 추가합니다.
Bash
# /etc/php/7.4/apache2/conf.d/30-redis-session.ini 파일 생성 및 설정 추가
echo 'session.save_handler = redis' > /etc/php/7.4/apache2/conf.d/30-redis-session.ini
echo 'session.save_path = "tcp://127.0.0.1:6379"' >> /etc/php/7.4/apache2/conf.d/30-redis-session.ini
💡 session.save_path IP 주소 127.0.0.1은 Redis가 웹 서버와 같은 컨테이너에 설치된 경우입니다. 만약 Redis가 별도의 Docker 컨테이너(예: my-redis-container)에 있다면 해당 컨테이너의 이름이나 IP 주소(tcp://my-redis-container:6379)를 사용해야 합니다.
모든 설정이 끝났으면 변경 사항을 시스템에 적용할 차례입니다.
Apache 재시작
Bash
service apache2 restart
설정 적용 확인
CLI: 터미널에서 php -m | grep redis 명령어로 redis 모듈이 보이는지 확인합니다.
Apache: phpinfo() 페이지를 새로고침하여 session 섹션의 session.save_handler 값이 redis로 변경되었는지 확인합니다.
이제 실제로 Redis에 세션 데이터가 저장되는지 테스트해 보겠습니다. 웹 서버 루트 디렉터리에 session_test.php 파일을 만들고 아래 코드를 작성하세요.
PHP
<?php
// 세션을 시작합니다. 설정이 올바르다면 이 세션은 Redis에 저장됩니다.
session_start();
// 'visit_count' 세션 변수를 가져와 1 증가시킵니다. 없으면 1로 초기화합니다.
$count = isset($_SESSION['visit_count']) ? $_SESSION['visit_count'] : 0;
$count++;
$_SESSION['visit_count'] = $count;
// 현재 서버의 호스트 이름과 방문 횟수를 출력합니다.
echo "<h1>PHP-Redis Session Test</h1>";
echo "Server Hostname: <b>" . gethostname() . "</b><br>";
echo "Your visit count on this server is: <b>" . $count . "</b>";
?>
웹 브라우저에서 session_test.php 파일에 접속한 뒤 새로고침할 때마다 visit count가 1씩 꾸준히 증가한다면 모든 설정이 성공적으로 완료된 것입니다.
구분 | 설정 파일 경로 (예시: PHP 7.4) | 설정 방법 |
---|---|---|
모듈 활성화 | /etc/php/7.4/mods-available/redis.ini | pecl install redis 후 phpenmod로 활성화 |
CLI 세션 | /etc/php/7.4/cli/conf.d/30-redis-session.ini | session.save_handler, save_path 설정 |
Apache 세션 | /etc/php/7.4/apache2/conf.d/30-redis-session.ini | session.save_handler, save_path 설정 |
Sheets로 내보내기
지금까지 Docker 환경에서 PHP와 Redis를 연동하여 세션을 관리하는 방법을 자세히 살펴보았습니다. 이 가이드를 통해 여러분의 PHP 애플리케이션은 더 빠르고 확장성 있는 세션 관리 시스템을 갖추게 되었습니다. 이제 여러 서버 인스턴스에서도 사용자의 로그인 상태를 일관되게 유지할 수 있습니다.