Fastly
Fastly의 실시간 로그 스트리밍은 서비스의 요청 로그를 HTTPS를 통해 Ahrefs로 전송할 수 있습니다. Fastly 제어판에서 Fastly 서비스에 로깅 엔드포인트를 추가하면 되며, Ahrefs는 Fastly 계정에 접근할 필요가 없습니다.
사전 준비 사항
- Ahrefs 프로젝트의 도메인을 서비스하는 Fastly CDN 서비스 무료 티어를 포함해 어떤 Fastly 요금제든 사용 가능합니다.
- 해당 서비스의 구성 설정을 편집하고 새 버전을 활성화할 수 있는 권한.
1단계 — 액세스 키 받기
- Ahrefs에서 해당 프로젝트의 프로젝트 설정 → 봇 애널리틱스로 이동합니다.
- Fastly를 선택합니다.
- URL, 사용자 지정 헤더 이름, 사용자 지정 헤더 값을 복사하세요. 헤더 값은 액세스 키입니다. 프로젝트를 식별하는 정보이므로 비밀번호처럼 취급하세요.
나머지 필요한 모든 것은 이 페이지에 있습니다.
2단계 — 로깅 엔드포인트 추가
Fastly 제어판에서 서비스를 열고 구성 편집을 클릭한 다음 활성 버전을 복제합니다. 왼쪽 메뉴에서 로깅을 선택한 다음 HTTPS와 엔드포인트 생성을 선택합니다.
엔드포인트 필드
| 필드 | 값 |
|---|---|
| 이름 | Ahrefs 봇 애널리틱스 |
| 배치 | 형식 버전 기본값 |
| 로그 형식 | 기본값을 대체하여 아래의 로그 형식을 사용합니다. |
| URL | https://analytics.ahrefs.com/api/fastly/logs |
| 최대 로그 수, 최대 바이트 수 | 비워 둡니다 |
| 콘텐츠 유형 | application/json |
| 사용자 정의 헤더 이름 | X-Ahrefs-Web-Analytics-Property |
| 사용자 정의 헤더 값 | 1단계의 액세스 키 |
| 방식 | POST |
| JSON 로그 엔트리 형식 | 줄바꿈으로 구분. JSON 배열도 사용할 수 있습니다. |
| 압축 | Gzip(권장) 또는 없음. Zstd와 Snappy는 허용되지 않습니다. |
| TLS 필드 | 비워 둡니다 |
어드밴스드 옵션에서 로그 라인 형식 선택을 공백으로 설정합니다. 생성을 클릭한 다음 새 버전을 활성화합니다. Fastly는 즉시 스트리밍을 시작합니다.
warning
로그 라인 형식은 공백이어야 합니다. 기본값인 클래식은 모든 줄 앞에 syslog 헤더를 추가하므로 Ahrefs는 이러한 배치를 거부합니다.
info
엔드포인트를 저장하면 Fastly가 대상 호스트가 Fastly 서비스에서 보낸 로그를 수락하는지 확인합니다. Ahrefs는 모든 사용자에 대해 이 확인 요청에 응답하므로, 사용자 측에서 별도로 구성할 것은 없습니다.
로그 형식
Fastly는 모든 요청에 대해 %{...}V 플레이스홀더를 채워 넣습니다. 무엇을 공유할지는 사용자가 결정합니다. 최소 형식만으로도 봇 애널리틱스가 동작하며, 권장 형식은 더 나은 결과를 제공합니다. 알 수 없는 키는 무시되므로, 이미 로깅 중인 추가 필드는 그대로 유지해도 됩니다.
최소. 시간, 페이지, 봇 이름이 포함된 봇 방문:
{
"timestamp": %{time.start.msec}V,
"host": "%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V",
"url": "%{json.escape(req.url)}V",
"request_user_agent": "%{json.escape(req.http.User-Agent)}V"
}
권장. 위치 데이터를 위한 방문자 IP, 각 방문과 함께 표시되는 상태 및 응답 세부정보, Web Bot Auth 검증, 그리고 서비스에서 실딩(shielding)을 사용할 때 중복을 제거하는 엣지 마커를 추가합니다:
{
"timestamp": %{time.start.msec}V,
"client_ip": "%{req.http.Fastly-Client-IP}V",
"host": "%{if(req.http.Fastly-Orig-Host, req.http.Fastly-Orig-Host, req.http.Host)}V",
"scheme": "%{req.protocol}V",
"url": "%{json.escape(req.url)}V",
"request_method": "%{json.escape(req.method)}V",
"request_referer": "%{json.escape(req.http.Referer)}V",
"request_user_agent": "%{json.escape(req.http.User-Agent)}V",
"response_state": "%{json.escape(fastly_info.state)}V",
"response_status": %{resp.status}V,
"response_body_size": %{resp.body_bytes_written}V,
"response_content_type": "%{json.escape(resp.http.Content-Type)}V",
"fastly_server": "%{json.escape(server.identity)}V",
"fastly_is_edge": %{if(fastly.ff.visits_this_service == 0, "true", "false")}V,
"request_id": "%{json.escape(req.xid)}V",
"signature": "%{json.escape(req.http.Signature)}V",
"signature_input": "%{json.escape(req.http.Signature-Input)}V",
"signature_agent": "%{json.escape(req.http.Signature-Agent)}V"
}
두 형식을 원하는 대로 섞어 사용하세요. 최소 4개 키는 필수이며, 그 외 키는 생략하거나 비워 두거나 (null)로 둘 수 있습니다. 서비스에 실드가 있는 경우에는 fastly_is_edge를 유지하세요. 그렇지 않으면 미스가 각각 두 번 집계됩니다. 따옴표 없는 키(timestamp, response_status, response_body_size, fastly_is_edge)는 항상 값이 있어야 하며, 값이 없으면 해당 줄은 유효한 JSON이 아닙니다.
info
Fastly Compute 서비스는 2단계의 엔드포인트 설정을 사용해 코드에서 동일한 JSON을 작성하며, 한 줄에 객체 하나씩 기록합니다.
3단계 — 확인
Fastly는 로그를 소규모 배치로 전달하며, 보통 요청 후 1분 이내에 도착합니다. 그런 다음 봇 방문은 몇 분 뒤 봇 애널리틱스 보고서에 표시됩니다. 브라우저에서 발생한 요청도 전송되지만, Ahrefs는 봇이 아닌 모든 항목을 폐기합니다.
문제 해결
Fastly는 제어판에서 HTTPS 엔드포인트의 전송 오류를 표시하지 않으므로, 아무것도 도착하지 않으면 위 표와 비교하여 설정을 확인하세요. Ahrefs는 각 배치에 대해 다음 중 하나로 응답합니다.
| 응답 | 원인 |
|---|---|
401 missing authentication header | 커스텀 헤더 이름이 잘못 입력되었거나 비어 있습니다. |
403 invalid authentication | 커스텀 헤더 값이 Ahrefs 프로젝트와 일치하지 않습니다. 1단계에서 다시 복사하세요. |
400 record 0: … | 로그 줄 형식이 비어 있음이 아니라 클래식이거나, 압축이 Gzip 또는 없음으로 설정되어 있지 않거나, 로그 형식이 유효한 JSON이 아닙니다. |
400 record N: Missing record field … | 줄바꿈 구분: 로그 형식에 필수 키 중 하나가 없습니다. |
400 invalid body: not a JSON array of log records: … | JSON 배열: 로그 줄 형식이 비어 있음이 아니라 클래식이거나, 로그 형식에 필수 키가 없거나, 유효한 JSON이 아닙니다. |
400 body is not valid gzip | Fastly에서 압축이 Gzip으로 설정되어 있지만, 본문을 압축 해제할 수 없습니다. |