2017-09-07 2 views
1

우리 팀은 Slim PHP를 라우터로 사용하여이 RESTful API를 개발했으며 MySQL과 ORM을 Propel으로 개발하여이 앱과 함께 Google App Engine의 서비스로 배포했습니다 앱 엔진 로그인으로Google App Engine 오류 코드 204가있는 PHP55 무작위 서버 충돌 (500's)

500 Server Error Error: Server Error The server encountered an error and could not complete your request. Please try again in 30 seconds.

: .yaml 설정

service: api 
runtime: php55 
api_version: 1 
threadsafe: yes 

instance_class: F1 
automatic_scaling: 
    min_idle_instances: automatic 
    max_idle_instances: automatic 
    min_pending_latency: automatic 
    max_pending_latency: automatic 

skip_files: 
- ^vendor/(.*/)+[Tt]ests/.*$ 
- ^\.(.*) 

handlers: 
- url: .* 
script: app.php 

가 Ember.js 웹 응용 프로그램에 의해 소비되는 모든 개발을 통해 우리는 이상한 patternless 서버가 더 정확하게 500S를, 충돌 받았어요 . 그렇지 않으면 시간의 99 잘 %를 작동 랜덤 엔드 포인트에서

A problem was encountered with the process that handled this request, causing it to exit. This is likely to cause a new process to be used for the next request to your application. (Error code 204)

, 우리는 물론, 이러한 임의 충돌과 생산에가는 기분이 안.

우리가 시도하는 것 :

  1. 우리가 열고 연결마다 요청을 닫습니다 때문에 MySQL의 max_connections의 도달되고 있는지 여부를 확인.
  2. 우리가 메모리가 부족해질 가능성을 해결하기 위해 테스트를 위해 F1에서 우리의 인스턴스를 F4_1G로 업그레이드합니다.
  3. dev_appserver.py로 로컬 호스트의 스트레스 테스트 (여기서는 아무런 크래시가 발생하지 않습니다.)
  4. 슬림 앱 전체를 디버깅 용으로 잡으십시오. 실제로 예외를 잡아 내지 못합니다. Google App Engine과 관련있는 항목)

다음은 일반적인 요청 흐름의 일부 코드입니다.

app.php

/* 
* Create SLIM application 
*/ 
$app = new \Slim\App([ 
    "settings" => [ 
     "determineRouteBeforeAppMiddleware" => true, 
    ] 
]); 

//Custom Authentication middleware 
    $app->add(new \OAuth2Server\SlimAuthenticationMiddleware()); 

//CORS and Headers Middleware 
    $app->add(function($request, $response, $next) { 

     $response = $next($request, $response); 

     $response = $response->withHeader("Access-Control-Allow-Origin", "*"); 
     $response = $response->withHeader("Access-Control-Allow-Headers", "Content-Type, authorization"); 
     $response = $response->withHeader("Access-Control-Allow-Methods", "POST, GET, PATCH, DELETE, OPTIONS"); 
     $response = $response->withHeader("content-type", "application/json; charset=utf8"); 

     return $response; 

    }); 


    require_once("router.php"); 

    $app->run(); 

router.php

$app->get($apiVersionPath.'/visits/{id}','\Controllers\Visits:get') 
    ->add(new \OAuth2Server\ValidateRequestUser(array("doctor", "nurse","superuser","admin"))); 

방문 컨트롤러 GET/ID 관련 코드.

/** 
    * @param Request $request 
    * @param Response $response 
    * @param []$args 
    * @return Response 
    */ 
    public function get($request, $response, $args) { 

     $id = $request->getAttribute("route")->getArgument("id"); 

     $serializer = new Serializer(); 

     if(!is_numeric($id) || $id == 0){ 
        throw new InvalidArgumentException("Invalid Argument"); 
     } 

     $visit = \VisitQuery::create() 
        ->useUserQuery() 
        ->filterByClientId($request->getAttribute("user")->getClientId()) 
        ->endUse(); 

     $visit = $visit->findPk($id); 

     if(!isset($visit) || !($visit instanceof \Visit)){ 
        throw new EntityNotFoundException("Visit not found"); 
     } 

     $resource = $visit->toResource(false); 

     $serializer->addResource($resource); 

     $body = $response->getBody(); 
     $body->write($serializer->serialize()); 
     return $response; 

} 
+1

