Ubuntu 14.04에서 Redis 서버를 PHP용 세션 핸들러로 설정하는 방법


소개

Redis는 오픈 소스 키-값 캐시 및 스토리지 시스템으로, 해시, 목록, 세트, 비트맵 등과 같은 여러 데이터 유형에 대한 고급 지원을 위해 데이터 구조 서버라고도 합니다. 또한 클러스터링을 지원하므로 가용성이 높고 확장 가능한 환경에 자주 사용됩니다.

이 튜토리얼에서는 Ubuntu 14.04에서 실행되는 PHP 애플리케이션의 세션 핸들러로 사용할 외부 Redis 서버를 설치하고 구성하는 방법을 살펴봅니다.

세션 핸들러는 세션에 저장된 데이터를 저장하고 검색하는 역할을 합니다. 기본적으로 PHP는 이를 위해 파일을 사용합니다. 모든 애플리케이션 노드가 중앙 서버에 연결하여 세션 정보를 공유하는 로드 밸런서를 생성하는 데 외부 세션 핸들러를 사용할 수 있습니다.

전제 조건

이 자습서에서는 두 개의 서로 다른 서버로 작업할 것입니다. 보안 및 성능상의 이유로 두 Droplet이 사설 네트워킹이 활성화된 동일한 데이터 센터에 위치하는 것이 중요합니다. 다음이 필요합니다.

  • Ubuntu 14.04에서 LEMP를 실행하는 PHP 웹 서버 - 이 서버를 웹이라고 합니다
  • Redis가 설치될 깨끗한 두 번째 Ubuntu 14.04 서버 - 이 서버를 redis라고 합니다.

sudo 권한이 있는 일반 사용자로서 두 서버에 대한 적절한 SSH 액세스가 필요합니다.

Redis 서버의 경우 2단계를 사용할 수도 있습니다.

1단계 - Redis 서버 설치

가장 먼저 해야 할 일은 redis Droplet에서 Redis 서버를 시작하고 실행하는 것입니다.

우리는 Chris Lea가 제공하는 신뢰할 수 있는 PPA 저장소와 함께 일반 Ubuntu 패키지 관리자를 사용할 것입니다. Redis의 안정적인 최신 버전을 확보하기 위해 필요합니다.

일반적인 보안 조언으로 신뢰할 수 있는 출처의 PPA만 사용해야 합니다.

먼저 다음을 실행하여 PPA 저장소를 추가합니다.

  1. sudo add-apt-repository ppa:chris-lea/redis-server

ENTER를 눌러 확인하십시오.

이제 패키지 관리자 캐시를 업데이트해야 합니다.

  1. sudo apt-get update

마지막으로 다음을 실행하여 Redis를 설치해 보겠습니다.

  1. sudo apt-get install redis-server

이제 Redis가 서버에 설치되어야 합니다. 설치를 테스트하려면 다음 명령을 시도하십시오.

  1. redis-cli ping

이렇게 하면 포트 6379의 localhost에서 실행 중인 Redis 인스턴스에 연결됩니다. 응답으로 PONG을 받아야 합니다.

2단계 - 외부 연결을 허용하도록 Redis 구성

기본적으로 Redis는 localhost에 대한 연결만 허용하므로 기본적으로 Redis가 설치된 서버 내부에서만 액세스할 수 있습니다. Redis 서버와 동일한 사설 네트워크에 있는 다른 서버에서 들어오는 연결을 허용하려면 이 구성을 변경해야 합니다.

가장 먼저 해야 할 일은 Redis 머신의 사설 네트워크 IP 주소를 찾는 것입니다. Redis 서버에서 다음 단계를 실행해야 합니다.

네트워크 인터페이스에 대한 정보를 얻으려면 ifconfig를 실행하십시오.

  1. sudo ifconfig

다음과 유사한 출력이 표시되어야 합니다.

Output
eth0 Link encap:Ethernet HWaddr 04:01:63:7e:a4:01 inet addr:188.166.77.33 Bcast:188.166.127.255 Mask:255.255.192.0 inet6 addr: fe80::601:63ff:fe7e:a401/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3497 errors:0 dropped:0 overruns:0 frame:0 TX packets:3554 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4895060 (4.8 MB) TX bytes:619070 (619.0 KB) eth1 Link encap:Ethernet HWaddr 04:01:63:7e:a4:02 inet addr:10.133.14.9 Bcast:10.133.255.255 Mask:255.255.0.0 inet6 addr: fe80::601:63ff:fe7e:a402/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:7 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:648 (648.0 B) TX bytes:578 (578.0 B)

