Установка WordPress и W3 Total Cache на сервере Lighttpd

Данная статья поможет установить WordPress и популярный плагин для кэширования W3 Total Cache на веб-сервер Lighttpd.

Предполагается, что программный стек LLMP предварительно установлен, и PHP может взаимодействовать с Lighttpd. Многие конфигурации нужно будет выполнить вручную. Плагин W3 Total Cache не поддерживается веб-сервером Lighttpd «из коробки» (в отличие от Apache и Nginx).

Примечание: Об установке стека LLMP можно прочитать здесь.

Включение модулей

Для поддержки постоянных ссылок WordPress необходим модуль mod_rewrite. Но в конфигурации Lighttpd он закомментирован. Отредактируйте конфигурационный файл Lighttpd, удалив # в строке данного модуля.

nano /etc/lighttpd/lighttpd.conf

По умолчанию файл выглядит так:

server.modules = (
"mod_access",
"mod_alias",
"mod_compress",
"mod_redirect",
#       "mod_rewrite",
)

Удалите диез из строки mod_rewrite:

"mod_rewrite",

Также сайту необходимы логи доступа; включите модуль accesslog, отвечающий за их поддержку.

lighttpd-enable-mod accesslog

Создание виртуального хоста

Добавьте виртуальный хост для сайта WordPress.

Примечание: В руководстве используется условный домен example.com; во время настройки замените его своим доменным именем.

nano /etc/lighttpd/lighttpd.conf
$HTTP["host"] =~ "(^|www\.)example.com$" {
server.document-root = "/var/www/example.com"
accesslog.filename = "/var/log/lighttpd/example.com-access.log"
server.error-handler-404 = "/index.php"
}

Для корректной работы постоянных ссылок достаточно этой строки:

server.error-handler-404 = "/index.php"

Перезапустите сервис lighttpd:

service lighttpd force-reload

Загрузка и настройка WordPress

Для начала нужно подготовить базу данных MySQL и отдельного пользователя с соответствующим уровнем привилегий.

echo “CREATE DATABASE wordpress” | mysql -u root -p
echo “GRANT ALL PRIVILEGES ON wordpress.* TO ‘wpuser’@’localhost’ IDENTIFIED BY ‘S3cRet_pass'” | mysql -u root -p

Примечание: Замените условные данные wpuser и S3cRet_pass своими учётными данными.

Загрузите последнюю версию WordPress:

wget http://wordpress.org/latest.tar.gz

Извлеките пакет в каталог document root (это главный каталог сайта, указанный в виртуальном хосте). Теперь в каталоге появился подкаталог wordpress; переименуйте его, указав доменное имя сайта (имя каталога должно совпадать со значением директивы server.document-root):

cd /var/www
tar -xf ~/latest.tar.gz
mv wordpress example.com

Передайте права на все файлы в каталоге пользователю и группе www-data:

chown www-data:www-data -R example.com/

Откройте браузер, введите свой домен и завершите установку WordPress.

Затем нужно настроить поддержку постоянных ссылок и выбрать их структуру.

Но сначала необходимо решить одну проблему: прежде чем включить постоянные ссылки, WordPress выполняет проверку модуля mod_rewrite на сервере Apache, но на сервере lighttpd эту проверку выполнить невозможно. Следовательно, нужно заставить WordPress включить эти ссылки.

Создайте каталог для плагина Must Use:

mkdir /var/www/example.com/wp-content/mu-plugins

Создайте в нём файл:

nano /var/www/example.com/wp-content/mu-plugins/rewrite.php

Вставьте в файл следующий код:

<?php
add_filter( 'got_rewrite', '__return_true' );

Примечание: Тег ?> не был закрыт намеренно.

Затем откройте панель управления WordPress и перейдите в Settings > Permalinks. На экране появится окно настройки ссылок, где можно выбрать их структуру.

Настройка плагина W3 Total Cache

По умолчанию W3TC поддерживает только Apache и Nginx, потому настройка этого плагина на сервере lighttpd несколько отличается от стандартного процесса; кроме того, большинство настроек нужно выполнить вручную.

Отредактируйте конфигурационный файл lighttpd, добавьте в него директивы rewrite для минификации и кэширования страниц.  Дополнительная конфигурация выполняется в блоке  виртуального хоста после error-handler-404.