[이 문제] (https://issuetracker.google.com/issues/35900014)에 따르면 204는 일반적으로 메모리 문제를 의미합니다. 인스턴스 유형을 부딪히는 것이 도움이되지 않았고 패턴이 관찰되지 않았기 때문에 누군가가 용의자를 알게되거나 가능한 설명이있는 경우 앱 코드를 추가 할 것을 제안 할 수 있습니다. –

+0

감사합니다 @ DanCornilescu, 방금 요청 흐름의 일부 코드를 추가했습니다 –

답변

2

PHP 플렉스 엔진에서 API 서비스를 실행하고 자동 크기 조정을 사용할 때 비슷한 문제가 발생했습니다. 이 문제를 해결하려면 인스턴스 클래스 (F2로 시도)를 늘려야하고 항상 min_idle_instances을 2로 설정하여 인스턴스를 두 개 이상 실행해야합니다.

또한 표준 버전의 App 대기열 및 기본 배율 사용시 엔진. 그것은 아직 당신이 그 일을하는 것처럼 보이지 않지만 만약 그렇다면, 우리가 발견 한 유일한 해결책은 푸시 대기열에 작업을 추가 할 때 헤더 '빠른 실패'queue.yaml에서 재 시도를 활성화하고 설정하는 것이 었습니다 :

$pushTask = new PushTask($handler, 
    array('message_data' => json_encode($message)), 
    array('header'=> 'X-AppEngine-FailFast:true')); 

그렇지 않으면 작업 그룹이 204 오류와 함께 실패합니다.

내게 관심사가되는 점 중 하나는 HTTP 요청을하려는 것처럼 보입니다.우리는, 우리가 오류가 발생했습니다

$memCache = new Memcache; 
$memCache->set($_SERVER['HTTP_X_APPENGINE_TASKNAME'] . '_1', 'Test 1'); 
ch = curl_init(); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); 
curl_setopt($ch, CURLOPT_POSTFIELDS, 'hi'); 
curl_setopt($ch, CURLOPT_URL, 'https://www.google.com'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
set($_SERVER['HTTP_X_APPENGINE_TASKNAME'] . '_' . $index, $message); 
$response = curl_exec($ch); 
$memCache->set($_SERVER['HTTP_X_APPENGINE_TASKNAME'] . '_2', 'Test 2'); 

언제 : 우리의 모든 테스트에서 몇 가지 방법 중 하나는 우리가했던 큐에 작업의 수백을 삭제하고 그들 각각 다음 코드를 실행함으로써 오류를 재현 할 수 있었다 Memcache에서 {TASK_NAME}_1 키의 첫 번째 메시지를 찾을 수 있었지만 두 번째 항목 {TASK_NAME}_2을 찾을 수 없었습니다. 그리고 당신이 말했듯이, 모든 스크립트가 죽기 때문에 어떤 예외도 잡히지 않습니다.

extension = php_curl.dll 

그러나 우리는 확실한 대답을하지 않습니다

이 동작

우리가 우리가 본격적인 버전을 사용하고 있기 때문에 컬 구글의 구현에 문제가있을 수 있습니다 생각했다. 우리를위한 유일한 해결책은 인스턴스 수를 늘리고 코드를 수행하기위한 재시도에 의존하는 것입니다.

위의 해결 방법 중 하나가 도움이 되었기를 바랍니다. 기회가 생기면 PHP.ini 파일에 무엇이 있는지 알려주십시오.

+0

솔직히 말해서, 우리는이 apc.cache_by_default = "0"(우리는 인터넷 검색을하는 동안이 방법을 찾았습니다) 나머지는 php.ini에서 시도했습니다. 나머지는 GAE에서 기본 php.ini 의 php55와 같습니다. queue.yaml에 대한 참조가 있습니까? –