eth1 인터페이스에 할당된 inet_addr을 찾습니다. 이 경우에는 10.133.14.9입니다. 이것은 나중에 웹 서버에서 redis 서버에 연결하는 데 사용할 IP 주소입니다.

선호하는 명령줄 편집기를 사용하여 /etc/redis/redis.conf 파일을 열고 bind 정의가 포함된 줄을 찾습니다. 다음과 같이 개인 네트워크 IP 주소를 라인에 추가해야 합니다.

  1. sudo vim /etc/redis/redis.conf
bind localhost 10.133.14.9

localhost 대신 127.0.0.1이 보이면 괜찮습니다. 이미 있는 것 뒤에 개인 IP를 추가하기만 하면 됩니다.

이제 변경 사항을 적용하려면 Redis 서비스를 다시 시작하기만 하면 됩니다.

  1. sudo service redis-server restart

원클릭 애플리케이션을 사용하여 Redis를 설치한 경우 서비스 이름은 redis-server 대신 redis가 됩니다. 다시 시작하려면 sudo service redis restart 를 실행해야 합니다.

이 변경으로 동일한 사설 네트워크 내의 모든 서버도 이 Redis 인스턴스에 연결할 수 있습니다.

3단계 - Redis 서버의 비밀번호 설정

Redis 설치에 추가 보안 계층을 추가하려면 서버 데이터에 액세스하기 위한 암호를 설정하는 것이 좋습니다. 이전 단계에서 동일한 구성 파일인 /etc/redis/redis.conf를 편집합니다.

  1. sudo vim /etc/redis/redis.conf

이제 requirepass가 포함된 줄의 주석을 제거하고 강력한 암호를 설정합니다.

requirepass yourverycomplexpasswordhere

변경 사항이 적용되도록 Redis 서비스를 다시 시작합니다.

  1. sudo service redis-server restart

4단계 - Redis 연결 및 인증 테스트

모든 변경 사항이 예상대로 작동하는지 테스트하려면 redis 머신 내부에서 Redis 서비스에 연결합니다.

  1. redis-cli -h 10.133.14.9
Output
10.133.14.9:6379>

여기서 host 매개변수를 지정하는 것이 필수 사항은 아니지만(localhost에서 연결하기 때문에) Redis 서비스가 개인 네트워크 인터페이스.

암호를 정의하고 이제 데이터에 액세스하려고 하면 AUTH 오류가 발생합니다.

  1. keys *
Output
(error) NOAUTH Authentication required.

인증하려면 AUTH 명령을 실행하여 /etc/redis/redis.conf 파일에서 정의한 것과 동일한 암호를 제공하기만 하면 됩니다.

  1. AUTH yourverycomplexpasswordhere

응답으로 OK를 받아야 합니다. 이제 다음을 실행하면:

  1. keys *

출력은 다음과 유사해야 합니다.

Output
(empty list or set)

이 출력은 Redis 서버가 비어 있음을 의미하며 웹 서버가 이 Redis 서버를 세션 핸들러로 사용하도록 아직 구성되지 않았기 때문에 정확히 예상한 것입니다.

다음 단계를 수행하는 동안 이 SSH 세션을 열어 두고 redis-cli에 연결해 둡니다. 세션 데이터가 올바른지 확인하기 위해 redis-cli 프롬프트로 돌아갑니다. 웹 서버에 필요한 변경을 한 후 제대로 저장됩니다.

5단계 - 웹 서버에 Redis 확장 프로그램 설치

다음 단계는 웹 서버에서 실행되어야 합니다. PHP Redis 확장을 설치해야 합니다. 그렇지 않으면 PHP가 Redis 서버에 연결할 수 없습니다.

먼저 다음을 실행하여 패키지 관리자 캐시를 업데이트합니다.

  1. sudo apt-get update

그런 다음 php5-redis 패키지를 설치합니다.

  1. sudo apt-get install php5-redis

이제 웹 서버에서 Redis에 연결할 수 있어야 합니다.

6단계 - 웹 서버에서 Redis를 기본 세션 핸들러로 설정

