Varnish + nginx + Apache

Аватар пользователя CSoft CSoft 5 сентября 2013 в 5:41

Приветствую!

Решил поиграться у себя на виртуальной машине с Debian различными инструментами для оптимизации быстродействия работы сайтов. Использую связку Varnish + nginx + Apache. За основу взял статьи:

http://drupal-admin.ru/blog/оптимизация-drupal-настройка-nginx-front-end-к-apache
http://drupal-admin.ru/blog/кэширование-анонимных-запросов-в-drupal-7-установка-и-настройка-varnish

Всё понятно кроме одного момента, который хочу уточнить. В первой статье у nginx вот такой файлик с настройками хоста:

server {
   listen 80;
   server_name drupal-admin.ru www.drupal-admin.ru;
   root /home/webmaster/domains/drupal-admin.ru/html;
   index index.html index.htm;

   access_log /home/webmaster/domains/drupal-admin.ru/logs/nginx_access.log;

   error_log /home/webmaster/domains/drupal-admin.ru/logs/nginx_error.log;
   
   location / {
        # Пробуем загрузить файл, если не получается то переходим на Apache
        try_files $uri [user=drupal]drupal[/user];
   }

# обработку php файлов тоже поручаем Apache
  location ~ \.php$ {
      proxy_pass         http://127.0.0.1:8080;
      proxy_redirect     default;
      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      client_max_body_size       10m;
      client_body_buffer_size    128k;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffer_size   4k;
      proxy_buffers              16 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;
  }

  location [user=drupal]drupal[/user] {
      proxy_pass         http://127.0.0.1:8080;
      proxy_redirect     default;
      proxy_set_header   Host             $host;
      proxy_set_header   X-Real-IP        $remote_addr;
      client_max_body_size       10m;
      client_body_buffer_size    128k;
      proxy_send_timeout         90;
      proxy_read_timeout         90;
      proxy_buffer_size   4k;
      proxy_buffers              16 32k;
      proxy_busy_buffers_size    64k;
      proxy_temp_file_write_size 64k;
    }
}

nginx смотрит: php-файл - отдаём его апачу, в противном случае проверяет физически наличие файла и если он есть - отдаёт так (статика), если нету - отдаёт апачу на обработку. Всё вполне понятно. Теперь я ставлю Varnish. Оставляю у него в конфигах стандартно порт 6081:

DAEMON_OPTS="-a :6081 \

В VCL backend у меня описан вот так:

backend default {
  .host = "127.0.0.1";
  .port = "8080";
}

В итоге, как я понял, в nginx, в коде выше, я тупо меняю два упоминания порта 8080 на 6081? И тогда запрос уходит варнишу, он смотрит кэш: если есть что - отдаёт, нету - передаёт в backend апачу? По крайней мере, вроде, работает.

Решил уточнить у знающих людей, очень интересно разобраться с этим :) Спасибо!

P. S. Вдобавок играюсь тут ещё и с Memcached + APC. Сайт неистово летает :))) Интересно, однако, если на итоговом проекте так и оставить всё: Varnish + Nginx + Apache + Mysql + PHP + Memcached + APC - не жирно будет? :) Пока ковыряю для интереса, прям затягивает :)

0 Thanks

Комментарии

Аватар пользователя drupby drupby 5 сентября 2013 в 9:05
"webpavilion" wrote:

ИМХО много лишнего, я использую Nginx + PHP-FPM + APC + MariaDB.

а зачем php вообще дергать ,если можно анонимам варнишом отдавать сразу закешированные страницы
ну или nginx может брать из мемкеша

Аватар пользователя webpavilion webpavilion 5 сентября 2013 в 9:20

кто сказал что его нужно дергать? у nginx есть очень удобный файловый кеш который работает не хуже варниша.

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

Аватар пользователя q2_faith q2_faith 5 сентября 2013 в 14:59
"CSoft" wrote:

В итоге, как я понял, в nginx, в коде выше, я тупо меняю два упоминания порта 8080 на 6081? И тогда запрос уходит варнишу, он смотрит кэш: если есть что - отдаёт, нету - передаёт в backend апачу?

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

Аватар пользователя CSoft CSoft 5 сентября 2013 в 15:49

Спасибо всем за ответы, теперь хоть уверен в своих предположениях! :)

Наверное, вопрос выбора инструментов оптимизации всегда является холиварным :)

Ну хорошо, давайте пообщаемся, тема интересная :)

"webpavilion" wrote:

я использую Nginx + PHP-FPM + APC + MariaDB

На счёт замены Apache на PHP-FPM читал, да. Стоит. MySQL -> MariaDB - тоже, раз она производительнее и прозрачно заменяет мускуль. В остальном у меня с Вами разница в том, что я поставил Varnish и Memcached. Напишу свои мысли по ним.

Varnish меня подкупил тем, что он кэширует php-файлы для анонимов и они не генерируются заново, и php действительно не дёргается по-новой. Но тут правильно выше заметил наш коллега выше про куки.

Когда у меня были только nginx + apache и я поставил Memcached - сайт стал летать на порядок быстрее. Прям это было заметно нереально сильно! А когда я добавил туда APC - ещё сильнее залетал. Прям вообще стало идеально.

Поэтому, как-то про Memcached не знаю даже... Спорить не буду, опыта у меня в этом деле совсем нет, но факт на лицо - сайт стал летать с ним.

Ещё опираюсь как-то на опыт коллег по приведённому в первом моём посте сайту. Например, вот в этой заметке:

http://drupal-admin.ru/blog/оптимизация-настроек-drupal-для-работы-с-memcached

они собрали Nginx + Apache + Mysql + PHP + Memcached + APC. Со мной различается только тем, что варниш не стоит. Где же, интересно, та самая грань, которую нужно уловить и не поставить лишнего? :) Не знаю, наверное это приходит со временем, когда нарабатывается опыт :)

Аватар пользователя CSoft CSoft 5 сентября 2013 в 16:45
"Crea" wrote:

Совместное использование nginx и varnish не имеет смысла

Можно подробнее? Почему и что лучше оставить из них? Опять же повторюсь - я не спорю, мне всё это интересно просто :)

Аватар пользователя CSoft CSoft 5 сентября 2013 в 16:50

С теми настройками, что, например, в первом посте у меня или что-то ещё нужно?

Аватар пользователя CSoft CSoft 5 сентября 2013 в 17:38
"webpavilion" wrote:

одна из первых ссылок в гугле

Текст статьи звучит убедительно :) Спасибо!

А что на счёт Memcached? :) Наверное, всё же стоит использовать?

Аватар пользователя webpavilion webpavilion 5 сентября 2013 в 20:23

вы в мемкеше что храните? то что у вас лежало раньше в таблицах cache_*
Ровно тоже самое можно хранить и в памяти используя apc.

Memcached на самом деле нужен очень редко, например когда drupal на нескольких серверах крутится что бы можно было безболезненно горячий резерв поднять.

Аватар пользователя CSoft CSoft 5 сентября 2013 в 21:57
"webpavilion" wrote:

вы в мемкеше что храните? то что у вас лежало раньше в таблицах cache_*

Ну да, кроме кэша форм.

"webpavilion" wrote:

Ровно тоже самое можно хранить и в памяти используя  apc.

А есть какие мануалы по настройке такого чуда? :)

Аватар пользователя CSoft CSoft 5 сентября 2013 в 23:20

Что-то не могу найти. Скорее всего, неправильно "спрашиваю". Не поможете?

Аватар пользователя CSoft CSoft 6 сентября 2013 в 16:48
"CSoft" wrote:

А когда я добавил туда APC - ещё сильнее залетал

