본문 바로가기

Laravel Reverb

번역일: 2026년 6월 20일

Laravel Reverb

소개

Laravel Reverb는 빠르고 확장 가능한 실시간 WebSocket 통신 기능을 Laravel 애플리케이션에 직접 제공합니다. Laravel의 기존 이벤트 브로드캐스팅 도구와도 자연스럽게 통합됩니다.

설치

install:broadcasting Artisan 명령어로 Reverb를 설치할 수 있습니다:

php artisan install:broadcasting

설정

install:broadcasting 명령어를 실행하면 내부적으로 reverb:install 명령어가 함께 실행되며, 적절한 기본값으로 Reverb가 설치됩니다. 설정을 변경하려면 환경 변수를 수정하거나, config/reverb.php 설정 파일을 직접 편집하면 됩니다.

애플리케이션 자격 증명

클라이언트가 Reverb에 연결하려면 서버와 클라이언트 간에 "애플리케이션" 자격 증명을 교환해야 합니다. 이 자격 증명은 서버 측에서 설정하며, 클라이언트 요청의 유효성을 검증하는 데 사용됩니다. 아래 환경 변수로 자격 증명을 정의하세요:

REVERB_APP_ID=my-app-id REVERB_APP_KEY=my-app-key REVERB_APP_SECRET=my-app-secret

허용 오리진

config/reverb.php 설정 파일의 apps 섹션에서 allowed_origins 값을 수정해 클라이언트 요청을 허용할 오리진을 지정할 수 있습니다. 목록에 없는 오리진에서 오는 요청은 거부됩니다. 모든 오리진을 허용하려면 *를 사용하세요:

'apps' => [ [ 'app_id' => 'my-app-id', 'allowed_origins' => ['example.co.kr'], // ... ] ]

추가 애플리케이션

기본적으로 Reverb는 설치된 애플리케이션 하나에 대한 WebSocket 서버를 제공합니다. 하지만 단일 Reverb 인스턴스로 여러 애플리케이션을 동시에 서비스하는 것도 가능합니다.

예를 들어, 하나의 Laravel 애플리케이션에서 Reverb를 통해 여러 서비스에 WebSocket 연결을 제공하고 싶다면, config/reverb.phpapps 배열에 여러 항목을 추가하면 됩니다:

'apps' => [ [ 'app_id' => 'my-app-one', // ... ], [ 'app_id' => 'my-app-two', // ... ], ],

SSL

대부분의 경우, 보안 WebSocket 연결(WSS)은 Nginx 같은 웹 서버에서 처리한 뒤 Reverb 서버로 프록시됩니다.

다만 로컬 개발 환경에서는 Reverb가 직접 보안 연결을 처리하도록 설정하는 것이 편리할 수 있습니다. Laravel Herd의 보안 사이트 기능을 사용하거나, Laravel Valet에서 secure 명령어를 실행했다면, Herd/Valet이 생성한 인증서를 그대로 사용할 수 있습니다. REVERB_HOST 환경 변수에 사이트 호스트명을 지정하거나, 서버 시작 시 --hostname 옵션을 명시하면 됩니다:

php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"

Herd와 Valet 도메인은 localhost로 해석되므로, 위 명령어를 실행하면 wss://laravel.test:8080으로 보안 WebSocket 연결이 가능해집니다.

인증서를 직접 지정하고 싶다면, config/reverb.phptls 옵션 배열에 설정을 추가하세요. PHP SSL 컨텍스트 옵션에서 지원하는 모든 옵션을 사용할 수 있습니다:

'options' => [ 'tls' => [ 'local_cert' => '/path/to/cert.pem' ], ],

서버 실행

reverb:start Artisan 명령어로 Reverb 서버를 시작합니다:

php artisan reverb:start

기본적으로 0.0.0.0:8080에서 시작되며, 모든 네트워크 인터페이스에서 접근 가능합니다.

호스트나 포트를 직접 지정하려면 --host, --port 옵션을 사용하세요:

php artisan reverb:start --host=127.0.0.1 --port=9000

또는 .env 파일에 REVERB_SERVER_HOSTREVERB_SERVER_PORT 환경 변수를 정의해도 됩니다.

NOTE

REVERB_SERVER_HOST / REVERB_SERVER_PORTREVERB_HOST / REVERB_PORT는 역할이 다릅니다. 전자는 Reverb 서버 프로세스가 실제로 바인딩할 호스트/포트이고, 후자는 Laravel이 브로드캐스트 메시지를 전송할 대상 주소입니다.

예를 들어, 프로덕션 환경에서 공개 도메인의 443 포트로 들어온 요청을 내부의 0.0.0.0:8080으로 라우팅한다면, 환경 변수를 다음과 같이 구성합니다:

REVERB_SERVER_HOST=0.0.0.0 REVERB_SERVER_PORT=8080 REVERB_HOST=ws.laravel.com REVERB_PORT=443

디버깅

성능 유지를 위해 Reverb는 기본적으로 디버그 정보를 출력하지 않습니다. 서버를 통과하는 데이터 흐름을 확인하고 싶다면 --debug 옵션을 추가하세요:

php artisan reverb:start --debug

재시작

Reverb는 장시간 실행되는 프로세스이므로, 코드 변경 사항을 반영하려면 reverb:restart 명령어로 서버를 재시작해야 합니다.

reverb:restart 명령어는 서버를 즉시 종료하지 않고, 모든 연결이 정상적으로 종료된 후에 프로세스를 멈춥니다. Supervisor 같은 프로세스 관리자를 사용 중이라면, 연결이 모두 종료된 직후 서버가 자동으로 재시작됩니다:

php artisan reverb:restart

모니터링

Reverb는 Laravel Pulse와 통합하여 서버의 연결 수와 메시지 처리량을 모니터링할 수 있습니다.

먼저 Pulse를 설치한 뒤, config/pulse.php 설정 파일의 recorders 항목에 Reverb 레코더를 추가하세요:

use Laravel\Reverb\Pulse\Recorders\ReverbConnections; use Laravel\Reverb\Pulse\Recorders\ReverbMessages; 'recorders' => [ ReverbConnections::class => [ 'sample_rate' => 1, ], ReverbMessages::class => [ 'sample_rate' => 1, ], ... ],

그런 다음, Pulse 대시보드에 각 레코더에 해당하는 카드를 추가합니다:

<x-pulse> <livewire:reverb.connections cols="full" /> <livewire:reverb.messages cols="full" /> ... </x-pulse>

연결 활동은 주기적인 폴링으로 기록됩니다. 대시보드에 정보가 올바르게 표시되려면 Reverb 서버에서 pulse:check 데몬을 실행해야 합니다. 수평 확장 구성을 사용하는 경우에는 서버 중 하나에서만 이 데몬을 실행하세요.

프로덕션 환경에서 Reverb 실행

WebSocket 서버는 장시간 실행되는 특성상, 서버 자원 대비 최적의 동시 연결 수를 처리하려면 몇 가지 환경 최적화가 필요합니다.

NOTE

사이트를 Laravel Forge로 관리하고 있다면, "Application" 패널에서 Reverb 통합을 활성화하는 것만으로 필요한 확장 설치와 연결 수 제한 조정 등 프로덕션 최적화가 자동으로 적용됩니다.

열린 파일 수 제한

각 WebSocket 연결은 클라이언트 또는 서버가 연결을 끊을 때까지 메모리에 유지됩니다. Unix 계열 환경에서는 각 연결이 파일 디스크립터 하나에 해당하며, 운영체제와 애플리케이션 수준 모두에서 열린 파일 수에 제한이 있습니다.

운영체제 수준

ulimit 명령어로 현재 허용된 열린 파일 수를 확인할 수 있습니다:

ulimit -n

/etc/security/limits.conf 파일을 수정해 이 값을 늘릴 수 있습니다. 예를 들어 forge 사용자의 최대 열린 파일 수를 10,000으로 늘리려면 다음과 같이 작성합니다:

# /etc/security/limits.conf forge soft nofile 10000 forge hard nofile 10000

이벤트 루프

Reverb는 내부적으로 ReactPHP 이벤트 루프를 사용해 WebSocket 연결을 관리합니다. 기본값은 stream_select 기반의 루프로, 별도 확장 설치가 필요 없지만 열린 파일 수가 1,024개로 제한됩니다. 1,000개를 초과하는 동시 연결을 처리해야 한다면 이 제한에서 자유로운 다른 이벤트 루프를 사용해야 합니다.

Reverb는 ext-uv가 설치되어 있으면 자동으로 해당 루프로 전환합니다. PECL을 통해 설치할 수 있습니다:

pecl install uv

웹 서버

대부분의 경우 Reverb는 외부에 직접 노출되지 않는 내부 포트에서 실행되므로, 트래픽을 Reverb로 전달하는 리버스 프록시를 설정해야 합니다. Reverb가 0.0.0.0:8080에서 실행 중이고 웹 서버로 Nginx를 사용한다면, 아래와 같이 설정합니다:

server { ... location / { proxy_http_version 1.1; proxy_set_header Host $http_host; proxy_set_header Scheme $scheme; proxy_set_header SERVER_PORT $server_port; proxy_set_header REMOTE_ADDR $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_pass http://0.0.0.0:8080; } ... }

WARNING

Reverb는 /app 경로에서 WebSocket 연결을 수신하고, /apps 경로에서 API 요청을 처리합니다. 이 두 URI를 모두 처리할 수 있도록 웹 서버를 설정해야 합니다. Laravel Forge를 사용한다면 기본적으로 올바르게 구성됩니다.

Nginx는 기본적으로 허용 연결 수를 제한합니다. 최대 10,000 연결을 허용하려면 nginx.conf 파일에서 worker_rlimit_nofileworker_connections 값을 수정하세요:

user forge; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; worker_rlimit_nofile 10000; events { worker_connections 10000; multi_accept on; }

이 설정은 프로세스당 최대 10,000개의 Nginx 워커를 허용하고, Nginx의 열린 파일 제한도 10,000으로 설정합니다.

포트

Unix 계열 운영체제는 서버에서 사용할 수 있는 포트 수에 제한이 있습니다. 현재 허용된 포트 범위는 다음 명령어로 확인할 수 있습니다:

cat /proc/sys/net/ipv4/ip_local_port_range# 32768	60999

위 출력은 각 연결에 포트가 하나씩 필요하기 때문에 최대 28,231개(60,999 - 32,768)의 동시 연결을 처리할 수 있음을 의미합니다. 더 많은 연결이 필요하다면 수평 확장을 권장하지만, /etc/sysctl.conf 파일에서 포트 범위를 넓혀 사용 가능한 포트 수를 늘릴 수도 있습니다.

프로세스 관리

Reverb 서버가 항상 실행 상태를 유지하도록 Supervisor와 같은 프로세스 관리자를 사용하는 것이 좋습니다. Supervisor로 Reverb를 실행할 경우, supervisor.conf 파일의 minfds 값을 늘려 Supervisor가 연결 처리에 필요한 파일 디스크립터를 충분히 열 수 있도록 설정하세요:

[supervisord] ... minfds=10000

수평 확장

단일 서버로 처리 가능한 연결 수를 초과해야 한다면, Reverb 서버를 수평으로 확장할 수 있습니다. Redis의 Pub/Sub 기능을 활용해 여러 서버에 걸쳐 연결을 관리하며, 한 Reverb 서버가 메시지를 수신하면 Redis를 통해 다른 모든 서버에 메시지를 전파합니다.

수평 확장을 활성화하려면 .env 파일에서 REVERB_SCALING_ENABLED 환경 변수를 true로 설정하세요:

REVERB_SCALING_ENABLED=true

다음으로, 모든 Reverb 서버가 통신할 중앙 Redis 서버가 필요합니다. Reverb는 애플리케이션에 설정된 기본 Redis 연결을 사용해 모든 Reverb 서버에 메시지를 발행합니다.

확장 옵션을 활성화하고 Redis 서버를 구성했다면, 해당 Redis 서버와 통신 가능한 여러 서버에서 reverb:start 명령어를 실행하면 됩니다. 이 Reverb 서버들은 들어오는 요청을 균등하게 분산하는 로드 밸런서 뒤에 배치해야 합니다.

이 문서는 Laravel 공식 문서(MIT)를 한국 개발자를 위해 번역·재구성한 것입니다.

번역일: 2026년 6월 20일