У меня есть сайт, обслуживаемый с S3 с помощью Nginx со следующей конфигурацией 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://my-bucket.s3-website-us-west-2.amazonaws.com;
expires 30d;
}
В настоящее время всякий раз, когда я создаю новую версию, я просто удаляю содержимое целевой корзины и загружаю в нее новые файлы внешнего интерфейса.
Поскольку я удаляю содержимое корзины, я не могу вернуться к предыдущей версии внешнего интерфейса, даже если в корзине включено управление версиями. Итак, вы хотите загрузить новые файлы внешнего интерфейса в каталог версии (например, 15
) в корзине S3, а затем настроить перенаправление с http://my-bucket.s3-website-us-west-2.amazonaws.com/latest
на http://my-bucket.s3-website-us-west-2.amazonaws.com/15
.
кто-нибудь знает, как это можно сделать?
Есть несколько способов сделать это:
Проще всего через символическая ссылка, если это позволяет ваша среда.
ln -fhs ./15 ./latest
Другим вариантом является явный внешний redirect
, выданный пользователю, где пользователь увидит новый URL-адрес; это имеет преимущество в том, что к нескольким версиям можно получить доступ одновременно без каких-либо проблем с синхронизацией, например, если клиент решит выполнить частичную загрузку, все должно быть под рукой, потому что он, скорее всего, будет выполнять частичная загрузка на реальную цель, а не на ярлык /latest
.
location /latest {
rewrite ^/latest(.*) /15$1 redirect;
}
Последний вариант — внутреннее перенаправление в nginx; это обычно называется маскировкой URL-адресов в некоторых сторонних приложениях; это может быть рекомендовано или не рекомендовано в зависимости от требований; очевидным недостатком будет частичная загрузка, когда возобновление большой загрузки может привести к повреждению файлов:
location /latest {
rewrite ^/latest(.*) /15$1 last;
}
Использованная литература:
Одним из простых способов справиться с этой ситуацией является использование переменных. Вы можете легко импортировать файл, чтобы установить текущую последнюю версию. Вам нужно будет перезагрузить конфигурацию nginx при обновлении версии с помощью этого метода.
# /path/to/latest.conf
set $latest 15;
server {
listen 80 default_server;
server_name localhost;
# SET LATEST
import /path/to/latest.conf;
location / {
proxy_pass http://s3host;
expires 30d;
}
# Note the / at the end of the location and the proxy_pass directive
# This will strip the "/latest/" part of the request uri, and pass the
# rest like so: /$version/$remaining_request_uri
location /latest/ {
proxy_pass http://s3host/$latest/;
expires 30d;
}
...
}
Другой способ сделать это динамически — использовать lua для написания сценария такого поведения. Это немного сложнее, поэтому я не буду вдаваться в этот ответ.