이제 웹 서버에서 php.ini 파일을 편집하여 PHP의 기본 세션 핸들러를 변경해야 합니다. 이 파일의 위치는 현재 스택에 따라 다릅니다. Ubuntu 14.04의 LAMP 스택의 경우 일반적으로 /etc/php5/apache2/php.ini입니다. Ubuntu 14.04의 LEMP 스택의 경우 경로는 일반적으로 /etc/php5/fpm/php.ini입니다.

기본 php.ini 파일의 위치가 확실하지 않은 경우 phpinfo() 함수를 사용하면 쉽게 찾을 수 있습니다. 웹 루트 디렉토리 안에 있는 info.php 파일에 다음 코드를 넣기만 하면 됩니다.

  1. <?php
  2. phpinfo();

브라우저에서 스크립트에 액세스할 때 "Loaded Configuration File\이 포함된 행을 찾으면 로드된 기본 php.ini의 정확한 위치를 찾아야 합니다.

info.php 파일에는 환경에 대한 민감한 정보가 포함되어 있으므로 나중에 제거하는 것을 잊지 마십시오.

php.ini 파일을 열고 session.save_handler가 포함된 줄을 검색합니다. 기본값은 파일입니다. redis로 변경해야 합니다.

LAMP 환경에서:

  1. sudo vim /etc/php5/apache2/php.ini

LEMP 환경에서:

  1. sudo vim /etc/php5/fpm/php.ini
[label /etc/php5/fpm/php.ini] 
session.save_handler = redis

이제 session.save_path가 포함된 줄을 찾아야 합니다. 주석을 제거하고 Redis 연결 문자열을 포함하도록 값을 변경합니다. 내용은 다음 형식을 따라야 합니다. tcp://IPADDRESS:PORT?auth=REDISPASSWORD

[label /etc/php5/fpm/php.ini] 
session.save_path = "tcp://10.133.14.9:6379?auth=yourverycomplexpasswordhere"

Redis를 구성할 때 비밀번호를 설정한 경우 매개변수 auth만 제공하면 됩니다.

파일을 저장하고 PHP 서비스를 다시 시작하십시오.

LAMP 환경에서:

  1. sudo service apache2 restart

LEMP 환경에서:

  1. sudo service php5-fpm restart

7단계 - Redis 세션 처리 테스트

이제 Redis에서 세션을 처리하려면 세션에 대한 정보를 저장하는 PHP 스크립트 또는 애플리케이션이 필요합니다. 카운터를 구현하는 간단한 스크립트를 사용할 것입니다. 페이지를 다시 로드할 때마다 인쇄된 숫자가 증가합니다.

웹 서버에 test.php라는 파일을 만들고 문서 루트 폴더 안에 넣습니다.

  1. sudo vim /usr/share/nginx/html/test.php

문서 루트 경로를 반영하도록 /usr/share/nginx/html을 변경하는 것을 잊지 마십시오.

  1. [label /usr/share/nginx/html/test.php]
  2. <?php
  3. //simple counter to test sessions. should increment on each page reload.
  4. session_start();
  5. $count = isset($_SESSION['count']) ? $_SESSION['count'] : 1;
  6. echo $count;
  • $_SESSION['count'] = ++$count;
  • 스크립트에 액세스하려면 브라우저에서 http://web/test.php를 가리킵니다. 페이지를 다시 로드할 때마다 숫자가 증가해야 합니다.

    이제 Redis 서버에 저장된 세션 정보가 있어야 합니다. 확인하려면 이전에 redis-cli를 사용하여 Redis 서비스에 연결했던 redis 머신의 SSH 세션으로 돌아갑니다. keys *를 사용하여 콘텐츠를 다시 가져옵니다.

    1. keys *

    그러면 다음과 유사한 출력이 표시됩니다.

    Output
    1) "PHPREDIS_SESSION:j9rsgtde6st2rqb6lu5u6f4h83"

    세션 정보가 Redis 서버에 저장되고 있음을 나타냅니다. 유사한 방식으로 추가 웹 서버를 Redis 서버에 연결할 수 있습니다.

    결론

    Redis는 PHP용 세션 핸들러로도 사용할 수 있는 강력하고 빠른 키-값 스토리지 서비스로, 세션 스토리지를 위한 분산 시스템을 제공하여 확장 가능한 PHP 환경을 지원합니다. PHP 애플리케이션 확장에 대한 자세한 내용은 수평적 PHP 애플리케이션 확장 문서를 참조하세요.