본문 바로가기

단축키

Prev이전 문서

Next다음 문서

단축키

Prev이전 문서

Next다음 문서

전제 조건

이 자습서에서는 두 개의 서버를 사용하여 세션 처리를 구성합니다. 따라하려면 다음이 필요합니다.

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

sudo이러한 각 서버에 구성된 권한이있는 루트가 아닌 사용자가 있어야 합니다. 또한 각 서버에 기본 방화벽이 실행되고 있다고 가정합니다. 두 서버에서 Ubuntu 16.04 초기 서버 설정 가이드 에 따라 이러한 요구 사항을 모두 설정할 수 있습니다 .

 

1 단계 : Redis 서버 및 클라이언트 소프트웨어 설치

첫 번째 단계는 두 컴퓨터 모두에 필요한 소프트웨어를 설치하는 것입니다. 우리의 redis 머신에는 Redis 서버가 필요합니다. 우리에  기계, 우리는 세션 처리 및 테스트하기위한 레디 스 명령 행 클라이언트에 대한 레디 스 PHP 확장을 설치합니다.

Redis 서버 설치

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

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

참고 : 일반적인 보안 조언으로 신뢰할 수있는 소스의 PPA 만 사용해야합니다.

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

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

ENTER확인하려면 누릅니다 .

다음으로 패키지 색인을 업데이트하고 다음을 입력하여 Redis 서버를 설치합니다.

  • sudo apt-get update 
  • sudo apt-get install redis-server

이제 Redis가 서버에 설치되고 실행되어야합니다. 다음을 입력하여 서비스가 실행 중이고 연결을 수락하는지 테스트합니다.

 redis-cli ping   
 
Redis server output

PONG

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

Redis 클라이언트 및 PHP 확장 설치

그런 다음  서버 에 Redis 명령 줄 클라이언트와 Redis PHP 확장을 설치 합니다. 연결 및 인증을 쉽게 테스트하기 위해 명령 줄 클라이언트를 사용할 것입니다. 세션 데이터를 저장하기 위해 PHP 확장을 사용할 것입니다.

다음을 입력하여 로컬 패키지 색인을 업데이트하고  서버에 소프트웨어를 설치합니다 .

  • sudo apt-get update 
  • sudo apt-get install redis-tools php-redis
 

이제 redis-cli테스트 할 서버에 대한 액세스 권한이 아직 없지만 도구에 대한 액세스 권한이 있어야합니다.

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

기본적으로 Redis는에서의 연결 만 허용하므로 localhost기본적으로 Redis가 설치된 서버 내부에서만 액세스 할 수 있습니다. 다른 서버에서 오는 연결을 허용하려면이 구성을 변경해야합니다.

Redis는 기본 암호화 옵션을 제공하지 않으며 신뢰할 수있는 피어의 격리 된 네트워크에 배포되었다고 가정합니다. 즉, 외부 연결을 안전하게 허용하려면 두 서버가 모두 격리 된 네트워크에 있어야하거나 다른 방식으로 두 서버 간의 트래픽을 보호해야합니다.

Redis가 격리 된 네트워크에 배포 된 경우…

서버가 격리 된 네트워크에서 작동하는 경우 격리 된 네트워크 IP 주소에 바인딩하도록 Redis의 구성 파일을 조정하기 만하면됩니다.

는에 레디 스 서버, 백업을하고, 레디 스 구성 파일을 엽니 다

  • sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
  •  sudo nano /etc/redis/redis.conf
 

bind줄을 찾아 Redis 서버의 격리 된 네트워크 IP 주소를 추가합니다.

/etc/redis/redis.conf
 bind 127.0.0.1 isolated_IP_address 
 

파일을 저장하고 닫습니다. 다음을 입력하여 서비스를 다시 시작합니다.

 sudo systemctl restart redis-server.service   
 

Redis 포트에 대한 액세스를 엽니 다.

 sudo ufw allow 6379   
 

이제 Redis는 격리 된 네트워크에서 연결을 수락 할 수 있습니다.

Redis가 격리 된 네트워크에 배포되지 않은 경우…

