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

В предыдущей статье я описывал как настроить 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;
}

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

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

Поделиться этой заметкой с друзьями:

Добавь меня:

Вы можете оставить комментарий, или поставить трэкбек со своего сайта.

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

  • 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 тоже не …

      • 22.03.2010 21:41, Nick сказал:

        Nginx останавливать не нужно. Думон управляется с помощью сигналов.
        Например, чтобы «мягко потушить» демон , нужно послать ему сигнал:
        >kill -s sigquit $nginx_pid
        И тогда все валидненько завершится. Есть сигналы, которые заставляют nginx перечитывать конфиг. Щас не помню точно, но в конфигах все черным по белому.
        Если ты этого не знал, то как тогда глушил сервер (если конечно глушил)?

        • 22.03.2010 21:44, Nick сказал:

          Пардон, не в конфигах описано, а в документации
          От туда же:
          Управлять nginx можно с помощью сигналов. Номер главного процесса по умолчанию записывается в файл /usr/local/nginx/logs/nginx.pid. Изменить имя этого файла можно при конфигурации сборки или же в nginx.conf директивой pid. Главный процесс поддерживает следующие сигналы:

          TERM, INT быстрое завершение
          QUIT плавное завершение
          HUP изменение конфигурации, обновление изменившейся временной зоны (только для FreeBSD и Linux), запуск новых рабочих процессов с новой конфигурацией, плавное завершение старых рабочих процессов
          USR1 переоткрытие лог-файлов
          USR2 обновление исполняемого файла
          WINCH плавное завершение рабочих процессов

          Управлять рабочими процессами по отдельности не нужно. Тем не менее, они тоже поддерживают некоторые сигналы:

          TERM, INT быстрое завершение
          QUIT плавное завершение
          USR1 переоткрытие лог-файлов
          Взято с http://sysoev.ru/nginx/docs/control.html

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

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

          • 11.12.2010 13:44, cheluskin сказал:

            Честно говоря в упор не вижу что бы вы отключали кеш для админки joomla . Насколько я знаю он отключается proxy_cache off;

            • 29.12.2010 15:47, brid сказал:

              apache+joomla+nginx. Как отключить nginx кеширование для авторизации пользователей на сайте (а то без авторизации корзина магазина не работает корректно)? Да так чтоб оставить кеш для анонимных пользователей.

            • 6 старых комментариев не отображается. Нажмите, чтобы отобразить все.
            (Обязательно)
            (Обязательно, не публикуется)

            Админ не грустный, он завис.