블로그로 돌아가기

Ubuntu 20.04에서 Redis를 사용한 PHP 속도 제한 구현: 튜토리얼

Ubuntu 20.04에서 Redis를 사용한 PHP 속도 제한 구현: 튜토리얼

Redis, 또한 Remote Dictionary Server라고도 불리는 오픈 소스 인메모리 데이터베이스입니다. 이는 서버의 RAM에서 실행되는 데이터 구조화된 스토리지 시스템으로, 가장 빠른 솔리드 스테이트 드라이브(SSD)보다 훨씬 빠릅니다. 그 결과, Redis는 응답성이 매우 뛰어나며 속도 제한(rate limiting)에 매우 적합합니다.

속도 제한(Rate limiting)은 사용자가 서버에 리소스를 요청할 수 있는 횟수를 제한합니다. 많은 서비스가 사용자가 너무 많은 부하로 서버를 과부하시키려고 하는 등의 서비스 남용을 막기 위해 속도 제한을 사용합니다. 예를 들어, PHP를 사용하여 웹 애플리케이션용 공개 API (Application Programming Interface)를 개발할 때는 속도 제한이 필요합니다. API를 대중에 공개할 때는 특정 시간 동안 개인이 작업을 반복할 수 있는 횟수를 제한하고 싶을 것이기 때문입니다. 시스템에 대한 권한이 없는 사용자가 시스템을 중단시킬 수도 있습니다.

속도 제한은 설정된 한도를 초과하는 사용자 요청을 거부함으로써 애플리케이션이 원활하게 작동하도록 합니다. 클라이언트 수가 많은 경우, 속도 제한은 각 사용자가 빠른 속도로 애플리케이션에 액세스할 수 있도록 허용하는 공정 사용 정책(fair-use policy)을 적용합니다. 또한 속도 제한은 서버의 혼잡을 줄여 대역폭 비용을 절약하는 데 도움이 될 수 있습니다.

다음과 같은 데이터베이스에서 사용자 활동을 추적함으로써 MySQL, 속도 제한 프로그램을 만드는 것이 가능할 수 있습니다. 하지만 이러한 데이터는 디스크에서 다운로드하여 정의된 한도와 비교하여 평가해야 하므로, 여러 사람이 시스템에 접속할 때 최종 결과는 확장성이 떨어질 수 있습니다. 이는 비효율적일 뿐만 아니라, 관계형 데이터베이스 관리 솔루션은 이러한 목적으로 구축되지 않았습니다.

Redis는 인메모리 데이터베이스로 작동하며 이 분야에서 신뢰성이 입증되었기 때문에 속도 제한기를 만드는 데 좋은 선택입니다. 이 튜토리얼에서는 Ubuntu 20.04에서 Redis를 사용하여 PHP 속도 제한을 구현하는.

단계를 안내해 드리겠습니다. 시작해 봅시다!

사전 요구 사항

이 튜토리얼을 따라 하려면 다음이 필요합니다:

1단계: PHP용 Redis 확장 설치

시작하기 전에 패키지 충돌을 방지하기 위해 리포지토리를 업데이트하겠습니다:

다음으로, php-redis 확장을 설치합니다. 이 패키지는 PHP 프로그램에서 Redis를 사용할 수 있게 해줍니다. 다음 sudo 명령을 실행하여 설치합니다. php-redis:

그 후, Apache 서버를 재시작하여 php-redis 라이브러리를 로드합니다:

다음 단계는 소프트웨어 인덱스의 정보를 업데이트하고 PHP용 Redis 라이브러리를 설치하는 것입니다. 그런 다음, 사용자의 IP 주소를 기반으로 액세스를 제한하는 PHP 리소스를 생성합니다.

2단계: 속도 제한을 위한 PHP 웹 리소스 생성