Зачем Вы мне даёте мануал на установку APC? Я его давным-давно поставил. Вопрос стоял по-другому:

"webpavilion" wrote:

вы в мемкеше что храните? то что у вас лежало раньше в таблицах cache_*
Ровно тоже самое можно хранить и в памяти используя  apc.

Вот я и поинтересовался - как именно можно настроить APC, чтобы он выполнял функции Memcache?

Аватар пользователя webpavilion webpavilion 6 сентября 2013 в 17:11

несколькими комментами выше давал ссылку на модуль APC, вот инструкция от него: http://drupalcode.org/project/apc.git/blob_plain/refs/heads/7.x-1.x:/REA...

что еще вам рассказать? у меня есть опыт в хайлоад на drupal:

в пиках до 700 хостов в минуту, 70% заголенные пользователи. Работало все на одном сервере в указанном выше окруржении.

Аватар пользователя CSoft CSoft 6 сентября 2013 в 17:23
"webpavilion" wrote:

несколькими комментами выше давал ссылку на модуль APC, вот инструкция от него

Вы издеваетесь? Я в первом посте написал, что прекрасно установил APC, он у меня прекрасно работает. Я Вам ещё раз выше это написал. Вы мне опять даёте по нему мануалы на установку.

Я совсем другое спрашиваю. APC и Memcache ведь немного разные вещи делают? Вы пишете, что первый может делать тоже самое, что и второй, потому Memcache можно убрать. Я спрашиваю: как настроить APC, чтобы он выполнял функции Memcache и скидывал в оперативку таблицы БД с кэшем друпала? Из коробки ведь он не делает этого. Иначе я не понимаю, зачем в куче заметок спецы пишут об использовании вместе APC + Memcache.

А Вашему опыту я доверяю, я с ним ни разу не спорил. Я просто интересуюсь этой всей тематикой, мне это просто интересно, хотел бы в будущем эти знания использовать на практике.

Аватар пользователя CSoft CSoft 6 сентября 2013 в 17:25
"CSoft" wrote:

как настроить APC, чтобы он выполнял функции Memcache и скидывал в оперативку таблицы БД с кэшем друпала?

Я правильно понял, что это пункт

- Step 4 (OPTIONAL)

из инструкции к APC?

Аватар пользователя drupby drupby 6 сентября 2013 в 17:30
$conf['cache_backends'][] = 'sites/all/modules/apc/drupal_apc_cache.inc';
$conf['cache_default_class'] = 'DrupalAPCCache';
$conf['cache_class_cache_form'] = 'DrupalDatabaseCache';
Аватар пользователя webpavilion webpavilion 6 сентября 2013 в 17:35

ой как много букв, почитай внимательно что я написал:

  • есть APC - расширение для PHP которое в первую очередь опкодер, а во вторую key/value хранилище в shm память
  • есть APC - модуль для друпал 7 который позволяет хранить в памяти кеши.

Инструкцию на установку и того и другого я тебе дал что еще?

Аватар пользователя CSoft CSoft 6 сентября 2013 в 17:48
"webpavilion" wrote:

ой как много букв

Правильно, потому что я спрашиваю одно, а вы пишете нечёткий ответ. Куча последних постов отпала бы, если бы вы сразу написали:

"webpavilion" wrote:

есть APC - расширение для PHP которое в первую очередь опкодер, а во вторую key/value хранилище в shm память

и сказали, что в тех инструкциях есть инфа, как настроить работу на обе ситуации. Чтобы я читал внимательно. Вот и всё.

А так спасибо, конечно.

Аватар пользователя CSoft CSoft 6 сентября 2013 в 17:56