격리되지 않았거나 제어 할 수없는 네트워크의 경우 다른 수단을 통해 트래픽을 보호해야합니다. 다음을 포함하여 Redis 서버에 대한 트래픽을 보호하는 많은 옵션이 있습니다.

  • stunnel을 사용한 터널링 : redis 서버 에 들어오는 터널을 설정 하고  서버 에 나가는 터널을 설정해야 합니다. 웹 서버는 원격 Redis 서비스와 통신하기 위해 로컬 포트에 연결됩니다.
  • 스 파이핑 된 터널링 :  서버가 spiped클라이언트 시스템으로 작동해야합니다 . 각 서버에 systemd 단위 파일을 만들어야합니다. 웹 서버는 원격 Redis 서비스와 통신하기 위해 로컬 포트에 연결됩니다.
  • PeerVPN으로 VPN 설정 : 두 서버 모두 VPN에서 액세스 할 수 있어야합니다.  서버에 액세스 할 수 레디 스의 의 VPN IP 주소를 사용하여 서버를.

위의 방법 중 하나를 사용하여  서버에서 redis 서버 로의 보안 액세스를 구성 하십시오 .  머신이 원격 머신의 Redis 서비스에 연결하는 데 사용할 IP 주소와 포트를 알아야합니다 .

이 시점에서 웹 서버에서 Redis 서버에 안전하게 액세스 할 수 있어야합니다.

3 단계 : Redis 서버에 대한 암호 설정

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

 sudo nano /etc/redis/redis.conf   
 

requirepass지시문을 찾아 강력한 암호로 설정하십시오. Redis 트래픽은 외부 당사자로부터 안전해야하지만 이는 Redis 자체에 대한 인증을 제공합니다. Redis는 빠르고 암호 시도를 제한하지 않으므로 무차별 대입 시도로부터 보호하기 위해 강력하고 복잡한 암호를 선택합니다.

/etc/redis/redis.conf
 requirepass yourverycomplexpasswordhere 
 

완료되면 파일을 저장하고 닫습니다.

Redis 서비스를 다시 시작하여 변경 사항을 구현합니다.

 sudo systemctl restart redis-server.service   
 

이제 Redis 서버가 인증되지 않은 요청을 거부해야합니다.

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

변경 사항이 예상대로 작동하는지 테스트하려면  머신 에서 Redis 서비스에 연결하십시오 .

기본적으로 Redis 서버는 로컬 인터페이스에서 6379를 수신하지만 위에서 다룬 각 네트워크 보안 옵션은 외부 당사자를 위해 어떤 방식 으로든 기본값을 수정합니다. IP 주소 를 지정하는 옵션 과 원격 서비스에 연결하는 데 필요한 포트를 지정하는 옵션 과 redis-cli함께 클라이언트를 사용할 수 있습니다 . 기본 옵션 (각각 127.0.0.1 및 6379)을 사용하는 경우 둘 중 하나를 생략 할 수 있습니다.-h-p

사용하는 값은 네트워크 트래픽을 보호하는 데 사용한 방법에 따라 다릅니다.

  • 격리 된 네트워크 : Redis 서버의 격리 된 네트워크 IP 주소를 사용합니다. 기본 Redis 포트 (6379)가 사용되므로 언급 할 필요가 없습니다.redis-cli -h redis_isolated_IP
  • stunnel 또는 spiped : 원격 Redis 서비스로 터널링하는 로컬 포트를 사용합니다.redis-cli -p 8000
  • PeerVPN : Redis 서버의 VPN IP 주소 사용 :redis-cli -h 10.8.0.1

일반적인 형식은 다음과 같습니다.

 redis-cli -h ip_to_contact_redis -p port_to_contact_redis  
 

 서버 에서 원격 Redis 인스턴스에 연결할 수 있어야 합니다.

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

 127.0.0.1:6379 > keys *   
 
 (error) NOAUTH Authentication required. 
Web server output

(error) NOAUTH Authentication required.

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

 127.0.0.1:6379 > AUTH yourverycomplexpasswordhere  
  • AUTH yourverycomplexpasswordhere
 

자격 증명이 수락되었다는 응답 으로 OK 를 받아야합니다 .

 Web server output OK 
Web server output

OK

다음으로 Redis에 설정된 키를 나열합니다.

 127.0.0.1:6379 > keys *  
  • keys *
 

이것이 새로운 Redis 서버 인 경우 출력은 다음과 유사해야합니다.

 (empty list or set) 
Web server output

(empty list or set)

이 출력은 Redis 서버가 비어 있음을 의미합니다.  서버는 아직 세션 핸들러로이 레디 스 서버를 사용하도록 구성되어 있지 않습니다.

다음을 입력하여 명령 셸로 돌아갑니다.

 127.0.0.1:6379 > exit  
  • exit
 

인증으로 성공적으로 연결할 수 있는지 확인 했으므로 이제 Redis를 기본 세션 처리기로 만들 수 있습니다.

5 단계 : 웹 서버에서 Redis를 기본 세션 처리기로 설정

