요청 처리 방법

이 문서는 App Engine 애플리케이션이 요청을 수신하고 응답을 전송하는 방법을 설명합니다. 자세한 내용은 요청 헤더 참조를 참조하세요.

애플리케이션이 서비스를 사용한다면 요청 주소를 특정 서비스 또는 해당 서비스의 특정 버전으로 지정할 수 있습니다. 서비스 주소 지정에 대한 자세한 내용은 요청 라우팅 방법을 참조하세요.

요청 처리

애플리케이션은 웹 서버를 시작하고 요청을 처리합니다. 개발 언어에서 사용할 수 있는 모든 웹 프레임워크의 사용이 가능합니다.

App Engine은 애플리케이션의 여러 인스턴스를 실행하며, 각 인스턴스에는 요청 처리를 위한 자체 웹 서버가 있습니다. 요청이 임의의 인스턴스로 라우팅될 수 있으므로, 동일한 사용자의 연속 요청이 같은 인스턴스로 전송되지 않을 수 있습니다. 인스턴스 한 개가 여러 요청을 동시에 처리할 수 있습니다. 트래픽 변화에 따라 인스턴스 수가 자동으로 조정될 수 있습니다. 또한 app.yaml 파일에서 max_concurrent_request 요소를 설정하여 인스턴스 한 개가 동시에 처리할 수 있는 요청 수를 변경할 수 있습니다.

다음의 예는 웹 클라이언트에서 루트 경로('/')로 이루어지는 모든 요청에 'Hello, world!'라는 메시지를 표시하여 응답하는, 파일 1개로 구성된 아주 기본적인 Flask 애플리케이션입니다.

import logging

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    """Return a friendly HTTP greeting."""
    return 'Hello World!'

@app.errorhandler(500)
def server_error(e):
    logging.exception('An error occurred during a request.')
    return """
    An internal error occurred: <pre>{}</pre>
    See logs for full stacktrace.
    """.format(e), 500

if __name__ == '__main__':
    # This is used when running locally. Gunicorn is used to run the
    # application on Google App Engine. See entrypoint in app.yaml.
    app.run(host='127.0.0.1', port=8080, debug=True)

할당량 및 한도

App Engine은 트래픽 증가에 따라 애플리케이션에 리소스를 자동으로 할당합니다. 하지만 여기에는 다음과 같은 제한이 적용됩니다.

  • App Engine은 지연 시간이 짧은 애플리케이션, 즉 요청에 응답하는 시간이 1초 미만인 애플리케이션을 위해 자동 확장 용량을 예약합니다. 지연 시간이 매우 길고(여러 요청 처리 시 요청당 1초 이상) 처리량이 많은 애플리케이션에는 실버, 골드 또는 플래티넘 지원이 필요합니다. 이러한 수준의 지원을 받고 있는 고객은 지원 담당자에게 연락하여 처리량 한도를 높여 달라고 요청할 수 있습니다.

  • CPU에 따른 제약이 많은 애플리케이션에서도 같은 서버의 다른 애플리케이션과 효율적으로 리소스를 공유하기 위해 지연 시간이 추가로 발생할 수 있습니다. 정적 파일에 대한 요청은 지연 시간 제한에서 제외됩니다.

애플리케이션에 수신되는 각 요청은 요청 제한에 포함됩니다. 요청에 대한 응답으로 보낸 데이터는 발신 대역폭(청구 가능 용량) 제한에 포함됩니다.

HTTP 요청과 HTTPS(보안) 요청 모두 요청, 수신 대역폭(청구 가능), 발신 대역폭(청구 가능) 제한에 포함됩니다. GCP 콘솔의 할당량 세부정보 페이지에서도 정보 제공을 위해 보안 요청, 보안 수신 대역폭, 보안 발신 대역폭이 별도의 값으로 보고됩니다. HTTPS 요청 수만 이러한 값에 포함됩니다. 자세한 내용은 할당량 페이지를 참조하세요.

다음은 요청 핸들러 사용 시 적용되는 한도입니다.

요청 한도

  • 요청 헤더에 최대 15KB까지 허용됩니다.
  • 요청의 총 크기는 32MB로 제한됩니다.
  • 모든 HTTP/2 요청은 애플리케이션 서버로 전달될 때 HTTP/1.1 요청으로 변환됩니다.
  • SSL 연결은 부하 분산기에서 종료됩니다. 부하 분산기의 트래픽은 암호화된 채널을 통해 인스턴스에 전송된 다음 HTTP를 통해 애플리케이션 서버로 전달됩니다. X-Forwarded-Proto 헤더를 통해 원본 요청이 HTTP인지 HTTPS인지를 알 수 있습니다.

응답 한도

  • 응답은 64k 블록으로 버퍼링됩니다.
  • 응답 크기는 무제한입니다.
  • 응답 시간 제한은 1시간입니다.

지원되지 않는 HTTP 요청

다음 기능은 App Engine 가변형 환경에서 지원되지 않습니다.

  • 백엔드 서비스로 가는 HTTP/2 트래픽
  • 웹소켓
  • 인스턴스에 직접 액세스하는 HTTP 요청

요청 헤더

수신되는 HTTP 요청에는 클라이언트가 보낸 HTTP 헤더가 포함되어 있습니다. 보안을 위해 일부 헤더는 애플리케이션에 도달하기 전에 중간 프록시를 통해 삭제 또는 수정됩니다.

자세한 내용은 요청 헤더 참조를 참조하세요.

요청 응답

App Engine은 Request로 핸들러 스크립트를 호출하고 스크립트가 반환될 때까지 기다립니다. 표준 출력 스트림에 작성된 모든 데이터가 HTTP 응답으로 전송됩니다.

생성하는 응답에는 한도가 적용되며, 응답이 클라이언트에 반환되기 전에 수정될 수 있습니다.

버퍼링 사용 중지

기본적으로 App Engine의 모든 응답은 64k 블록으로 버퍼링됩니다. 경우에 따라 버퍼링을 사용 중지하고 클라이언트에 직접 바이트를 스트리밍하는 편이 더 나을 수 있습니다. 지연 GET 또는 서버 전송 이벤트(SSE)를 사용하는 경우 일반적으로 이 방법이 선호됩니다. 버퍼링을 사용 중지하려면 X-Accel-Buffering 응답 헤더를 no로 설정하면 됩니다.

X-Accel-Buffering: no

HTTPS 연결 강제 적용

보안을 위해 모든 애플리케이션은 클라이언트가 https를 통해 연결하도록 권장해야 합니다. Strict-Transport-Security 헤더를 사용하여, 브라우저가 지정된 페이지 또는 전체 도메인과 관련하여 https보다 http를 선호하도록 안내할 수 있습니다. 예를 들면 다음과 같습니다.

Strict-Transport-Security: max-age=31536000; includeSubDomains

HTTP 보안 헤더 설정을 처리하는 flask-talisman 라이브러리를 사용해도 됩니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

App Engine flexible environment for Python docs