Установка 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"