이제  서버 의 php.ini파일 을 편집하여 PHP의 기본 세션 핸들러를 변경해야합니다. 이 파일의 위치는 현재 스택에 따라 다릅니다.

기본 리포지토리에서 설치된 Ubuntu 16.04 의 LAMP 스택의 경우 일반적으로 /etc/php/7.0/apache2/php.ini. Ubuntu 16.04 의 LEMP 스택의 경우 경로는 일반적으로 /etc/php/7.0/fpm/php.ini. 이러한 위치 중 하나가 올바른지 확인한 경우 다음 섹션을 건너 뛰어도됩니다.

(선택 사항) 올바른 php.ini 파일 찾기

주 php.ini파일 의 위치가 확실하지 않은 경우 phpinfo()기능 을 사용하여 찾을 수 있습니다 . 문서 루트에서 라는  서버 에서 파일을 엽니 다.이 파일은 info.php기본적으로 /var/www/htmlLAMP 및 LEMP 용입니다.

 sudo nano /var/www/html/info.php  
  • sudo nano /var/www/html/info.php
 

파일에 다음 코드를 넣으십시오.

/var/www/html/info.php
 <?php phpinfo(); 
 

브라우저에서  서버의 도메인 이름 또는 IP 주소를 방문한 후 다음을 수행하십시오 /info.php.

 http://web_server_domain_or_IP/info.php  

“Loaded Configuration File”이 포함 된 행을 찾으면 php.ini로드 된 메인의 정확한 위치를 찾아야합니다 .

작업이 끝나면 파일을 제거합니다. 그러면 환경에 대한 중요한 정보가 표시됩니다.

 sudo rm /var/www/html/info.php  
  • sudo rm /var/www/html/info.php
 

이제 파일의 위치를 알았으므로 편집으로 이동할 수 있습니다.

구성 수정

php.ini편집 할 파일을 엽니 다 .

기본 구성에서 LAMP 스택을 사용하는 경우 필요한 명령은 다음과 같습니다.

 sudo nano /etc/php/7.0/apache2/php.ini  
  • sudo nano /etc/php/7.0/apache2/php.ini
 

기본 구성에서 LEMP 스택을 사용하는 경우 필요한 명령은 다음과 같습니다.

 sudo nano /etc/php/7.0/fpm/php.ini  
  • sudo nano /etc/php/7.0/fpm/php.ini
 

phpinfo()위에 설명 된 방법을 사용하여 다른 경로를 찾은 경우 대신 여기에서 해당 경로로 대체하십시오.

php.ini파일 내에서 session.save_handler. 기본값은 files입니다. redisRedis PHP 확장을 사용하려면 이를로 변경하십시오 .

php.ini
 session.save_handler = redis 
 

다음으로 session.save_path. 주석 처리를 제거하고 Redis 연결 문자열을 포함하도록 값을 변경해야합니다.

연결 문자열은 다음 형식을 사용하여 모두 한 줄로 구성 할 수 있습니다.

 tcp://IP_address:port?auth=redis_password  

다시 말하지만, 적절한 값은 선택한 보안 네트워킹 전략에 따라 달라집니다. redis-cli이전 에 명령에 제공 한 것과 동일한 값을 사용하십시오 . 사용 된 예를 들어, stunnel또는 spiped의는 session.save_path것 같이 보일 것입니다 :

php.ini
 session.save_path = "tcp://127.0.0.1:8000?auth=yourverycomplexpasswordhere" 
 

완료되면 파일을 저장하고 닫습니다. 다음으로 PHP 서비스를 다시 시작하여 변경 사항을 구현하십시오.

에서 램프 환경, 입력 :

 sudo systemctl restart apache2  
  • sudo systemctl restart apache2
 

에서 LEMP의 환경, 입력 :

 sudo systemctl restart php7.0-fpm  
  • sudo systemctl restart php7.0-fpm
 

이제 세션 핸들러로 Redis를 사용하도록 PHP를 구성해야합니다.

6 단계 : Redis 세션 처리 테스트

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

문서 루트 폴더 내에  서버 test.php에 이름이 지정된 파일을 만듭니다 .

 sudo nano /var/www/html/test.php  
  • sudo nano /var/www/html/test.php
 

내부에 다음 코드를 붙여 넣습니다.

/var/www/html/test.php
 <?php //simple counter to test sessions. should increment on each page reload. session_start(); $count = isset($_SESSION['count']) ? $_SESSION['count'] : 1; echo $count; $_SESSION['count'] = ++$count; 
 

파일을 저장하고 닫습니다.

