현재 Apigee Edge 문서가 표시되고 있습니다.
Apigee X 문서로 이동 정보
증상
클라이언트 애플리케이션은 HTTP 상태 코드 500 Internal Server Error
와 함께 오류 코드 protocol.http.EmptyPath
를 API 호출에 대한 응답으로 가져옵니다.
오류 메시지
클라이언트 애플리케이션은 다음 응답 코드를 가져옵니다.
HTTP/1.1 500 Internal Server Error
또한 다음과 같은 오류 메시지가 표시될 수 있습니다.
{ "fault":{ "faultstring":"Request path cannot be empty", "detail":{ "errorcode":"protocol.http.EmptyPath" } } }
가능한 원인
이 오류는 흐름 변수
target.url
로 표시되는 백엔드 서버의 요청 URL에 빈 경로가 포함된 경우에 발생합니다.
RFC 3986, 섹션 3: 구문 구성요소 및 RFC 3986, 섹션 3.3: 경로 사양에 따릅니다.
URI 구문 에는 다음과 같은 구성요소가 있습니다.
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
path
구성요소는 필수이며 경로에 다른 문자가 없는 경우에도 항상 슬래시(/
)를 포함해야 합니다(MUST).
따라서 백엔드 서버의 요청 URL에 path
구성요소가 전혀 없는 경우, 즉 슬래시 (/
)가 없으면 Apigee Edge는 500 Internal Server Error
및 오류 코드 protocol.http.EmptyPath
로 응답합니다.
예를 들어 target.url
의 값이 https://www.mocktarget.apigee.net
이면 path
구성요소가 비어 있거나 누락되었기 때문에 이 오류가 발생합니다.
원인 | 설명 | 다음에 관한 문제 해결 안내 |
---|---|---|
백엔드 서버 URL (target.url)에 빈 경로가 있음 | 흐름 변수 target.url 로 표시되는 백엔드 서버 URL에 빈 경로가 있습니다. |
Edge 퍼블릭 및 프라이빗 클라우드 사용자 |
일반적인 진단 단계
다음 도구/기술 중 하나를 사용하여 이 오류를 진단하세요.
API 모니터링
절차 #1: API 모니터링 사용
API 모니터링을 사용하여 오류를 진단하려면 다음 안내를 따르세요.
- 적절한 역할이 있는 사용자로 Apigee Edge UI에 로그인합니다.
문제를 조사하려는 조직으로 전환합니다.
- 분석 > API 모니터링 > 조사 페이지로 이동합니다.
- 오류를 관찰한 특정 기간을 선택합니다.
시간을 기준으로 결함 코드를 표시합니다.
아래와 같이 오류 코드가
protocol.http.EmptyPath
인 셀을 선택합니다.오류 코드
protocol.http.EmptyPath
에 관한 정보가 아래와 같이 표시됩니다.로그 보기 를 클릭하여 실패한 요청이 있는 행을 펼칩니다.
- 로그 창에서 다음 세부정보를 확인합니다.
- 상태 코드:
500
- 결함 소스:
target
- 오류 코드:
protocol.http.EmptyPath
- 상태 코드:
- 오류 소스가
target
이고 오류 코드가protocol.http.EmptyPath
이면 백엔드 서버 URL의 경로가 비어 있음을 나타냅니다.
Trace
절차 #2: Trace 도구 사용
Trace 도구를 사용하여 오류를 진단하려면 다음 단계를 따르세요.
- 트레이스 세션을 사용 설정하고 다음 중 하나를 사용 설정합니다.
500 Internal Server Error
오류가 발생할 때까지 기다립니다.- 문제를 재현할 수 있는 경우 API를 호출하여 문제를 재현합니다.
500 Internal Server Error
Show all FlowInfos(모든 FlowInfos 표시)가 사용 설정되어 있는지 확인합니다.
- 실패한 요청 중 하나를 선택하고 트레이스를 검사합니다.
- trace의 여러 단계를 살펴보고 실패가 발생한 위치를 찾습니다.
일반적으로 아래와 같이 대상 요청 흐름 시작 단계 이후의 흐름에서 오류를 찾을 수 있습니다.
트레이스에서 오류 값을 기록해 둡니다.
오류: 요청 경로는 비워둘 수 없음
대상 요청 흐름 시작 단계 후에 Apigee Edge에서 오류를 발생시키므로 백엔드 서버 URL의
path
가 비어있음을 나타냅니다. 이는 백엔드 서버의 URL을 나타내는 흐름 변수target.url
가 요청 흐름의 정책 중 하나를 통한 빈 경로로 업데이트된 경우 발생할 가능성이 높습니다.- 각 흐름에서 오류 지점부터 대상 요청 흐름 시작됨 단계까지 역순으로 변수 읽기 및 할당됨 섹션을 검토합니다.
흐름 변수
target.url
를 업데이트할 정책을 결정합니다.JavaScript 정책에서 흐름 변수
target.url
를 업데이트했음을 보여주는 샘플 트레이스:위에 표시된 샘플 트레이스에서 흐름 변수 변수
target.url
의 값이 다음과 같이 SetTargetURL이라는 JavaScript 정책에서 업데이트됩니다.target.url : https://mocktarget.apigee.net
target.url
에는 다음과 같은 구성요소가 있습니다.- 스키마:
https://mocktarget.apigee.net
- path: 비어 있음
- 스키마:
- 따라서
Request path cannot be empty
오류가 발생합니다. - 추적에서 AX (애널리틱스 데이터 기록됨) 단계로 이동하여 클릭합니다.
단계 세부정보 - 오류 헤더 섹션까지 아래로 스크롤하고 아래와 같이 X-Apigee-fault-code 및 X-Apigee-fault-source의 값을 확인합니다.
- X-Apigee-fault-code 및 X-Apigee-fault-source의 값이 각각
protocol.http.EmptyPath
및target
으로 표시됩니다. 이는 백엔드 서버 URL의 경로가 비어 있기 때문에 이 오류가 발생했음을 나타냅니다.응답 헤더 값 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
절차 #3: NGINX 액세스 로그 사용
NGINX 액세스 로그를 사용하여 오류를 진단하려면 다음 안내를 따르세요.
- Private Cloud 사용자는 NGINX 액세스 로그를 사용하여 HTTP
500 Internal Server Error
에 대한 키 정보를 확인할 수 있습니다. NGINX 액세스 로그를 확인합니다.
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- 특정 기간 동안
protocol.http.EmptyPath
오류 코드와 함께500
오류가 있는지 (과거에 문제가 발생한 경우) 또는 여전히500
와 함께 실패하는 요청이 있는지 검색하여 확인합니다. X-Apigee-fault-code 값과 일치하는 X-Apigee-fault-code 가 포함된
500
오류가 있는 경우 X-Apigee-fault-code 의 값을 확인합니다.NGINX 액세스 로그의 샘플 500 오류:
NGINX 액세스 로그의 위 샘플 항목은 X- Apigee-fault-code 및 X-Apigee-fault-source에 대한 값이 다음과 같습니다.
헤더 값 X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
X-Apigee-fault-code 및 X-Apigee-fault-source의 값은 각각
protocol.http.EmptyPath
및target
입니다. 이는 백엔드 서버 URL에 빈 경로가 있기 때문에 이 오류가 발생했음을 나타냅니다.
원인: 백엔드 서버 URL (target.url)이 비어 있음
진단
- 일반적인 진단 단계에 설명된 대로 API 모니터링, Trace 도구 또는 NGINX 액세스 로그를 사용하여
500 Internal Server Error
의 결함 코드 및 오류 소스를 확인합니다. - 오류 코드가
protocol.http.EmptyPath
이고 오류 소스 값이target
이면 백엔드 서버 URL에 빈 경로가 있음을 나타냅니다. 백엔드 서버 URL은 Apigee Edge에서 흐름 변수
target.url
로 표시됩니다. 이 오류는 일반적으로 대상 요청 흐름에서 빈 경로가 있는 정책을 사용하여 (프록시/공유 흐름 내에서)target.url
를 동적으로 백엔드 서버 URL을 업데이트하려고 할 때 발생합니다.- 다음 단계 중 하나를 사용하여 흐름 변수
target.url
에 실제로 빈 경로와 그 값 소스가 있는지 확인합니다.Trace
추적 도구 사용
이 오류에 대한 추적을 캡처한 경우 추적 도구 사용 에 설명된 단계를 따르고 다음을 수행합니다.
target.url
에 빈 경로가 있는지 확인합니다.올바르면 빈 경로를 포함하도록
target.url
값을 수정하거나 업데이트한 정책을 찾습니다.JavaScript 정책이 업데이트된 흐름 변수
target.url:
를 보여주는 샘플 트레이스- 위의 샘플 트레이스에서 JavaScript 정책이 빈 경로를 포함하도록
target.url
값을 수정하거나 업데이트했습니다. target.url
에는 다음과 같은 구성요소가 있습니다.- 스키마:
https://mocktarget.apigee.net
- path: 비어 있음
- 스키마:
로그
로그 서버에서 로그 사용
- 이 오류에 대한 트레이스가 없는 경우 (간헐적 문제)
MessageLogging 또는
Service콜아웃과 같은 정책을 사용하여 로그 서버에 흐름 변수
target.url
의 값에 대한 정보를 로깅했는지 확인하세요. - 로그가 있으면 검토하고 다음을 수행합니다.
target.url
에 빈 경로가 있는지 확인- 빈 경로를 포함하도록
target.url
을 수정한 정책을 확인할 수 있는지 확인
API 프록시
실패한 API 프록시 검토
이 오류에 대한 트레이스나 로그가 없으면 실패한 API 프록시를 검토하여 잘못된 경로를 포함하도록 흐름 변수
target.url
를 수정하거나 업데이트한 항목을 확인합니다. 다음을 확인하세요.- API 프록시 내 정책
- 프록시에서 호출된 모든 공유 흐름
흐름 변수
target.url
를 신중하게 수정하거나 업데이트하는 특정 정책 (예:AssignMessage 또는 자바스크립트)을 살펴보고target.url
를 업데이트하여 경로가 비어 있는 원인을 확인합니다.다음은 이 오류를 일으키는 빈 경로를 포함하도록
target.url
흐름 변수를 잘못 업데이트하는 몇 가지 정책의 예입니다.샘플 #1
샘플 #1:
target.url
변수를 업데이트하는 JavaScript 정책var url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
위 샘플에서 흐름 변수
target.url
가 다른 변수url
에 포함된https://mocktarget.apigee.net
값으로 업데이트된 것을 볼 수 있습니다.target.url
에는 다음과 같은 구성요소가 있습니다.- 스키마:
https://mocktarget.apigee.net
- path: 비어 있음
경로가 비어 있으므로 Apigee Edge는 오류 코드
protocol.http.EmptyPath
와 함께500 Internal Server Error
을 반환합니다.샘플 #2
샘플 #2:
target.url
변수를 업데이트하는 JavaScript 정책var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
위 샘플에서 흐름 변수
target.url
는url
변수에 포함된 값https://mocktarget.apigee.net
와request.header.Path.
에서 값을 가져오는 또 다른 변수path
값을 연결하여 업데이트됩니다.실제 요청이나 트레이스에 액세스할 수 있는 경우
request.header.Path
에 전달된 실제 값을 확인할 수 있습니다.사용자의 샘플 요청:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
이 예에서 헤더 경로는 요청의 일부로 전송되지 않습니다. 따라서 자바스크립트 정책의 변수 경로 값은
null
입니다.따라서
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + null
target.url = https://mocktarget.apigee.netnull
target.url
에는 다음과 같은 구성요소가 있습니다.- 스키마:
https://mocktarget.apigee.netnull
- path: 비어 있음
샘플 #3
샘플 #3: 다른 변수를 통해
target.url
변수를 업데이트하는 할당메시지 정책<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
target.url
에는 다음과 같은 구성요소가 있습니다.- 스키마:
https://mocktarget.apigee.net
- path: 비어 있음
위의 모든 예시에서 백엔드 서버 URL의 경로(
target.url
)가 비어 있으므로 Apigee Edge는 오류 코드protocol.http.EmptyPath
와 함께500 Internal Server Error
을 반환합니다.- 스키마:
해상도
RFC 3986, 섹션 2: 구문 구성요소 사양에 따라 path
구성요소는 필수이며 path
의 일부로 다른 문자가 없는 경우에도 항상 슬래시(/)를 포함해야 합니다(MUST). 이 문제를 해결하려면 다음 단계를 따르세요.
- 흐름 변수
target.url
로 표시되는 백엔드 서버 URL에 항상 비어 있지 않은 경로가 있는지 확인합니다.- 경우에 따라 경로에 리소스 이름이 없을 수 있습니다. 이 경우 경로에 적어도 슬래시 (
/
)가 있는지 확인합니다. - 다른 변수를 사용하여 흐름 변수
target.url
의 값을 결정하는 경우 다른 변수에 빈 경로가 없어야 합니다. - 문자열 작업을 실행하여 흐름 변수
target.url
의 값을 결정하는 경우 문자열 작업의 결과나 결과에 빈 경로가 없는지 확인합니다.
- 경우에 따라 경로에 리소스 이름이 없을 수 있습니다. 이 경우 경로에 적어도 슬래시 (
- 진단에 설명된 샘플에서 아래 설명된 대로 이 문제를 해결할 수 있습니다.
샘플 #1
샘플 #1:
target.url
변수를 업데이트하는 JavaScript 정책이 문제를 해결하려면 다음과 같이
url
변수에 슬래시 (/
)를 추가하세요.var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
샘플 #2
샘플 #2:
target.url
변수를 업데이트하는 JavaScript 정책var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
이 문제를 해결하려면 아래와 같이 유효한 경로(예:
/iloveapis
)를 요청 헤더Path
의 일부로 전달해야 합니다.샘플 요청:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
샘플 #3
샘플 #3: 다른 변수를 통해
target.url
변수를 업데이트하는 할당메시지 정책할당 메시지 정책의
<Value>
요소에 유효한 경로를 추가합니다. 예를 들어 MockTarget API의 경로로/json
를 사용할 수 있습니다. 즉, 아래와 같이<Value>
요소를https://mocktarget.apigee.net/json
로 수정합니다.<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
사양
Apigee Edge는 다음 사양에 따라 백엔드 서버 URL에 빈 경로가 없을 것으로 예상합니다.
사양 |
---|
RFC 3986, 섹션 3: 구문 구성요소 |
RFC 3986, 섹션 3.3: 경로 |
Apigee 지원의 지원이 더 필요하면 진단 정보를 수집해야 하는 경우로 이동하세요.
진단 정보를 수집해야 함
위의 안내를 따른 후에도 문제가 지속되면 다음 진단 정보를 수집한 다음 Apigee Edge 지원팀에 문의하세요.
Public Cloud 사용자인 경우 다음 정보를 제공합니다.
- 조직 이름
- 환경 이름
- API 프록시 이름
500 Internal Server Error
을 재현하는 데 사용된curl
명령어 전체와 오류 코드protocol.http.EmptyPath
- API 요청에 대한 추적 파일
Private Cloud 사용자인 경우 다음 정보를 제공하세요.
- 실패한 요청에 대해 발견된 전체 오류 메시지
- 환경 이름
- API 프록시 번들
- API 요청에 대한 추적 파일
NGINX 액세스 로그:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
여기서 ORG, ENV, PORT#는 실제 값으로 대체됩니다.
- 메시지 프로세서 시스템 로그
/opt/apigee/var/log/edge-message- processor/logs/system.log