Cloudflare + Docker + LaravelでHTTP/3が原因でモバイルだけ通信エラーになった話
はじめに
バイク中古・新車一括検索プラットフォーム「MotoHub」に、写真を送るだけでAIが車種を判定する機能を実装しました。
機能自体は完成したのに、WiFiでは動くのにモバイル回線(5G)だと即座に通信エラーになるという謎の現象が発生しました。
原因は HTTP/3(QUIC) でした。同じ症状で詰まっている方の参考になれば。
症状
- WiFi環境 → 正常に動作、バイク車種を判定できる
- モバイル回線(5G/4G)→ 即座に「通信エラーが発生しました」
- エラーはすぐに出る(タイムアウトではない)
- Laravelのログには何も残らない
- Nginxのアクセスログにもリクエストが届いていない
「サーバーは動いているのに、リクエストがサーバーに届いていない」という不思議な状態でした。
構成
iPhoneモバイル回線
↓
Cloudflare(CDN / セキュリティ)
↓
さくらVPS
↓
Docker
├── Nginx(webコンテナ)
└── PHP-FPM(appコンテナ / Laravel)
調査の流れ
① Laravelのログを確認 → 何もない
docker compose exec app tail -f storage/logs/laravel.log
モバイルでリクエストを送っても、ログに何も出ない。サーバーに届いていない。
② Nginxのアクセスログを確認 → 何もない
docker compose exec web tail -f /var/log/nginx/access.log
同様に何も出ない。Nginxにも届いていない。
③ ローカルから直接叩く → 200 OK
curl -I http://localhost
# HTTP/1.1 200 OK ← 正常
VPS自体は正常に動いている。
④ Cloudflareのアクセスログを確認 → 犯人発見
Cloudflare → Security → Analytics でログを確認すると…

Method: POST
Scheme: HTTP/3
Host: motohub.jp
Path: /bikes/identify
ASN: 138384 - Rakuten Mobile Network
HTTP/3(QUIC) でリクエストが来ていました。
原因
モバイル回線(特に楽天モバイル・au等)はHTTP/3を優先的に使います。
HTTP/3はUDPベースのQUICプロトコルを使用しており、TCPベースのHTTP/1.1やHTTP/2とは根本的に異なります。
NginxはデフォルトでHTTP/3に対応していないため、CloudflareからのHTTP/3リクエストがVPSのNginxに届かず、Cloudflareが502を返していました。

解決策
CloudflareでHTTP/3をオフにする。
Cloudflare → Speed → Settings → Protocol Optimization タブ

HTTP/3をオフにすると、モバイル回線もHTTP/2にフォールバックされます。
これだけで解決しました。
なぜWiFiでは動いていたのか
WiFi環境(自宅・オフィス等)はHTTP/2を使うことが多く、HTTP/3を優先しないルーターが多いためです。
モバイル回線は最新プロトコルの普及が早く、5G端末はHTTP/3を積極的に使います。そのため「WiFiは動く、モバイルは動かない」という症状になっていました。
根本的な解決策(NginxでHTTP/3対応)
今回はCloudflareの設定変更で対処しましたが、本来はNginxをHTTP/3対応させるのが正攻法です。
ただしNginxのHTTP/3対応はまだ実験的(nginx 1.25以降)で、Docker環境での設定が複雑なため、個人開発では「CloudflareでHTTP/3をオフ」の方が現実的です。
まとめ
| 確認したこと | 結果 |
|---|---|
| Laravelログ | 何も出ない |
| Nginxアクセスログ | 何も出ない |
| curl で直接叩く | 200 OK |
| Cloudflareのログ | HTTP/3でリクエストが来ていた |
WiFiは動くのにモバイルだけ動かない場合、HTTP/3を疑ってみてください。
特にCloudflare + Nginx(HTTP/3未対応)の構成では同じ症状が出やすいです。
前回の記事:GPT-4o vs Claude Sonnet vs Gemini、バイク画像認識で比較してみた
次回:個人開発のMotoHubにGSC分析→SEO改善を実施した話
🏍 MotoHub: https://motohub.jp
X: https://x.com/motohub_jp
GitHub: https://github.com/ausssxi/MotoHub