nano /etc/lighttpd/lighttpd.conf
$HTTP["host"] =~ "(^|www\.)example.com$" {
server.document-root = "/var/www/example.com"
accesslog.filename = "/var/log/lighttpd/example.com-access.log"
server.error-handler-404 = "/index.php"
#Rewrite rules for minified files
url.rewrite-if-not-file = (
"^/wp-content/cache/minify/(.+\.(css|js))$" => "/wp-content/plugins/w3-total-cache/pub/minify.php?file=$1"
)
#Rewrite rules for page cache enhanced
#This is to prevent page cache rules from messing up minify rules
$HTTP["url"] !~ "(.+\.(css|js|xml|html))" {
#Bypass cache if the request contains any of these cookies
$HTTP["cookie"] !~ "(comment_author|wp\-postpass|w3tc_logged_out|wordpress_logged_in|wptouch_switch_toggle)" {
#Bypass cache for POST requests
$HTTP["request-method"] != "POST" {
#Bypass cache if query string isn't empty
$HTTP["querystring"] !~ "(.*)" {
url.rewrite-if-not-file = (
"(.*)" => "/wp-content/cache/page_enhanced/example.com/$1/_index.html"
)
}
}
}
}
}

Примечание: Замените условный домен example.com в пути /wp-content/cache/page_enhanced/example.com/$1/_index.html точным доменным именем, указанным во время установки WordPress.

Сохраните и закройте файл.

Перезапустите lighttpd:

service lighttpd force-reload

Откройте панель управления WordPress, выберите Plugins > Add New, найдите нужный плагин и установите его. Затем включите плагин и вернитесь в консоль SSH.

Модуль для браузера плагина W3 Total Cache создаст gzip-файл кэша страницы и минимизирует кэш, который будет обслуживаться для пользователей при помощи заголовка запроса Accept-Encoding. Однако сервер lighttpd может сжимать контент на ходу при помощи модуля mod_compress. Потому рекомендуется отключить эту функцию.

При помощи команды sed найдите и замените следующие строки конфигурации:

cd /var/www/example.com/
sed -i "s/'browsercache.cssjs.compression' => true/'browsercache.cssjs.compression' => false/" wp-content/w3tc-config/master.php
sed -i "s/'browsercache.html.compression' => true/'browsercache.html.compression' => false/" wp-content/w3tc-config/master.php
sed -i "s/'browsercache.other.compression' => true/'browsercache.other.compression' => false/" wp-content/w3tc-config/master.php
sed -i "s/'browsercache.cssjs.compression' => true/'browsercache.cssjs.compression' => false/" wp-content/cache/config/master.php
sed -i "s/'browsercache.html.compression' => true/'browsercache.html.compression' => false/" wp-content/cache/config/master.php
sed -i "s/'browsercache.other.compression' => true/'browsercache.other.compression' => false/" wp-content/cache/config/master.php

Минификация

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

Примечание: В данном руководстве для примера используется тема Twenty Thirteen, совместимая с минификацией.

Прежде чем включить эту опцию, нужно отключить Auto Minify Test, так как для его успешного выполнения необходимо несколько правил перезаписи. Их можно попробовать преобразовать в понятный для lighttpd формат (из .htaccess или nginx.conf), но оно того не стоит, поскольку минификация работает и без этих тестов.

cd /var/www/example.com/
sed -i "s/'minify.auto.disable_filename_length_test' => false/'minify.auto.disable_filename_length_test' => true/" wp-content/w3tc-config/master.php
sed -i "s/'minify.auto.disable_filename_length_test' => false/'minify.auto.disable_filename_length_test' => true/" wp-content/cache/config/master.php

Вернитесь в панель управления WordPress и откройте Performance > General Settings. Здесь можно включить минификацию.

Откройте сайт WordPress в браузере и просмотрите код. В нём можно найти минифицированные CSS и JS:

<!DOCTYPE html>
<!--[if IE 7]>
<html class="ie ie7" lang="en-US">
<![endif]-->
<!--[if IE 8]>
<html class="ie ie8" lang="en-US">
<![endif]-->
***
<html lang="en-US">
***
<head><link rel="stylesheet" type="text/css" href="http://example.com/wp-content/cache/minify/000000/M9AvKU_NK6ksycgsKklNzdNPy88rKdZPT81LLcpMzs8r1jFAV1FcUpmTCgA.css"media="all" />
<script type="text/javascript" src="http://example.com/wp-content/cache/minify/000000/M9bPKixNLarUMYYydHMz04sSS1L1cjPz4IJ6uYnF-XkgGihooF9SnppXUlmSkVlUkpqap59VrJ9WmpdckpmfVwwA.js"></script>

Если дизайн сайта повреждён, возможно, правила перезаписи минификации в lighttpd.conf указаны неверно или вы забыли перезапустить lighttpd.

Кэширование страниц

Функция кэширования страниц создаёт статические HTML-файлы с контентом сайта и обслуживает их для пользователей на основе правил перезаписи. Правила перезаписи были указаны ранее, потому сейчас можно просто открыть wp-admin > Performance > General Settings и включить кэширование.

По молчанию для кэширования используется метод Disk: Enhanced; если вы случайно выбрали другой метод, вернуть стандартный метод не получится, так как эта опция отключена.

Потому эту настройку придётся изменить вручную:

cd /var/www/example.com
sed -i "s/'pgcache.engine' => '\([a-z]\+\)'/'pgcache.engine' => 'file_generic'/" wp-content/w3tc-config/master.php
sed -i "s/'pgcache.engine' => '\([a-z]\+\)'/'pgcache.engine' => 'file_generic'/" wp-content/cache/config/master.php

Это включит кэширование страниц по методу Disk Enhanced. Чтобы убедиться в корректной работе кэширования, создайте запрос к некэшированной странице при помощи curl:

