📤

Nginx+PHPの環境でサイズの大きいファイルをアップロードする ~CloudRun編~

に公開

経緯

https://zenn.dev/karabiner_inc/articles/b411b73fe81f24
こちらの記事の続きです。

続きと言っても、やってることは前回と全然別の内容になるので、読まなくても大丈夫です。

動作環境・前提

CloudRunのマルチコンテナ(サイドカー)で、NginxとPHPの2つのコンテナを立てています。

バージョン
PHP 8.3.6
Nginx 1.29.0

対象者

  • サイズの大きいファイルをアップロードしようとした時、ローカル環境だと成功するのに本番環境だと失敗する方
  • CloudRunの設定の仕方がわからない方

本題

最初に、以下のドキュメントに次のような記述があるのをご確認ください。
https://cloud.google.com/run/quotas?hl=ja#request_limits

説明 上限
HTTP/1 リクエストの最大サイズ HTTP/1サーバーを使用する場合は32 MiB。HTTP/2サーバーを使用する場合は無制限。

「HTTP/2サーバーを使用する場合は無制限」だそうです。つまり、HTTP/2サーバーが使えれば、サイズの大きいファイルもアップロードできるはず。

というわけで、今回の問題は、CloudRunの設定でHTTP/2サーバーを使用するよう強制すれば解決します。

単純にCloudRunの設定だけ変えてもダメで、Nginxの設定も合わせて変更して再デプロイする必要があります。

CloudRunの設定

Cloud ConsoleからCloudRunの画面を開いて設定します。

「新しいリビジョンの編集とデプロイ」を押してください。

すると、CloudRunサービスの細かい設定変更ができる画面が出てくるので、その中の「ネットワーキング」のタブを開きます。

このタブの中にある「HTTP/2 エンドツーエンドを使用する」にチェックを入れてください。

これで、CloudRunの設定は完了です。

Nginxの設定

続いて、Nginxの設定をしていきます。
NginxがHTTP/2でのアクセスを受け取れるように設定ファイルを修正して、再デプロイします。

default.conf
server {
    listen 8080 http2;
    # 以下省略
}

listenするポートを設定しているところに、http2というワードを追記します。
これで、NginxがHTTP/2によるアクセスを受け取れるようになりました。

上記のCloudRunとNginxの設定は、どちらからやっても問題ありません。
ただ、どちらかの設定を反映した時点でもう一方の設定が噛み合わなくなり、その間WebページやAPIにはアクセスできなくなる場合があります。
なので、作業するときは出来るだけ同じタイミングでやるのが望ましいと思います。

最後に

この記事の内容、やってること自体はとても簡単なので知ってたら一発だと思うんですが、僕の場合はなかなか自分の環境に合った内容の記事やドキュメントが見つからなくて苦戦してしまいました、、

参考にさせてもらった記事(参考文献をご参照ください)ではNginxの設定が僕の記事と違うんですが、これは僕の環境で同様の設定にするとデプロイに失敗してしまうためです。
環境が同じでもデプロイ方法が違うとかで上手くいかない場合があるかもしれないので、もしこの記事の方法で試して上手くいかなければそういうことかなと思って別のやり方を探してみてください。
そして、ぜひ「この環境だとこういう方法・こういう設定じゃないと無理だった」みたいな話があったらコメントで教えてください。

参考文献

https://qiita.com/omillefeuillebot/items/ab8e2ad972df1dcfe3fa
https://cloud.google.com/run/quotas?hl=ja

カラビナテクノロジー デベロッパーブログ

Discussion