Skip to main content

Horizon이란

Laravel Horizon은 Laravel의 Redis 큐 전용 모니터링 대시보드입니다. 잡의 처리량·실행 시간·실패 상황을 실시간으로 시각화하고, 워커 설정을 코드로 관리할 수 있습니다.
Horizon은 큐의 기본 기능을 확장하는 패키지입니다. 먼저 큐와 잡의 기본을 이해한 후 계속 읽어 나가세요. 또한 백엔드에는 반드시 Redis가 필요합니다.

설치

Horizon은 Redis를 큐 백엔드로 사용합니다. config/queue.phpQUEUE_CONNECTIONredis로 설정되어 있는지 확인하세요. 현시점에서 Redis Cluster는 지원되지 않습니다.
Composer로 설치합니다.
설치 후 Horizon의 에셋과 설정 파일을 배포합니다.
이 명령으로 config/horizon.phpapp/Providers/HorizonServiceProvider.php가 생성됩니다.

설정

config/horizon.php의 구성

config/horizon.php는 워커 설정을 모두 관리하는 파일입니다. 중심이 되는 설정이 environments 옵션입니다.
Horizon은 내부적으로 horizon이라는 이름의 Redis 연결을 사용합니다. config/database.php에서 이 이름을 다른 연결에 사용하지 마세요.

CSP nonce (Content Security Policy)

Content Security Policy의 일환으로 Horizon 뷰 내에서 사용되는 script / style 태그에 nonce 속성을 설정하고 싶다면 Horizon::cspNonce 메서드를 사용합니다. 요청마다 새로운 nonce를 할당하기 위해 보통 미들웨어 내에서 호출합니다.
이 미들웨어는 config/horizon.phpmiddleware 옵션에 추가합니다.

슈퍼바이저 (Supervisor)

각 환경은 하나 이상의 “슈퍼바이저”를 가질 수 있습니다. 슈퍼바이저는 워커 그룹의 관리 단위로, 다른 큐·밸런스 전략·프로세스 수를 갖는 여러 슈퍼바이저를 같은 환경에서 돌릴 수 있습니다.

기본값

defaults 옵션에서 모든 슈퍼바이저에 적용되는 기본값을 설정할 수 있습니다.

유지보수 모드

애플리케이션이 유지보수 모드일 때, Horizon은 기본적으로 잡을 처리하지 않습니다. 강제로 처리하게 하려면 force 옵션을 사용합니다.

잡의 최대 시도 횟수

tries0으로 하면 무제한 재시도를 허용합니다.

잡의 타임아웃

timeoutconfig/queue.phpretry_after보다 몇 초 짧은 값을 설정하세요. 또한 auto 밸런스 전략에서는 이 값보다 긴 잡을 강제 종료하는 경우가 있습니다.

백오프 (재시도 대기 시간)

예외 발생 후 재시도까지의 대기 초를 지정합니다.

그 외 워커 옵션

tries, timeout, backoff 외에도 각 슈퍼바이저는 워커 프로세스의 거동이나 자동 재시작 타이밍을 제어하는 옵션을 받습니다. 장시간 가동하는 프로세스를 정기적으로 재시작하는 것은 메모리 누수를 막는 좋은 습관입니다.
  • memory — 재시작까지 워커 프로세스가 소비할 수 있는 최대 메모리 양(MB). 기본값은 128
  • maxJobs — 재시작까지 처리하는 잡 수. 0은 무제한을 의미. 기본값은 0
  • maxTime — 재시작까지 워커가 가동할 수 있는 초 수. 0은 시간에 의한 재시작 없음을 의미. 기본값은 0
  • sleep — 잡이 없을 때 다음 폴링까지 대기하는 초 수. 기본값은 3
  • rest — 각 잡 처리 사이에 일시 정지하는 초 수. 기본값은 0
  • nice — 워커 프로세스의 우선도(“niceness”). 값이 클수록 우선도는 낮아짐. 기본값은 0

밸런스 전략

Horizon에는 3종류의 워커 밸런스 전략이 있습니다.
큐 부하에 따라 워커 수를 자동 조정합니다. minProcessesmaxProcesses로 범위를 지정합니다.
  • time — 큐를 비울 때까지의 추정 시간으로 스케일링
  • size — 큐 내의 잡 수로 스케일링