이 단계에서는 웹 서버의 루트 디렉터리( demo.php)에 /var/www/html/) 파일을 생성합니다. 이 파일은 대중에 공개되며, 사용자는 선호하는 웹 브라우저에서 해당 URL을 실행할 수 있습니다. 나중에 우리는 curl 명령을 사용하여 사용하려는 리소스의 접근성을 확인할 것입니다. 사용자는 15초 동안 샘플 리소스 파일에 3번 액세스할 수 있습니다. 최대 한도를 초과하는 시도는 오류 메시지를 발생시킵니다.

이 파일의 주요 기능은 Redis 서버에 크게 의존합니다. 파일의 PHP 코드는 사용자가 리소스에 처음 액세스할 때 사용자의 IP 주소에 따라 Redis 서버에 키를 생성합니다. 코드는 사용자가 리소스에 다시 방문할 때 사용자의 IP 주소를 Redis 서버에 저장된 키와 일치시키고, 키가 존재하면 값을 1씩 증가시킵니다. PHP 코드는 새 값이 최대 한도에 도달했는지 계속 확인합니다.

15초 후에 사용자의 IP 주소를 기반으로 하는 Redis 키가 만료되고, 웹 리소스에 대한 사용자의 방문 추적이 다시 시작됩니다. 다음 /var/www/html/demo.php 파일을 nano 텍스트 편집기로 엽니다:

그런 다음 모든 필드를 채워 Redis 클래스를 초기화합니다. 다음 REDIS_PASSWORD를 올바른 값으로 설정하는 것을 잊지 마십시오:

Redis->auth은 Redis 서버 일반 텍스트 인증을 지원합니다. 이는 로컬(localhost를 통해)에서 작업하는 경우 잘 작동하지만, 원격 Redis 서버를 다루는 경우에는 SSL 인증이 권장됩니다.

다음으로, 동일한 파일에서 다음 변수들을 기본값으로 설정합니다:

이 구문들을 자세히 살펴보겠습니다:

  • $max_calls_limit: 사용자는 이 최대 호출 제한을 초과하여 리소스에 액세스할 수 없습니다.

  • $time_period: 이는 시간 범위로 사용되며 초 단위로 계산됩니다. 여기서 사용자는 다음에 설정된 제한에 따라 리소스에 액세스할 수 있습니다. $max_calls_limit .

  • $total_user_calls: 사용자가 지정된 시간 동안 호출 제한 내에서 액세스를 요청한 횟수를 합산합니다.

그런 다음, 웹 페이지 액세스를 요청하는 사용자의 IP 주소를 가져오기 위해 다음 코드를 추가합니다:

데모로서, 이 코드는 사용자의 IP 주소별로 사용자의 행동을 기록합니다. 인증이 필요한 보호된 리소스가 서버에 있는 경우, 사용자 이름이나 액세스 토큰을 사용하여 사용자의 행동을 추적할 수 있습니다.

이 가이드에서는 시스템에 로그인하는 각 사용자에게 고유한 식별자(예: 고객 ID, 개발자 ID, 공급업체 ID 또는 사용자 ID)가 할당됩니다. 튜토리얼을 따라 진행하는 경우 $user_ip 주소 대신 이 ID들을 사용해야 합니다.

여기서는 개념을 설명하기에 사용자의 IP 주소로 충분합니다. 이전 코드 스니펫에서 사용자의 IP 주소를 가져왔으면 파일에 다음 코드 블록을 추가합니다:

다음은 이러한 구문에 대한 개요입니다:

  • if...else: 이 구문은 Redis 서버에 IP 주소로 정의된 키가 있는지 확인합니다.

    • 키를 찾을 수 없는 경우, if (!$redis->exists($user_ip_address)) {...}, 다음을 사용하여 키를 설정하고 값을 1로 정의할 수 있습니다. $redis->set($user_ip_address, 1).

  • $redis->expire($user_ip_address, $time_period): 지정된 시간에 키가 만료되도록 설정합니다. 이 튜토리얼에서는 다음과 같이 설정했습니다. 15 초.

  • Redis 키에서 사용자의 IP 주소를 찾을 수 없는 경우, 변수 $total_user_calls 을 다음과 같이 설정합니다. 1.

  • else {...}: 이 구문 블록은 $redis->INCR($user_ip_address); 명령을 사용하여 Redis 키의 값을 1만큼 증가시킵니다. 이는 키와 일치하는 각 IP 주소에 적용됩니다.

    • 참고: 이는 키가 이미 Redis 서버에 설정되어 있고 반복적인 요청으로 계산되는 경우에만 가능합니다.

  • $total_user_calls = $redis->get($user_ip_address): 이 구문은 Redis 서버에서 각 IP 주소 기반 키를 확인하여 총 요청 수를 가져옵니다.

  • if ($total_user_calls > $max_calls_limit) {... }..: 이 if 구문은 초과된 제한을 확인하는 데 사용됩니다. 초과한 경우, 다음을 사용하여 사용자에게 알립니다. echo "User" . $user_ip_address . " limit exceeded.";.

마지막으로, 다음 echo "Welcome" . $user_ip_address . "total calls made" . $total_user_calls . "in" . $time_period . "seconds"; 구문을 사용하여 지정된 기간 동안의 방문 횟수를 사용자에게 알립니다.

그 후, /var/www/html/demo.php 파일에 다음 코드 줄을 추가합니다:

수정을 완료한 후 /var/www/html/demo.php 파일을 저장하고 닫습니다. demo.php 웹 페이지에서 이제 사용자 속도를 제한하는 데 필요한 로직을 생성했습니다. 다음 단계에서 스크립트를 테스트해 보겠습니다.

Step 3: Run the Redis Rate Limiting Test

이 단계에서는 curl 명령을 사용하여 Step 2에서 작성한 웹 리소스를 요청합니다. 스크립트를 철저히 테스트하려면 리소스를 5번 요청하는 단일 명령을 실행합니다. 이는 demo.php 파일 끝. curl 지침을 다섯 번 실행하려면, ?[1-5] 값을 요청 끝에 사용하십시오.

다음 curl 명령을 아래에서 실행하십시오:

코드를 실행하면 다음과 같은 결과가 나타납니다:

보시다시피 처음 세 개의 요청은 문제없이 진행되었습니다. 그러나 네 번째와 다섯 번째 쿼리는 스크립트에 의해 속도가 제한되었습니다. Redis 서버가 사용자의 쿼리 속도를 제한하고 있을 가능성이 높습니다.

이 가이드의 아래에 나열된 두 변수에 대해 낮은 값을 지정했습니다:

프로덕션 환경에서 앱을 만들 때는 사람들이 얼마나 자주 사용할지 고려하여 더 큰 숫자를 사용하는 것을 고려할 수 있습니다.

이러한 숫자를 조정하기 전에 실시간 통계를 검토하는 것이 좋습니다. 이 예에서 서버 로그에 평균 사용자가 60초마다 애플리케이션을 1,000번 방문하는 것으로 나타나면, 이 숫자를 기준으로 삼아 제한 수준을 설정할 수 있습니다.

결론

이 가이드에서는 Ubuntu 20.04에서 PHP와 함께 Redis 서버를 활용하는 방법을 배웠습니다. 이 글에서는 Redis를 사용한 속도 제한 작동 방식을 보여주었지만, 웹 애플리케이션의 요구 사항에 맞게 맞춤 설정할 수 있습니다. 다음과 같은 실제 사례를 살펴보는 것을 권장합니다. Twitter의 최대 요청 제한, Google의 Custom Search JSON API 및 기타 유사한 문서를 통해 속도 제한에 대한 지식을 넓히고 다양한 시간 제한을 사용하여 직접 실험해 보십시오.

또한, Redis 및 PHP에 관한 다양한 학습 자료를 저희 블로그에서 확인하실 수 있습니다.:

즐거운 컴퓨팅 되세요!

author

Shreyas Patil

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.