Ещё одно наблюдение интересное в моих экспериментах. Я для виртуальной машины выделил специально 512 МБ, чтобы посмотреть - войду ли в такой лимит. И не вошёл по той причине, что поставил Apache Solr. Если бы он работал не на Java с Tomcat - было бы чудно вообще... А он жрёт памяти больше 100 метров! Не ожидал. И много памяти, соответственно, едят Apache и MySQL. От первого откажусь, раз можно заменить на PHP-FPM. Интересно, насколько это улучшит картину. MariaDB - тоже посмотрю что будет, если поменять. А сейчас при запуске машины метров 50 свободно. Как только начинаешь ходить по сайту - они сразу, конечно же, забиваются, и система начинает закидывать данные в swap.

Аватар пользователя webpavilion webpavilion 6 сентября 2013 в 19:02
"CSoft" wrote:

Может хватит хамить, а?
Я тоже виноват, не отрицаю.

Давай по существу, "тоже виноват" подразумевает и мою вину в чем? Я просто делюсь с тобой совершенно безвозмездно своим опытом, а ты в ответ хамишь. Зачем мне это?

Аватар пользователя CSoft CSoft 6 сентября 2013 в 19:10
"webpavilion" wrote:

"тоже виноват" подразумевает и мою вину в чем?

В том, что я задаю чёткий вопрос, а мне дают ответ "вокруг да около". Я прошу пояснить, как мэмкеш выкинуть и сделать, чтобы его функции выполнял apc, а ты мне даёшь ссылку в гугле "как установить apc". Я 2 раза написал - УЖЕ установил. Как правильно настроить его, чтобы выкинуть в память? Тогда ты уже дал инструкцию, я не всё внимательно там увидел, а ответ уже там есть. Потому и пишу - "тоже виноват".

"webpavilion" wrote:

Я просто делюсь с тобой совершенно безвозмездно своим опытом

Я выше поблагодарил, это во-первых. Во-вторых, тут все друг другу помогают, или мы на портале фриланс.ру?

"webpavilion" wrote:

а ты в ответ хамишь

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

Аватар пользователя webpavilion webpavilion 6 сентября 2013 в 19:18

Лет может 5-7 назад я бы обязательно тебе попытался объяснял и доказать, а сейчас просто пойду заниматься своими делами.

Аватар пользователя CSoft CSoft 6 сентября 2013 в 19:21

Зачем что-то доказывать? Ты мне помог, за это спасибо. Проблема была в непонимании. Что ещё нужно-то? Моё хамство искать? Искать то, чего нет - задача непростая, я согласен.

Аватар пользователя CSoft CSoft 6 сентября 2013 в 19:38

drupby, Вам спасибо тоже! Я теперь догнал, да :) Невнимательность иногда бывает у меня :(

Аватар пользователя sg85 sg85 14 сентября 2013 в 10:43
"CSoft" wrote:

Если бы он работал не на Java с Tomcat - было бы чудно вообще...

Попробуйте Jetty minimal(на сколько помню 64 метра для старта нужно, могу ошибаться), можно найти в коробке с солром, как раз подходит для систем с минимальными ресурсами, правда на дедиках обычно по фиг что там у Вас, jetty или tomcat, еще одна тема для холиваров.

Аватар пользователя CSoft CSoft 14 сентября 2013 в 15:42
"sg85" wrote:

Попробуйте Jetty

Супер, значит есть вариант! Спасибо за совет!!! Нашёл даже чудную статью на эту тему:

http://www.wunderkraut.com/blog/power-up-drupal-search-with-jetty-apache...

Опробую на днях в работе :) Там в комментариях кто-то очень хорошо подметил:

Quote:

You should only use Tomcat if you use Tomcat to other purposes too. Otherwise Tomcat is just unnecessary heavy platform to run Solr and Jetty is more than enough to run Solr properly.

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 16 сентября 2013 в 19:19
"webpavilion" wrote:

в пиках до 700 хостов в минуту, 70% заголенные пользователи. Работало все на одном сервере в указанном выше окруржении.

"webpavilion" wrote:

у меня есть опыт в хайлоад на drupal:

хосты в минуту считать это мощна!
Всегда реквесты считали