12.3. API 요청 문제 확인
API에 대한 요청에서 문제가 발생할 수 있는 위치를 확인하려면 다음 검사를 수행합니다.
12.3.1. API 링크 복사링크가 클립보드에 복사되었습니다!
API가 시작되어 요청에 응답하는지 확인하려면 API에 직접 동일한 요청을 보냅니다(API 게이트웨이를 통과하지 않음). API 게이트웨이를 통과하는 요청과 동일한 매개변수와 헤더를 전송하는지 확인해야 합니다. 실패하는 정확한 요청이 확실하지 않은 경우 API 게이트웨이와 API 간 트래픽을 캡처합니다.
호출에 성공하면 API 관련 문제를 해결할 수 있습니다. 그러지 않으면 API 문제를 추가로 해결해야 합니다.
12.3.2. API 게이트웨이 > API 링크 복사링크가 클립보드에 복사되었습니다!
API 게이트웨이와 API 간의 네트워크 문제를 배제하려면 API 게이트웨이 서버에서 beforequery-fudirectly와 동일한 호출을 수행합니다.
호출에 성공하면 API 게이트웨이 자체 문제를 해결하기 위해 이동할 수 있습니다.
12.3.3. API 게이트웨이 링크 복사링크가 클립보드에 복사되었습니다!
API 게이트웨이가 올바르게 작동하는지 확인하기 위해 통과해야 하는 여러 단계가 있습니다.
12.3.3.1. API 게이트웨이가 실행 중입니까? 링크 복사링크가 클립보드에 복사되었습니다!
게이트웨이가 실행 중인 시스템에 로그인합니다. 이 경우 게이트웨이 서버가 다운될 수 있습니다.
로그인한 후 NGINX 프로세스가 실행 중인지 확인합니다. 이를 위해 ps ax | grep nginx
또는 htop
을 실행합니다.
목록에 nginx 마스터 프로세스 및
NGINX가 실행됩니다.
nginx 작업자 프로세스가
표시되면
12.3.3.2. 게이트웨이 로그에 오류가 있습니까? 링크 복사링크가 클립보드에 복사되었습니다!
다음은 게이트웨이 로그에 표시되는 몇 가지 일반적인 오류입니다(예: error.log).
API 게이트웨이가 API에 연결할 수 없음
upstream timed out (110: Connection timed out) while connecting to upstream, client: X.X.X.X, server: api.example.com, request: "GET /RESOURCE?CREDENTIALS HTTP/1.1", upstream: "http://Y.Y.Y.Y:80/RESOURCE?CREDENTIALS", host: "api.example.com"
upstream timed out (110: Connection timed out) while connecting to upstream, client: X.X.X.X, server: api.example.com, request: "GET /RESOURCE?CREDENTIALS HTTP/1.1", upstream: "http://Y.Y.Y.Y:80/RESOURCE?CREDENTIALS", host: "api.example.com"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow API 게이트웨이를 3scale에 연결할 수 없음
2015/11/20 11:33:51 [error] 3578#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: , request: "GET /api/activities.json?user_key=USER_KEY HTTP/1.1", subrequest: "/threescale_authrep", upstream: "https://54.83.62.186:443/transactions/authrep.xml?provider_key=YOUR_PROVIDER_KEY&service_id=SERVICE_ID&usage[hits]=1&user_key=USER_KEY&log%5Bcode%5D=", host: "localhost"
2015/11/20 11:33:51 [error] 3578#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: , request: "GET /api/activities.json?user_key=USER_KEY HTTP/1.1", subrequest: "/threescale_authrep", upstream: "https://54.83.62.186:443/transactions/authrep.xml?provider_key=YOUR_PROVIDER_KEY&service_id=SERVICE_ID&usage[hits]=1&user_key=USER_KEY&log%5Bcode%5D=", host: "localhost"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
12.3.4. API 게이트웨이 > 3scale 링크 복사링크가 클립보드에 복사되었습니다!
API 게이트웨이가 올바르게 실행되고 있는지 확인한 후 다음 단계는 API 게이트웨이와 3scale 간의 연결 문제를 해결하는 것입니다.
12.3.4.1. API 게이트웨이가 3scale에 도달할 수 있습니까? 링크 복사링크가 클립보드에 복사되었습니다!
NGINX를 API 게이트웨이로 사용하는 경우 게이트웨이가 3scale에 연결할 수 없는 경우 nginx 오류 로그에 다음 메시지가 표시됩니다.
2015/11/20 11:33:51 [error] 3578#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: , request: "GET /api/activities.json?user_key=USER_KEY HTTP/1.1", subrequest: "/threescale_authrep", upstream: "https://54.83.62.186:443/transactions/authrep.xml?provider_key=YOUR_PROVIDER_KEY&service_id=SERVICE_ID&usage[hits]=1&user_key=USER_KEY&log%5Bcode%5D=", host: "localhost"
2015/11/20 11:33:51 [error] 3578#0: *1 upstream timed out (110: Connection timed out) while connecting to upstream, client: 127.0.0.1, server: , request: "GET /api/activities.json?user_key=USER_KEY HTTP/1.1", subrequest: "/threescale_authrep", upstream: "https://54.83.62.186:443/transactions/authrep.xml?provider_key=YOUR_PROVIDER_KEY&service_id=SERVICE_ID&usage[hits]=1&user_key=USER_KEY&log%5Bcode%5D=", host: "localhost"
여기에서 업스트림 값을 기록해 둡니다. 이 IP는 3scale 제품이 확인되는 IP 중 하나에 해당합니다. 이는 3scale에 도달하는 데 문제가 있음을 의미합니다. 역방향 DNS 조회를 수행하여 nslookup
을 호출하여 도메인의 IP를 확인할 수 있습니다.
예를 들어 API 게이트웨이가 3scale에 연결할 수 없기 때문에 3scale이 다운된 것은 아닙니다. 가장 일반적인 이유 중 하나는 API 게이트웨이가 3scale에 연결하는 것을 방지하는 방화벽 규칙입니다.
게이트웨이와 3scale 간에 연결이 시간 초과될 수 있는 네트워크 문제가 있을 수 있습니다. 이 경우 일반 연결 문제 해결 의 단계를 수행하여 문제가 있는 위치를 식별해야 합니다.
네트워킹 문제를 배제하려면 traceroute 또는 MTR을 사용하여 라우팅 및 패킷 전송을 확인합니다. 3scale 및 API 게이트웨이에 연결하고 출력을 비교할 수 있는 머신에서 동일한 명령을 실행할 수도 있습니다.
또한 API 게이트웨이와 3scale 간에 전송되는 트래픽을 보려면 3scale 제품(su1.3scale.net
)에 대한 HTTP 끝점을 사용하여 일시적으로 전환하는 한 tcpdump를 사용할 수 있습니다.
12.3.4.2. API 게이트웨이가 3scale 주소를 올바르게 해결합니까? 링크 복사링크가 클립보드에 복사되었습니다!
resolver 지시문이 nginx.conf에 추가되었는지 확인합니다.
예를 들어 nginx.conf에서 다음을 수행합니다.
Google DNS (8.8.8.8 및 8.8.4.4)를 원하는 DNS로 대체할 수 있습니다.
API 게이트웨이에서 DNS 확인을 확인하려면 지정된 확인자 IP와 같이 nslookup을 호출합니다.
nslookup su1.3scale.net 8.8.8.8 ;; connection timed out; no servers could be reached
nslookup su1.3scale.net 8.8.8.8
;; connection timed out; no servers could be reached
위의 예에서는 Google DNS에 연결할 수 없는 경우 반환된 응답을 보여줍니다. 이 경우 확인자 IP를 업데이트해야 합니다. nginx error.log에도 다음 경고가 표시될 수 있습니다.
2016/05/09 14:15:15 [alert] 9391#0: send() failed (1: Operation not permitted) while resolving, resolver: 8.8.8.8:53
2016/05/09 14:15:15 [alert] 9391#0: send() failed (1: Operation not permitted) while resolving, resolver: 8.8.8.8:53
마지막으로 dig any su1.3scale.net
을 실행하여 3scale 서비스 관리 API에서 현재 작동 중인 IP 주소를 확인합니다. 이는 3scale에서 사용할 수 있는 전체 IP 주소 범위가 아닙니다. 일부 기능은 용량상의 이유로 교체 및 해제될 수 있습니다. 또한 향후 3scale 서비스에 더 많은 도메인 이름을 추가할 수 있습니다. 이를 위해 항상 통합 중에 제공된 특정 주소를 테스트해야 합니다(해당되는 경우).
12.3.4.3. API 게이트웨이가 3scale를 올바르게 호출합니까? 링크 복사링크가 클립보드에 복사되었습니다!
문제 해결을 위해 API 게이트웨이에서 요청을 3scale로 만들고자 하는 경우 nginx.conf
의 3scale 인증 위치에 다음 스니펫을 추가할 수 있습니다(API Key 및 App\_id 인증 모드의 경우/threescale_authrep
).
이 스니펫에서는 X-3scale-debug 헤더가
전송될 때 nginx error.log에 다음 추가 로깅을 추가합니다. 예를 들어 curl -v -H 'X-3scale-debug: snapR_PROVIDER_KEY' -X GET "https://726e3b99.ngrok.com/api/contacts.json?access_token=7c6f24f5"
그러면 다음 로그 항목이 생성됩니다.
첫 번째 항목(2016/05/05 14:24:33 [] 7238#0: *57 [lua] body_filter_by_lua:7:
)은 3scale로 전송된 요청 헤더를 출력합니다. 이 경우 호스트, User-Agent, Accept, X-Forwarded-Proto 및 X-Forwarded-For.
두 번째 항목(2016/05/05 14:24:33 [] 7238#0: *57 [lua] body_filter_by_lua:8:
)은 3scale에서 응답을 출력합니다. 이 경우 < error code="access_token_invalid">access_token_invalid">access_token "7c6f24f5"는 유효하지 않거나 정의되지 않은</error>입니다
.
원본 요청(GET /api/anchors.json?access_token=7c6f24f5
) 및 하위 요청 위치(/threescale_authrep
)와 업스트림 요청(stream: "https://54.83.62.94:443/transactions/threescale_authrep.xml?provider_key=REDACTED&service_id=REDACTED&usage[hits]=1&access_token=7c6f24f5"
.)을 출력합니다. 이 마지막 값을 사용하면 3scale IP 중 어떤 것이 해결되었는지, 3scale에 대한 정확한 요청을 확인할 수 있습니다.
12.3.5. 3scale 링크 복사링크가 클립보드에 복사되었습니다!
12.3.5.1. 3scale이 오류를 반환합니까? 링크 복사링크가 클립보드에 복사되었습니다!
3scale을 사용할 수도 있지만 API로 이동하는 호출이 발생하지 않도록 API 게이트웨이에 오류를 반환하고 있습니다. 3scale에서 직접 권한 부여 호출을 수행하고 응답을 확인합니다. 오류가 발생하면 #troubleshooting-api-error-codes[Error Codes] 섹션을 확인하여 문제가 무엇인지 확인합니다.
12.3.5.2. 3scale 디버그 헤더 사용 링크 복사링크가 클립보드에 복사되었습니다!
X-3scale-debug
헤더를 사용하여 API를 호출하여 3scale 디버그 헤더를 활성화할 수도 있습니다.
curl -v -X GET "https://api.example.com/endpoint?user_key" X-3scale-debug: dotnetR_SERVICE_TOKEN
그러면 API 응답이 포함된 다음 헤더가 반환됩니다.
X-3scale-matched-rules: /, /api/contacts.json < X-3scale-credentials: access_token=TOKEN_VALUE < X-3scale-usage: usage[hits]=2 < X-3scale-hostname: HOSTNAME_VALUE
X-3scale-matched-rules: /, /api/contacts.json
< X-3scale-credentials: access_token=TOKEN_VALUE
< X-3scale-usage: usage[hits]=2
< X-3scale-hostname: HOSTNAME_VALUE
12.3.5.3. 통합 오류 확인 링크 복사링크가 클립보드에 복사되었습니다!
관리 포털에서 통합 오류를 확인하여 트래픽을 3scale로 보고하는 문제를 확인할 수도 있습니다. https://YOUR_DOMAIN-admin.3scale.net/apiconfig/errors 을 참조하십시오.
통합 오류 중 하나는 밑줄s_in_headers
지시문이 server 블록에서 활성화되지 않은 헤더에 자격 증명을 보낼 수 있습니다.
12.3.6. 클라이언트 API 게이트웨이 링크 복사링크가 클립보드에 복사되었습니다!
12.3.6.1. 공용 인터넷에서 API 게이트웨이에 연결할 수 있습니까? 링크 복사링크가 클립보드에 복사되었습니다!
브라우저를 게이트웨이 서버의 IP 주소(또는 도메인 이름)로 지정해 봅니다. 이 작업이 실패하면 관련 포트에서 방화벽을 열 수 있는지 확인합니다.
12.3.6.2. 클라이언트에서 API 게이트웨이에 연결할 수 있습니까? 링크 복사링크가 클립보드에 복사되었습니다!
가능한 경우 이전에 설명된 방법 중 하나를 사용하여 클라이언트의 API 게이트웨이에 연결하십시오(telnet, curl 등). 연결에 실패하면 이 둘 사이의 네트워크에 문제가 있습니다.
그렇지 않으면 API에 대한 호출을 수행하는 클라이언트 문제를 해결하기 위해 이동해야 합니다.
12.3.7. 클라이언트 링크 복사링크가 클립보드에 복사되었습니다!
12.3.7.1. 다른 클라이언트를 사용하여 동일한 호출을 테스트합니다. 링크 복사링크가 클립보드에 복사되었습니다!
요청이 예상 결과를 반환하지 않으면 다른 HTTP 클라이언트로 테스트합니다. 예를 들어 Java HTTP 클라이언트를 사용하여 API를 호출하고 문제가 있는 경우 cURL과 교차 점검합니다.
클라이언트와 게이트웨이 간의 프록시를 통해 API를 호출하여 클라이언트에서 전송하는 정확한 매개변수와 헤더를 캡처할 수도 있습니다.
12.3.7.2. 클라이언트에서 보낸 트래픽 검사 링크 복사링크가 클립보드에 복사되었습니다!
Redreshark와 같은 도구를 사용하여 클라이언트가 요청하는 요청을 확인합니다. 이를 통해 클라이언트가 API 및 요청 세부 정보를 호출하는지 확인할 수 있습니다.