Упрощение публикации сайта в Amazon S3

12 April 2015 #amazon#ruby#java#web

Ранее я уже затрагивал тему размещения сайта в сервисе Amazon S3 в статьях: Оптимизация сайта для Amazon S3 и Amazon S3 and Cache Control. Для передачи файлов на сервера амазона использовалась отдельная программа s3cmd. Скорость загрузки оставляла желать лучшего, и управление заголовками кеширования было затруднительно, не говоря уже про необходимость сжимать готовые файлы gzip. Но теперь ситуация значительно упростилась с появлением утилиты s3_website.

Для её использования на компьютере должны быть установлены Ruby и Java. Устанавливаем утилиту:

$ sudo gem install s3_website

Или прописываем s3_website в Gemfile и проводим установку с помощью bundle.

Для создания файла конфигурации используется команда:

$ s3_website cfg create

Примеры заполнения созданного файла конфигурации приведены на официальной странице и на странице примеров конфигураций.

Применяем конфигурацию и проводим загрузку файлов на сервер командами:

$ s3_website cfg apply
$ s3_website push

Во время запуска первой команды, если корзина для размещения файлов не была ранее создана, она создается автоматически с использованием того имени, что было указано в файле конфигурации.

Из плюсов данной утилиты хочется отметить упростившуюся процедуру настройки кеширования различных типов файлов. К примеру, задать для всех файлов время жизни в 300 секунд, а для файлов, находящихся в директории assets в 6000 секунд:

max_age:
  "assets/*": 6000
  "*": 300

Можно также задать автоматическое сжатие gzip всех файлов, или только для файлов определенного типа:

gzip:
  - .html
  - .css
  - .md

И сама загрузка на сервера амазона производиться в несколько потоков (по умолчанию в три потока), что приводит к значительному ускорению передачи файлов. К примеру, для моего сайта:

$ time s3_website push --force
[info] Deploying /Users/juev/Projects/Github/juev.org/public/* to test.juev.org
[succ] Updated index.html (no-cache; max-age=0 | text/html; charset=utf-8 | gzip)
...
[succ] Invalidated 414 items on CloudFront
[info] Summary: Updated 413 files. Transferred 1.6 MB, 826.0 kB/s.
[info] Successfully pushed the website to http://test.juev.org.s3-website-eu-west-1.amazonaws.com

real    0m41.954s
user    0m40.617s
sys 0m3.059s

Как видно, 413 файлов были переданы за 41 секунду. При использовании s3cmd это время растягивается на несколько минут.

Провел тесты полученных сайтов с использованием сервиса webpagetest.org, получил следующие результаты:

  1. При использовании S3
  2. При использовании CloudFront

В обоих случаях скорость полной загрузки страницы порядка 1 секунды для первого посещения, и при этом нет критических замечаний по оптимизации. В случае CloudFront время повторной загрузки страницы уменьшается почти в два раза.

Значение Google PageSpeed для обоих вариантов, что для S3, что для CloudFront, составило 95 балов из 100.

Из тестов видно, что размещение сайта в CloudFront эффективнее в плане скорости, но при каждом обновлении сайта придется проводиться инвалидацию кеша, чтобы контент обновился. На это уходит время. К примеру, для моего сайта из 413 файлов, инвалидация проходила более 10 минут (значение не точное, указано минимальное значение). И это нужно учитывать. После генерации и загрузки, результат будет виден только по прошествии времени, необходимое для обновления кеша.

Исходя из стоимости размещения файлов в Amazon S3 и стоимости их передачи, для сайта, подобного моему, общая стоимость размещения в месяц будет выражаться максимум в 20-30 центов. А при использовании утилиты s3_website, работа с ним будет максимально простой.