Nobody about something

Настройка wordpress с apache-itk и nginx

Написано 15 апреля 2010 в 13:48 - Рубрики: *nix, блог

Перенёс блог на другую VDS, при этом в корне изменив механизм работы.
Раньше было nginx+php-fpm+кэширование в nginx (причём это кэширование – целая жопа, так как там пришлось сделать огромное число location`ов с разными настройками)

Ну, вообщем, поехали по пунктам.

  1. Для начал нужен сервер на котором всё это будет работать.
    У меня блог сейчас работает на VDS с системой виртуализации VDSmanager-FreeBSD на FreeBSD 8.
    Со 128 мегабайтами оперативной памяти.
    Заказать такой можно по кнопке “FirstVDS.ru” в сайдбаре. При заказе по этой кнопке, на первый месяц будет скидка в 25%. Заказывать надо тариф не ниже “VDS-Разгон”. Шаблон диска FreeBSD-8-ISPmanager.
  2. nginx уже стоит в данном шаблоне. Поэтому его достаточно просто включить в ISPmanager в разделе “Возможности”. Далее создать пользователя, WWW домен и т.п.
    Ну и, наконец, закачать сам сайт куда надо.
    В данном дисковом шаблоне стоит apache22-itk. Он обрабатывае PHP скрипты не от пользователя www, а от пользователя, которому принадлежит сайт. Потому нету никаких проблем с закачкой файлов, и т.п.
  3. Оптимизируем апач.
    В /usr/local/etc/apache22/extra/httpd-mpm.conf пропишем следующие настройки (лучше вне ifmodule)
    StartServers 1
    MinSpareServers 1
    MaxSpareServers 5
    MaxClients 3
    MaxRequestsPerChild 1000

    Как ни странно, но 3-х процессов апача хватает для обработки запросов.
  4. А теперь, собственно, начинается самое интересное.
    Ставим в wordpress плагин wp-super-cache, включаем, ну и можно поднастроить немного его.
    Данный плагин создаёт статические html файлы страниц. При этом, если страницу открывал авторизованный пользователь, то в качестве имени файла используется хитрых хэш.
    А если нет, то (тут самое интересное), в директории /wp-content/cache/supercache/ создаются директории и файлы вида имя_сайта/адрес_страницы/index.html
    А раз это статический файл, то его может отдать nginx минуя апач.
  5. В файл wp-config.php добавляем строку
    define('TEST_COOKIE', 'test_wordpr_cookie');
    Для чего это? Эта cookie ставится при открытии страницы wp-login.php, причём независимо от того, залогинился пользователь или нет. По умолчанию, кука называется wordpress_test_cookie. А все куки, начинающиеся со слова “wordpress_”, учитываются плагином wp-super-cache, и если есть такая кука, то пользователь считается авторизованным, и соответственно статичная страница в кэшэ создаётся с именем в виде хэша. А нужно, чтобы создавалась с “человеческим” именем.
  6. Собственно, настраиваем nginx. Далее будет конфиг /usr/local/etc/nginx.conf с комментариями.
      server {
        listen 82.146.41.102:80;
        index index.php #определяем индексную страницу
        server_name reonaydo.org.ru www.reonaydo.org.ru;
        rewrite ^(/manager/.*)$ https://$host$1 permanent;
    
    # выше - стандартная часть, создаваемая ISPmanager`ом
    # далее часть, отвечающая за обработку запросов к PHP файлам. Проксируем к апачу.
    
        location ~ \.php {
          proxy_pass http://82.146.41.102:8080;
          proxy_redirect http://reonaydo.org.ru:8080/ /;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Real-IP $remote_addr;
        }
    
    # Запрещаем доступ к файлам с именем в виде хэша, и к htaccess файлам в директории с кэшэм
    
        location ~ (/wp-content/cache/(wp-cache-.*\.html|meta)|\.htaccess) {
          deny all;
        }
    
    # Собственно, основная секция. Далее поподробнее.
    
        location / {
          access_log /home/httpd-logs/reonaydo.org.ru.access.log;
          root /home/tuupic/data/www/reonaydo.org.ru;
    
    # Данная конструкция if проверяет наличие куки, учитываемых плагином.
    # И в случае их наличия(пользователь авторизован), делается внутренняя переадресация
    # на страницу /authed
    
          if ($http_cookie ~ "comment_author_|wordpress|wp-postpass_") {
            rewrite ^/(.*) /authed$1 last;
          }
    
    # на самом деле такого url нету, и далее будет ещё один внутренний реврайт
    
    # и реврайтим туда же запросы с аргументами (например поиск)
    
          if ($args) {
            rewrite ^/(.*) /authed$1 last;
          }
    
    # try_files проверят наличие файла, соответствующего запросу, либо находящегося в кэшэ
    # если и там и там нету, то запрос уходит в специальный location @fallback
    # я не стал делать проверку существования директории ($uri/),
    # так как у вордпресса нету директорий, в которых ещё есть индексные файлы
    
          try_files $uri /wp-content/cache/supercache/$host/$uri/index.html @fallback;
        }
    
    # Собственно специальный location для авторизованных пользователей.
    
        location /authed {
          access_log /home/httpd-logs/reonaydo.org.ru.access.log;
          internal;
          rewrite ^/authed(.*) /$1 break;
    
    # делаем обратный внутренний реврайт
    
          root /home/tuupic/data/www/reonaydo.org.ru;
    
    # и проверям наличие файла. Иначе на @fallback
    
          try_files $uri @fallback;
        }
    
    # А сам @fallback представляет из себя копию location`а для PHP файлов
    
        location @fallback {
          proxy_pass http://82.146.41.102:8080;
          proxy_redirect http://reonaydo.org.ru:8080/ /;
          proxy_set_header Host $host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header X-Real-IP $remote_addr;
        }
      }
    
  7. В результате, при большом времени кэширования, большая часть страниц сайта является статическими файлами и отдаётся nginx`ом, не нагружая “медленный” апач.
  8. Any questions?
Метки: , ,

Оставить комментарий