auto 전략에서는 큐의 순서가 우선도를 의미하지 않습니다. 우선도를 강제하고 싶다면 여러 슈퍼바이저를 사용하세요.
워커 수를 고정하고, 지정한 큐에 균등하게 분배합니다.
위 예에서는 defaultnotifications에 각각 5개의 프로세스가 할당됩니다.
큐를 나열한 순서로 엄밀히 우선합니다. Laravel 기본 큐 시스템과 유사한 동작이지만, 밀린 양에 따라 워커 수를 스케일링합니다.
default 큐의 잡이 항상 notifications 큐보다 먼저 처리됩니다.

대시보드 인가

Horizon 대시보드는 /horizon 라우트에서 접근할 수 있습니다. 로컬 환경에서는 기본적으로 누구나 접근할 수 있지만, 프로덕션 환경에서는 게이트 정의로 접근을 제한합니다. app/Providers/HorizonServiceProvider.phpgate() 메서드를 편집합니다.
인증을 필요로 하지 않는 경우(IP 제한 등으로 보호하고 있는 경우), 인수를 옵션으로 만듭니다.

Horizon 시작

기본 명령

로컬 개발: 자동 재시작

파일 변경을 감지하여 Horizon을 자동 재시작하려면 horizon:listen 명령을 사용합니다.

Supervisor에 의한 상시 시작

프로덕션 환경에서는 Supervisor를 사용하여 Horizon을 상시 가동시킵니다.

Supervisor 설치

설정 파일 작성

/etc/supervisor/conf.d/horizon.conf를 만듭니다.
stopwaitsecs는 가장 긴 잡의 실행 시간보다 큰 값을 설정하세요. 너무 작으면 Supervisor가 잡을 도중에 강제 종료시켜 버립니다.

Supervisor 시작

배포 시

코드를 배포할 때마다 Horizon을 재시작하여 변경을 반영합니다.
Supervisor가 autostart=true / autorestart=true로 되어 있다면 종료 후 자동으로 재시작됩니다.

잡 관리

태그

Horizon은 잡에 관련된 Eloquent 모델을 자동 감지하여 태그를 붙입니다.
수동으로 태그를 정의하려면 tags() 메서드를 구현합니다.
이벤트 리스너에서는 이벤트 인스턴스가 tags() 메서드에 전달됩니다.

사일런싱

대시보드의 “완료된 잡” 목록에 표시하고 싶지 않은 잡은 config/horizon.php에서 사일런싱할 수 있습니다.
Silenced 인터페이스를 구현하는 방법도 있습니다.

메트릭과 모니터링

Horizon의 메트릭 대시보드에는 잡·큐의 처리량과 실행 시간이 표시됩니다. 정기적으로 스냅샷을 가져오기 위한 스케줄을 설정합니다.
config/horizon.phpmetrics.trim_snapshots 옵션에서, 메트릭 그래프용으로 유지할 스냅샷 수를 설정할 수 있습니다. 이 설정은 스냅샷의 경과 시간이 아니라 건수로 제한하므로, 실제 유지 기간은 horizon:snapshot 명령의 실행 빈도에 따라 달라집니다.
메트릭 데이터를 모두 삭제하려면 다음을 실행합니다.

잡 실패 알림

큐의 대기 시간이 길어졌을 때 알림을 받을 수 있습니다. app/Providers/HorizonServiceProvider.phpboot() 메서드에서 설정합니다.

대기 시간 임계값

config/horizon.phpwaits 옵션으로 알림 트리거가 되는 대기 초를 설정합니다.
0을 설정하면 해당 큐의 알림이 비활성화됩니다.

실패 잡 관리

실패한 잡은 ID 또는 UUID로 삭제할 수 있습니다.
큐의 잡을 모두 지우려면 다음을 사용합니다.

업그레이드

Horizon의 메이저 버전 업 시에는 업그레이드 가이드를 반드시 확인하세요.

관련 페이지

큐와 잡

Laravel 큐의 기본. 잡의 생성·디스패치·배치 처리·실패 처리를 설명.

Redis

Horizon의 백엔드로 필요한 Redis의 설정과 사용법.
마지막 수정일 2026년 8월 2일