Ускорение выдачи JS сервером.

Главные вкладки

Аватар пользователя VladSavitsky VladSavitsky 19 марта 2008 в 15:47

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

В файле .htaccess (в корне сайта) сразу после

<IfModule mod_rewrite.c>
  RewriteEngine on

добавил:

    RewriteEngine on
    RewriteRule ^(.*\.js\.gz)$ - [L]
    RewriteCond %{HTTP:Accept-Encoding} gzip
    RewriteCond %{REQUEST_FILENAME}.gz -f
    RewriteRule ^(.*)$ $1.gz

Упаковал *.js файл в *.js.gz и закачал на сервер в ту же папку, где был оригинальный JS-файл.

Открыл браузер загрузил страницу и посмотрел заголовки запроса:

  • Response Headers
  • Date Wed, 19 Mar 2008 12:32:09 GMT
  • Server Apache
  • Cache-Control max-age=1209600
  • Expires Wed, 02 Apr 2008 12:32:09 GMT
  • Last-Modified Wed, 19 Mar 2008 12:31:38 GMT
  • Etag "bdcf97-87d-47e107aa"
  • Accept-Ranges bytes
  • Content-Length 2173
  • Connection close
  • Content-Type application/x-gzip
  • Content-Encoding gzip

Ну и размер отданного файла стал вдвое меньше. Вывод - метод работает.

Нужно вручную все эти файлы упаковать и загрузить на сервер. Одно радует их количество не стремится к бесконечности... С другой стороны нет нагрузки на сервер для создания упакованной копии этого файла. А меняются эти файлы крайне редко...

Собственно решение прямо в лоб - упаковать файлы один раз и “задеплоить” на сервер. Я это(сжатие) делаю с помощью всё того же phing-а, а решение о том какой файл (сжатый или нет) отдать клиенту принимает mod_rewrite:

Принцип работы:
Если рядом с файлом javascript.js будет находиться его сжатая копия javascript.js.gz и в запросе будет явно указано, что клиент поддерживает gzip-encoding, то клиенту выдаётся сжатая копия. Если сжатие не поддерживается или сжатого файла нет в ответ вернётся оригинальный файл.

В результате трафик сервера и нагрузка на сервер снижается. То же самое можно сделать и для CSS.

Есть ли более изящные способы?

Комментарии

Аватар пользователя VladSavitsky VladSavitsky 19 марта 2008 в 16:05

Можно использовать модуль http://drupal.org/project/javascript_aggregator
Он разбирает $scripts, собирает все возможные комбинации JS-файлов в один и сохраняет версию в кеше.
Про сжатие я не нашёл ничего в описании...
Таким образом он уменьшает только количество запросов к серверу для получения JS-файов...

Аватар пользователя VLAD_X VLAD_X 21 марта 2008 в 7:48

> Есть ли более изящные способы?
Один вариант привёл Dimm, а другой - использовать nginx. Он может просто сжимать статику на лету, а может в точности делать то, что вы хотите: отдавать сжатые файлы вместо несжатых. (Эта возможность появилось недавно в 0.6.x ветке)