Я пытаюсь серверировать статический сайт через Cloudfront (и S3). У меня включена корзина S3 my-bucket со статическим хостингом веб-сайтов. NGINX маршрутизирует трафик на основе пути. местоположение /, /beta/, /static/app/ переходит в облако, поэтому я создал Исходное доменное имя и путь и Идентификатор происхождения для
my-bucket.s3.amazonaws.com/beta = S3-my-bucket/beta
my-bucket.s3.amazonaws.com/admin = S3-my-bucket/admin
my-bucket.s3.amazonaws.com = S3-my-bucket
И сопоставил поведение с
/бета -> S3-мое-ведро/бета
/admin -> S3-мое ведро/admin
По умолчанию (*) -> S3-мое-ведро
У меня следующая конфигурация Nginx
server {
listen 80 default_server;
server_name localhost;
keepalive_timeout 70;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript;
location / {
proxy_pass http://XXXXXX.cloudfront.net;
proxy_set_header Host $host;
}
location /beta/ {
proxy_pass http://XXXXXX.cloudfront.net/beta/;
}
location /static/app/ {
rewrite ^/static/app/(.*)$ /$1 break;
proxy_pass http://XXXXXX.cloudfront.net;
}
}
Когда я пытаюсь открыть свой URL-адрес, указывающий на этот Nginx, я получаю
403 ERROR
The request could not be satisfied.
Bad request.
Generated by cloudfront (CloudFront)
Request ID: 3yYfFbg1ObQ4B-3oco1HYWK46CWh7E8XZOBVl_sdQ6rKMZ4JYZ_KeQ==
Но если я укажу конфигурацию Nginx на URL-адрес моей корзины proxy_pass http://my-bucket.s3-website-us-west-2.amazonaws.com вот так
server {
listen 80 default_server;
server_name localhost;
keepalive_timeout 70;
gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css application/json application/x-javascript application/javascript text/xml application/xml application/xml+rss text/javascript;
location / {
proxy_pass http://my-bucket.s3-website-us-west-2.amazonaws.com/;
}
location /beta/ {
proxy_pass http://my-bucket.s3-website-us-west-2.amazonaws.com/beta/;
}
location /static/app/ {
rewrite ^/static/app/(.*)$ /$1 break;
proxy_pass http://my-bucket.s3-website-us-west-2.amazonaws.com;
}
}
все работает как положено.
Что мне нужно изменить, чтобы он работал через облачный фронт?
CloudFront только для кеширования, никаких других причин. Без изменения основного URL-адреса proxy_set_header Host $host; на URL-адрес облачного интерфейса.
У вас есть proxy_pass http://, но CloudFront настроен на перенаправление HTTP на HTTPS. Измените на proxy_pass https://... или настройте CloudFront с политикой протокола просмотра: HTTP и HTTPS в каждом поведении кэша.
CloudFront не выполняет никакого значимого кэширования для вас в этой настройке. С DNS → Nginx → CloudFront → S3 каждый запрос по-прежнему обслуживается через ваш сервер Nginx, и CloudFront не кэширует контент рядом с браузеры — он кэширует только контент рядом с сервером Nginx, который в любом случае предположительно находится рядом с корзиной, поэтому ничего не получается. . Настройка, которую вы, вероятно, хотите, это DNS → CloudFront → { Nginx или S3 }, где поведение кэша CloudFront сопоставляет пути для корзин и для сервера Nginx и выбирает цель. Таким образом, CloudFront может кэшировать рядом со средством просмотра, которое всегда связывается с ним первый.

Удаление
proxy_set_header Host $host;, вероятно, исправит ошибку, поэтому, пожалуйста, подтвердите это... но есть более серьезная проблема с вашей настройкой... Nginx → CloudFront → S3 не имеет смысла для меня в этом приложении, если только вы не используете CloudFront по той причине, что ведро находится в другом регионе AWS, чем Nginx, и даже в этом случае обоснование довольно мягкое. По какой причине вы делаете это таким образом?