스크립트에 액세스하려면 브라우저에  서버의 공용 IP 주소를 지정 /test.php하십시오.

 http://web_server_public_IP/test.php  

페이지를 다시로드 할 때마다 표시되는 숫자가 증가해야합니다.

이제 redis 컴퓨터 에서을 사용 redis-cli하여 세션을 엽니 다. 로컬 인스턴스에 연결하므로 IP 주소 나 포트를 제공 할 필요가 없습니다.

 http://web_server_public_IP/test.php 
  • redis-cli
 

Redis 비밀번호를 사용하여 인증 :

 127.0.0.1:6379 > AUTH yourverycomplexpasswordhere  
  • AUTH yourverycomplexpasswordhere
 
Redis server output

OK

 

 

이제 기존 키를 확인하십시오.

 127.0.0.1:6379 > keys *  
  • keys *
 

PHP 세션에 대한 새 항목이 표시되어야합니다.

 "PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800" 
Redis server output

1) "PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800"

키 값을 요청하면 현재 카운터 값을 볼 수 있습니다.

 127.0.0.1:6379 > get PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800  
  • get PHPREDIS_SESSION:2ofnvhhr6gdvp88u0c4e7kb800
 

Redis server output

 "count|i:6;" 
 

이것은 세션 정보가 Redis 서버에 저장되고 있음을 나타냅니다. 중앙 집중식 세션 관리를 위해 추가 웹 서버를 Redis 서버에 연결할 수 있습니다.

결론

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




List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
공지 에디터 업데이트+) GPT AI 기능을 포함하여 강력한 도구들을 사용해보세요 ⬆️ file 🍀플로버404 2024.04.16 400
공지 덕질 공통 이용규칙 및 안내 (업데이트중+ 2024-04-13) 😀컴덕824 2024.04.14 711
공지 1000P를 모으면 다이소 상품권 1000원을 신청할 수 있습니다. file Private 2024.02.14 2604
1153 잡담 한국에 7개의 애플스토어 생겼는데... 😀애플덕525 2024.03.08 610
1152 잡담 kt m 모바일 알뜰폰으로 바꾸려고 하는데 file 😀애플덕158 2024.03.08 636
1151 잡담 이놈의 애플페이 소식은 언제 나오려는지. 😀애플덕805 2024.03.08 713
1150 잡담 ios 17.4 정식 출시. file 😀애플덕878 2024.03.08 684
1149 잡담 국민카드 태그그립 출시하나보네요. file 😀애플덕578 2024.03.08 728
1148 잡담 유튜브 광고제거,PIP,백그라운드 재생 지원 사파리 확장앱 Vinegar file 😀애플덕938 2024.03.08 653
1147 애플 앱 관련 질문있습니다 😀애플덕714 2024.03.08 654
1146 잡담 벨킨 보조배터리 구매하려는데 사용기가 궁금합니다 file 😀애플덕877 2024.03.08 735
1145 잡담 대체 언제쯤 교통카드 가능할까요? 😀애플덕754 2024.03.08 707
1144 잡담 맥세이프 카드지갑이 나의 찾기에 등록이 안되네요. 😀애플덕518 2024.03.08 691
1143 잡담 Siri에 사용자가 받은 메시지를 지원되는 언어로 알리는 새로운 옵션이 추가됨 😀애플덕623 2024.03.08 658
1142 잡담 watchOS 10.4 나왔네요 file 😀애플덕365 2024.03.08 674
1141 잡담 17.4 올렸더니 네트워크 감도가 줄었네요 ㅠㅠ 😀애플덕754 2024.03.08 690
1140 잡담 아이패드 케어플러스에 키보드, 펜슬 등록 제한이 생겼나 보네요. 😀애플덕993 2024.03.08 701
1139 잡담 카메라 셔터음 작년 11월에 제도 개선한다고 하더니 아무말도 없네요 😀애플덕682 2024.03.08 653
1138 잡담 애플워치 에르메스 '가죽' 밴드 2024 봄 업데이트 file 😀애플덕127 2024.03.08 690
1137 잡담 에어팟 구입 질문 file 😀애플덕699 2024.03.08 714
1136 잡담 카카오 로그인과 관련한 신기한 버그가 있네요... 😀애플덕217 2024.03.08 630
1135 잡담 정품 맥세이프 카드지갑 교통카드 인식 질문 😀애플덕906 2024.03.08 708
1134 esim 사용량 확인 원래 이랬었나요? file 😀애플덕280 2024.03.08 620
Board Pagination Prev 1 2 3 4 5 6 7 8 9 10 ... 58 Next
/ 58