У меня есть статический контент, который обслуживает Cloudflare. Cloudflare указывает на Amazon S3, чтобы получить статический контент и передать его через CNAME (cdn.mydomain.com). Корзина настроена правильно, и все работало нормально в течение нескольких месяцев до пятницы, когда я начал получать запросы в моем браузере по истечении времени ожидания. Я убедился, что контент по-прежнему доступен через S3, и открыл тикет с помощью Cloudflare. Cloudflare сообщил, что «похоже, что что-то в Amazon, вероятно, блокирует запросы с наших IP-адресов», и что они видели следующие сообщения в своих журналах:
upstream timed out (110: Connection timed out) while reading response header from upstream cdn.mydomain.com
upstream prematurely closed connection while reading response header from upstream cdn.mydomain.com
Вот что у меня уже было в моем CORS файле.
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<MaxAgeSeconds>3000</MaxAgeSeconds>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
Стоит ли ставить * в AllowedHeader? Нужно ли явно указывать IP-адреса Cloudflare? Что мне не хватает, чтобы избежать блокировки?
Есть ли причина, по которой вы не используете Amazon? CloudFront распространение, поддерживаемое корзиной S3 для обслуживания вашего статического контента? Должен быть более эффективным, чем CloudFlare -> S3, и если Amazon действительно блокирует доступ CloudFlare к S3 (хотя это не имеет особого смысла, зачем они это делают), это больше не будет проблемой для вас.
Вы также сможете привязать свое имя хоста cdn.mydomain.com к [distribution_id] .cloudfront.net, чтобы сохранить схему URL и сделать переход прозрачным для ваших пользователей. CloudFront работает очень похоже на CloudFlare, в том смысле, что их IP-адреса маршрутизируются по протоколу BGP в ближайшее место по всему миру, однако у Amazon будут более эффективные внутренние системы извлечения CloudFront -> S3.
Насколько я помню, передача данных между S3 и CloudFront бесплатна, так что за пропускную способность вы заплатите не намного больше (если вообще платите).