Apache2 + nginx = кеширование

Эта запись опубликована в рубрике [ Apache, Ubuntu ]

В предыдущей статье я описывал как настроить Squid фронтэндом для ускорения отдачи страничек сайта. В тот же день я все таки добился кеширования страниц сервером nginx и перевел свой сервер на связку Apache2 + nginx + кеширование средствами nginx.

Получилось весьма не плохо, что подтверждают тесты сервисом Load Impact и программой siege.

Итак, приступим.

Для начала ставим последнюю версию nginx. Т.к. в репозитариях ее нет, то соберем ее из исходников:
$ wget http://sysoev.ru/nginx/nginx-0.8.29.tar.gz

Распаковываем куда нибудь содержимое архива и конфигурируем сборку:

$ ./configure --conf-path=/etc/nginx

Т.е. конфигурационные файлы будут у нас лежать в /etc/nginx

Дальше классические:

$ make
$ sudo make install

Теперь правим конфигурационные файлы.

/etc/nginx/nginx.conf

В раздел http я добавил кеширование:

proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=one:10m inactive=7d max_size=200m;
proxy_temp_path /var/nginx/temp;

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

Дальше настраиваем виртуальные хосты (/etc/nginx/sites-enabled). Поскольку у меня их довольно не мало, хоть и не так уж и много, то руками все прописывать я не стал, а подготовил скрипт, который вычитал имена хостов из Апача и сгенерил по шаблону конфиги хостов для nginx.

Шаблон был стандартный, т.е. такой:
server {

listen   80;

server_name silverghost.org.ua www.silverghost.org.ua;
proxy_temp_path /var/nginx/temp/silverghost.org.ua;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_redirect off;
proxy_set_header   Host             $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Host $http_host;
proxy_set_header X-URI $uri;
proxy_set_header X-ARGS $args;
proxy_set_header Refer $http_refer;

client_max_body_size       10m;
client_body_buffer_size    128k;
proxy_connect_timeout      90;
proxy_send_timeout         90;
proxy_read_timeout         90;
proxy_buffer_size          4k;
proxy_buffers              4 32k;
proxy_busy_buffers_size    64k;
proxy_temp_file_write_size 10m;

proxy_cache one;
proxy_cache_key $host$scheme$proxy_host$uri$is_args$args;
proxy_cache_valid  200 302 304 10m;
proxy_cache_valid  301 1h;
proxy_cache_valid  any 1m;
}
}

После чего я в настройках Апача изменил его порт на 8080 и перезапустил его. Момент истины настал – запускаем nginx:

$ sudo /usr/local/nginx/sbin/nginx -c /etc/nginx/nginx.conf

Собственно базовая настройка для всех хостов завершена. Странички будут теперь отдаваться гораздо быстрее и какой-то базовый Хабраэффект сервер выдержит.

Но погуляв по сайтам я вдруг обнаружил, что сайты на WordPress и Joomla иногда глючат. В частности на моем сайте не оставлялись комментарии, а на Joomla-сайтах невозможно было залогиниться ни в админку, ни на сайт. Поковырявшись во внутренностях, я нашел как это дело исправить. Все просто, для определенных ключевых моментов нужно отключить кеширование и все начинает работать как часы.

В частности для WordPress в раздел server добавляем еще один location:
location ~*(comments|wp-admin)* {
proxy_pass http://127.0.0.1:8080;

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Host $http_host;
proxy_set_header X-URI $uri;
proxy_set_header X-ARGS $args;
proxy_set_header Refer $http_refer;

client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}

Для Joomla добавляем такой location:
location ~*(administrator|comprofiler)* {
proxy_pass http://127.0.0.1:8080;

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Host $http_host;
proxy_set_header X-URI $uri;
proxy_set_header X-ARGS $args;
proxy_set_header Refer $http_refer;

client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}

Надеюсь эта статья облегчит жизнь Вашему серверу. :)

Постовые: трудоустройство моряков в одессе, ускоренная регистрация торговой марки, оборудование лабораторий

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong

Post to Twitter Post to Delicious Post to Facebook Post to MySpace Post to Ping.fm

Оценить эту запись:
1 звезда2 звезды3 звезды4 звезды5 звезд (1 голос(ов), среднее: 5.00 из 5)
Вы можете следить за ответами к этой записи через RSS 2.0 feed. Вы можете оставить мнение, или трэкбэк с собственного сайта.

11 комментариев(я)

  • 07.12.2009 14:08, Denys сказал:

    Познавательно, жаль только что нет примеров исключения для DataLife Engine

    что ж, прийдется найти их опытным путем

    • 07.12.2009 14:14, Silver Ghost сказал:

      Их нет, т.к. я не пользую DLE. Если бы пользовал – выложил бы. Но думаю ты и сам разберешься. там все просто. ;)

    • 16.12.2009 01:09, Андрей сказал:

      Ну вообще-то сделать для DLE это не сложно. Документация по nginx вся на русском языке, хотя тут многое интуитивно понятно, если знаешь хотя бы технический английский

      Для ДЛЕ нужно просто не кешировать комментарии и админку (edit_news и т.д.). Настраивается простыми location

      Так же при желании можно привязать кэширование к сессиям, что избавит от некоторых проблем на многих движках, т.к. не будут теряться сессионные данные при кешировании. Делается добавлением переменной сессии (берем из заголовка) в директиву proxy_cache_key

      А вообще для многих сайтов, для того же ДЛЕ apache как таковой не нужен. Все можно сделать на “голом” nginx. Недавно я как раз написал такую статью, думаю админ блога не удалит пруфлинк :) Вещь полезная

      http://www.master-blog.ru/page/dle-nginx-php

      • 16.12.2009 10:13, Silver Ghost сказал:

        Конечно не удалю. Полезные ссылки – всегда хорошо. :)

      • 23.12.2009 15:40, vladonvv сказал:

        Параметры
        proxy_connect_timeout 90;
        proxy_send_timeout 90;
        proxy_read_timeout 90;
        не могут быть больше 75. Читайте официальную документацию.

        • 23.12.2009 15:54, Silver Ghost сказал:

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

        • 23.12.2009 16:16, vladonvv сказал:

          а вопрос попутно – не в курсе почему в секции http { …. } – т.е. как я понимаю в глобальных настройках сервера не отрабатывает директива client_max_body_size 64M; – а отрабатывает только в секции server { … } ? Т.е. по дефолту так и остается в 1м если в глобальной секции прописано. Может быть были какие-то изменения в конфигурации nginx? Версия nginx-0.7.64

          • 23.12.2009 16:34, Silver Ghost сказал:

            увы. не подскажу… я еще не настолько силен в этом вопросе… только начинаю разбираться… 

            у меня вот некоторые сайты (там где аяксовые примочки) не очень корректно работают… пытаюсь понять почему. тот же двиг livestreet не показывает голосования.

            • 26.12.2009 21:20, Андрей сказал:

              Аяксовые примочки могут быть написаны с учетом apache-style, например, если используют специфические для apache переменные, которых нет в nginx. Ну и с SOAP и с chunk у nginx есть некоторые проблемы. Как бы полностью апач ему пока не заменить

          • 21.01.2010 22:23, [stranger] сказал:

            apache2.2 + nginx кеширование…

            На днях поставил nginx как front-end сервер, быстродействие повысилось, но ведь хочется еще больше.. Включил кеширование на nginx`е как описано здесь! Но проверить кеш в действии не получается! nginx не хочет обновлять конфиг! Остановить nginx тоже не …

            • 14.02.2010 20:12, Aleksandr сказал:

              Как его удалить после установки?))

              (Обязательно)
              (Обязательно, не публикуется)