リクエストの処理方法

このドキュメントでは、App Engine アプリケーションがリクエストを受信してレスポンスを送信する方法について説明します。詳細については、リクエスト ヘッダーのリファレンスをご覧ください。

アプリケーションでサービスを使用している場合は、リクエストの送信先を特定のサービスまたはそのサービスの特定のバージョンに指定できます。サービスのアドレス指定の方法について詳しくは、リクエストのルーティング方法をご覧ください。

リクエストの処理

アプリケーションは、ウェブサーバーの起動とリクエストの処理を行う役割を果たします。開発言語で使用できる任意のウェブ フレームワークを使用できます。

App Engine はアプリケーションの複数のインスタンスを実行します。各インスタンスには、リクエストを処理する独自のウェブサーバーが割り当てられます。どのようなリクエストも任意のインスタンスにルーティングできるため、同じユーザーからの連続するリクエストが同じインスタンスに送信されるとは限りません。インスタンスは、複数のリクエストを同時に処理できます。インスタンスの数は、トラフィックの変化に応じて自動的に調整されます。また、app.yaml ファイルの max_concurrent_requests 要素を設定することで、インスタンスが同時に処理できるリクエストの数を変更できます。

次の例には、新しい Silex Application オブジェクトを作成し、サーバーを起動して、2 つの GET リクエストに応答する PHP コードが含まれています。

require_once __DIR__ . '/../vendor/autoload.php';

$app = new Silex\Application();

$app->get('/', function () {
    return 'Hello World';
});

$app->get('/goodbye', function () {
    return 'Goodbye World';
});

// @codeCoverageIgnoreStart
if (PHP_SAPI != 'cli') {
    $app->run();
}
// @codeCoverageIgnoreEnd

return $app;

このサンプルでは Silex を使用していますが、他の PHP ウェブ フレームワークを使用することもできます。

割り当てと制限

App Engine は、トラフィックが増加すると、アプリケーションにリソースを自動的に割り当てます。ただし、次のような制限があります。

  • App Engine は、1 秒未満でリクエストに応答するレイテンシが短いアプリケーション向けに、自動スケーリングのための容量を予約しています。レイテンシが(多くのリクエストで 1 件あたり 1 秒を超えるほど)非常に大きく、スループットの高いアプリケーションの場合は、シルバー、ゴールド、プラチナのいずれかのサポートが必要です。これらのレベルのサポートを契約済みの場合は、サポート担当者に連絡してスループットの上限の引き上げをリクエストできます。

  • また、CPU の制約を大きく受けるアプリケーションでも、同じサーバー上の他のアプリケーションとリソースを効率的に共有するために、追加のレイテンシが生じる場合があります。静的ファイルへのリクエストには、このようなレイテンシの制限がありません。

アプリケーションが受信する各リクエストは、[リクエスト数] の制限対象としてカウントされます。リクエストへのレスポンスとして送信されるデータは、[送信帯域幅(課金対象)] の制限対象としてカウントされます。

HTTP リクエストと HTTPS(セキュア)リクエストのどちらにも、リクエスト数受信帯域幅(課金対象)送信帯域幅(課金対象)の制限が適用されます。GCP Console の割り当ての詳細ページでも、参考のために安全なリクエスト数安全な受信帯域幅安全な送信帯域幅がそれぞれ報告されます。これらの値としてカウントされるのは、HTTPS リクエストのみです。詳細については、[割り当て] ページをご覧ください。

リクエスト ハンドラの使用には、具体的には次の制限が適用されます。

リクエストに関する制限事項

  • リクエスト ヘッダー内では最大 15 KB のサイズが許可されます。
  • リクエストの合計サイズは 32 MB までに制限されます。
  • すべての HTTP/2 リクエストは、アプリケーション サーバーに転送される際に HTTP/1.1 リクエストに変換されます。
  • SSL 接続はロードバランサで終了されます。ロードバランサからのトラフィックは暗号化されたチャネルを介してインスタンスに送信されてから、HTTP でアプリケーション サーバーに転送されます。X-Forwarded-Proto ヘッダーを確認すると、元のリクエストが HTTP であったか HTTPS であったかがわかります。

レスポンスに関する制限事項

  • レスポンスは 64k ブロック単位でバッファリングされます。
  • レスポンス サイズに制限はありません。
  • レスポンス時間の制限は 1 時間です。

サポートされていない HTTP リクエスト

次に示す機能は、App Engine フレキシブル環境ではサポートされません。

  • バックエンド サービスへの HTTP/2 トラフィック
  • WebSocket
  • インスタンスに直接アクセスする HTTP リクエスト

リクエスト ヘッダー

着信した HTTP リクエストには、クライアントから送信された HTTP ヘッダーが含まれています。セキュリティ上の理由から、一部のヘッダーは、アプリケーションに到達する前に中間プロキシによってサニタイズ(リスクのある部分などを削除)または修正されます。

詳細については、リクエスト ヘッダーのリファレンスをご覧ください。

リクエストのレスポンス

App Engine は、$_REQUEST 配列が設定されたスクリプトを呼び出し、このスクリプトからの出力をバッファリングして、スクリプトの実行が完了すると、バッファリングされた出力をエンドユーザーに送信します。

生成するレスポンスには制限があり、レスポンスはクライアントに返される前に変更される可能性があります。

バッファリングの無効化

App Engine からのすべてのレスポンスは、デフォルトでは 64k ブロック単位でバッファリングされます。場合によっては、バッファリングを無効にして、クライアントにバイトを直接ストリーミングする方が合理的なことがあります。一般的に、ハンギング GET または Server Sent Event(SSE)を使用しているときはこの方法が推奨されます。バッファリングを無効にするには、X-Accel-Buffering レスポンス ヘッダーを no に設定します。

X-Accel-Buffering: no

HTTPS 接続の強制

セキュリティ上の理由から、すべてのアプリケーションは、https で接続するようクライアントに促すべきです。Strict-Transport-Security ヘッダーを使用すると、特定のページまたはドメイン全体で https よりも http を優先するようブラウザに指示できます。例:

Strict-Transport-Security: max-age=31536000; includeSubDomains
このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

PHP の App Engine フレキシブル環境に関するドキュメント