Статьи

Улучшение скорости приложения AppFuse с помощью Apache

Одна из самых важных вещей при разработке веб-приложений — сделать их быстрыми . В AppFuse мы попытались включить многие из 14 правил для более быстрой загрузки веб-сайтов . У нас был фильтр gzip до того, как он остыл (2003), и мы заменили его на EhCache . Однако у пользователей возникли проблемы с обоими из них, как с XFire / CXF, так и с WebWork / Struts 2 и JSP . Из-за этих проблем мы отключили gzipping несколько выпусков назад.

Эта статья предназначена для того, чтобы показать вам, как вы можете сделать ваше веб-приложение AppFuse быстрее, без изменения какого-либо кода. Хорошей новостью является то, что это применимо к любому веб-приложению, которое вы можете развернуть за Apache.

В прошлую пятницу я отправил электронное письмо добрым людям в Contegix, чтобы узнать, могут ли они установить mod_pagespeed на сервер Apache, который находится перед * .appfuse.org. Моя цель состояла в том, чтобы улучшить оценки YSlow и PageSpeed ​​приложений, размещенных на demo.appfuse.org . Я обнаружил, что они получают удручающий счет 24 и полагал, что мы могли бы сделать намного лучше. mod_pagespeed ускоряет работу вашего сайта и сокращает время загрузки страницы благодаря автоматическому применению лучших рекомендаций по производительности в Интернете. Это казалось простым решением.

К сожалению, мы не смогли использовать mod_pagespeed. От парней из Contegix:

Пытаясь установить mod_pagespeed, как вы и просили, мы обнаруживаем, что для этого требуются Apache httpd 2.2 и libstdc ++ 4.1.2, которые не поддерживаются в RHEL4. Чтобы заставить mod_pagespeed работать на вашей нынешней операционной системе, в основном означает перекатывание основных компонентов, что сделает их неподдерживаемыми. Боюсь, mod_pagespeed просто не подходит для вашей текущей конфигурации.

Поскольку я все еще хотел улучшить производительность, я выбрал другой маршрут: использование mod_deflate (для gzipping) и mod_expires (для заголовков expires). Я также включил KeepAlive в соответствии с рекомендациями PageSpeed ​​Insights .

mod_deflate
mod_deflate уже был установлен в Apache (версия 2.0.52), поэтому все, что мне нужно было сделать, это настроить его. На RHEL4 Apache установлен в / etc / httpd и есть каталог conf.d, который содержит все файлы конфигурации. Я создал файл в /etc/httpd/conf.d/deflate.conf и заполнил его следующим:

#
# mod_deflate configuration
#
<IfModule mod_deflate.c>
    SetOutputFilter DEFLATE
    
    AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript
    
    DeflateCompressionLevel 9
    
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    
    LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    
</IfModule>

Сначала у меня были отдельные строки для всех типов контента (как рекомендовано в этой статье ). Команда поддержки Contegix выяснила решение (все, что нужно, чтобы быть на одной линии) за 14 минут, обновила конфигурацию и проверила, что она работает, используя страницу тестирования сжатия http .

mod_expires
mod_expires уже был установлен, поэтому я добавил файл конфигурации в /etc/httpd/conf.d/expires.conf . Я использовал это руководство и попросил Contegix о помощи, когда она не сработала. Их ответ на этот раз занял немного больше времени (49 минут), но они еще раз поняли:

Похоже, что FilesMatch не любит играть будет JkMount. Он работает с использованием типа контента.

Мой окончательный конфиг для expires.conf :

<IfModule mod_expires.c>
    ExpiresActive On
    
    <FilesMatch "\.(jpe?g|png|gif|js|css)$">
        ExpiresDefault "access plus 1 week"
    </FilesMatch>
    
    ExpiresByType image/jpeg "access plus 1 week"
    ExpiresByType image/png "access plus 1 week"
    ExpiresByType image/gif "access plus 1 week"
    ExpiresByType text/css "access plus 1 week"
    ExpiresByType application/javascript "access plus 1 week"
    ExpiresByType application/x-javascript "access plus 1 week"
</IfModule>

Я использовал «1 неделю», потому что сейчас мы немного меняем ситуацию, и у нас еще нет интегрированной идентификации ресурсов .

KeepAlive

Последнее, что я сделал для повышения производительности, — включил KeepAlive, отредактировав /etc/httpd/conf/httpd.conf и изменив значение Off на On .

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

Резюме

В результате этих изменений наш показатель PageSpeed ​​изменился с 24 до 96, а YSlow — с 90 до 98. Когда я начал этот эксперимент, я только пытался исправить demo.appfuse.org. Тем не менее, он также улучшил скорость всех других сайтов * .appfuse.org, включая Confluence , Bamboo , JIRA и FishEye . Спасибо за помощь Contegix! Есть хороший шанс, что вы возвращали мне несколько минут каждый день.