Решения по повышению производительности веб-сайта
Автор: Александр Кубышкин
Дата: 12 марта 2005
Организация и планирование структуры веб-сайта
Вынос статики на отдельный сервер
При создании веб-сайта я прописываю для всей статики (картинки, JS, CSS, TXT, HTML, PDF и т.д.) отдельный путь, чтобы иметь возможность обслуживать эти запросы отдельным веб-сервером.
Например, если основной URL сайта - http://www.yoursite.ru, то статику выносим на другой домен, к примеру http://static.yoursite.ru.
Далее, для домена static.yoursite.ru прописывается другой IP-адрес, все запросы на него будет обрабатывать какой-нибудь легкий и быстрый веб-сервер. Если нет возможности использовать другой IP-адрес, можно использовать просто другой порт этой же машины. На роль сервера может подойти что-нибудь из:
- lighttpd (freeware)
- nginx (freeware) - веб-сервер от нашего соотечественника Игоря Сысоева
- thttpd (ACME Labs Freeware License)
- Boa (GNU GPL)
- Red Hat Content Accelerator(он же TUX) (GNU GPL) - веб-сервер, располагающийся в ядре Linux. Работает только со статикой, но очень быстро. Требует ядро версии 2.4.x или выше.
Front-end, back-end сервера
Также есть еще такое решение: использование front-end и back-end серверов. В качестве front-end сервера используется прокси-сервер или, к примеру, nginx, в то время как back-end - это сервер приложений. Front-end сервер может распределяет нагрузку на один или несколько back-end серверов (путем проксирования или отдачи ответа перенаправления 3xx), а также снимает проблему медленных клиентов (т.к. дешевле иметь 100 соединений на front-end, вместо 100 на back-end).
Прямой доступ к back-end серверам запрещен, они могут вообще находиться во внутренней локальной сети с fron-end сервером.
Если отдельный front-end сервер не справляется с нагрузкой, ее можно довольно несложно распараллелить на несколько машин, используя такую простую вещь как Round Robin. Также есть DNS-сервера, которые позволяют выбирать IP-адрес не просто по кругу, как в Round Robin, а по некоему алгоритму, что позволяет обслуживать клиента географически ближайшим сервером.
Пример сервера:
Определение заголовков Expires
Заголовок в ответе веб-сервера Expires отвечает за кэширование контента. Кэшировать можно статику. Если он установлен и дата в будущем - клиентский броузер закэширует содержимое и не будет даже посылать запрос (по крайней мере современные браузеры) для отслеживания изменений (с полем If-Modified-Since). Что это дает: к примеру, у вас 15 картинок на странице. Без установленного Expires броузер сделает 15 запросов. С установленным Expires он не сделает ни одного (если срок в Expires еще не истек). Это сильно поможет медленным клиентам (модемы, GPRS).
К примеру если установить такое правило при разработке сайта - картинки, которые могут изменяться, хранить в одной директории, там срок Expires будет небольшой, к примеру 30 минут. Картинки, которые не могут изменяться - хранить в другой директории, там установить срок хранения - 1 год (по спецификации HTTP 1.1 это значит, что они не меняются никогда). Если захочется изменить картинку из второй директории - меняется имя файла.