# curl -v -s -o /dev/null http://example.com/about/
* About to connect() to example.com port 80 (#0)
*   Trying 1.1.1.1... connected
> GET /about/ HTTP/1.1
> User-Agent: curl/7.23.1
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Link: <http://example.com/?p=28>; rel=shortlink
< Last-Modified: Tue, 05 Nov 2013 15:55:53 GMT
< Vary:
< X-Pingback: http://example.com/xmlrpc.php
< Content-Type: text/html; charset=UTF-8
< Transfer-Encoding: chunked
< Date: Tue, 05 Nov 2013 15:55:53 GMT
< Server: lighttpd/1.4.31
<
{ [data not shown] * Connection #0 to host example.com left intact
* Closing connection #0

Затем повторите этот запрос:

# curl -v -s -o /dev/null http://example.com/about/
* About to connect() to example.com port 80 (#0)
*   Trying 1.1.1.1... connected
> GET /about/ HTTP/1.1
> User-Agent: curl/7.23.1
> Host: example.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
< Content-Type: text/html
< Accept-Ranges: bytes
< ETag: "94995388"
< Last-Modified: Tue, 05 Nov 2013 15:55:53 GMT
< Content-Length: 23659
< Date: Tue, 05 Nov 2013 15:55:55 GMT
< Server: lighttpd/1.4.31
<
{ [data not shown] * Connection #0 to host example.com left intact
* Closing connection #0

Обратите внимание на разные заголовки ответов. Первый ответ имеет заголовок Link: и X-Pingback. Эти заголовки добавлены PHP. Второй ответ – это чистый HTML, потому в нём нет этих заголовков. Также можно просмотреть кэшированные страницы на диске:

root@wp-lighttpd:~# ls -lR /var/www/example.com/wp-content/cache/page_enhanced/www.example.com/
/var/www/example.com/wp-content/cache/page_enhanced/www.example.com/:
total 12
drwxr-xr-x 2 www-data www-data 4096 Nov  5 21:25 about
drwxr-xr-x 2 www-data www-data 4096 Nov  5 21:21 front-page
drwxr-xr-x 2 www-data www-data 4096 Nov  5 21:23 sample-page
/var/www/example.com/wp-content/cache/page_enhanced/www.example.com/about:
total 24
-rw-r--r-- 1 www-data www-data 23659 Nov  5 21:25 _index.html
/var/www/example.com/wp-content/cache/page_enhanced/www.example.com/front-page:
total 28
-rw-r--r-- 1 www-data www-data 25100 Nov  5 21:21 _index.html
/var/www/example.com/wp-content/cache/page_enhanced/www.example.com/sample-page:
total 28
-rw-r--r-- 1 www-data www-data 25837 Nov  5 21:23 _index.html

Чтобы убедиться в том, что сайт поддерживает функцию сжатия, используйте опцию –compressed команды curl:

# curl -v -s -o /dev/null/ --compressed http://example.com/about/
* About to connect() to example.com port 80 (#0)
*   Trying 1.1.1.1... connected
> GET /about/ HTTP/1.1
> User-Agent: curl/7.23.1
> Host: www.example.com
> Accept: */*
> Accept-Encoding: deflate, gzip
>
< HTTP/1.1 200 OK
< Vary: Accept-Encoding
< Content-Encoding: gzip
< Last-Modified: Tue, 05 Nov 2013 15:55:53 GMT
< ETag: "2062104151"
< Content-Type: text/html
< Accept-Ranges: bytes
< Content-Length: 4819
< Date: Tue, 05 Nov 2013 16:01:03 GMT
< Server: lighttpd/1.4.31
<
{ [data not shown] * Connection #0 to host www.example.com left intact
* Closing connection #0

Обратите внимание на заголовки Content-Length и Content-Encoding: ранее длина контента была 23659, а теперь всего 4819.

Кэш браузера

Этот тип кэширования задаёт период времени, в течение которого браузер хранит кэшированные объекты (изображения, CSS и JS). Для этого нужно добавить заголовки Expires и Cache-Control, за что отвечает модуль mod_expire.

Включите модуль:

lighttpd-enable-mod expire

И добавьте в виртуальный хост необходимые настройки.

nano /etc/lighttpd/lighttpd.conf
#Browser Cache
$HTTP["cookie"] !~ "(wordpress_logged_in)" {
$HTTP["url"] =~ "^/(.+\.(css|js|png|jpg|bmp|ico)\??.*)$" {
expire.url = ( "" => "access plus 365 days" )
}
}

Этот блок кода сначала проверяет, аутентифицирован ли пользователь, а затем ищет файлы с указанными расширениями. В скобки можно добавить и другие расширения, отделив их символом вертикальной черты (|). Перезапустите lighttpd:

service lighttpd force-reload

Проверьте новые заголовки при помощи curl.

# curl -I example.com/wp-content/themes/twentythirteen/style.css
HTTP/1.1 200 OK
Expires: Wed, 05 Nov 2014 16:31:33 GMT
Cache-Control: max-age=31536000
Content-Type: text/css
Accept-Ranges: bytes
ETag: "2905279475"
Last-Modified: Thu, 24 Oct 2013 19:39:10 GMT
Content-Length: 52290
Date: Tue, 05 Nov 2013 16:31:33 GMT
Server: lighttpd/1.4.31

Обновление плагина

Данная настройка выполнена на WordPress 3.7.1 и W3 Total Cache 0.9.3. Любые дальнейшие обновления W3 Total cache, изменяющие структуру каталогов перезаписи, нарушат минификацию и кэширование страниц.

Потому рекомендуется установить плагин на отдельном сервере (к примеру, WordPress на Ubuntu 12.10) и просмотреть файл .htaccess на наличие новых правил, прежде чем обновить плагин.

Правила можно переместить на lighttpd.

Для минификации Apache использует правило:

RewriteBase /wp-content/cache/minify/
RewriteRule ^(.+\.(css|js))$ ../../plugins/w3-total-cache/pub/minify.php?file=$1 [L]

На сервере lighttpd это правило:

url.rewrite-final = (
"^/wp-content/cache/minify/(.+\.(css|js))$" => "/wp-content/plugins/w3-total-cache/pub/minify.php?file=$1"
)

Для кэширования страниц Apache использует правило:

RewriteRule .* "/wp-content/cache/page_enhanced/%{HTTP_HOST}/%{REQUEST_URI}/_index.html" [L]

Lighttpd не позволяет использовать переменные сервера в директивах rewrite, потому их нужно жёстко запрограммировать:

url.rewrite-if-not-file = (
"(.*)" => "/wp-content/cache/page_enhanced/example.com/$1/_index.html"

Tags: , , ,

Добавить комментарий