WordPress: как правильно настроить

Как правильно настроить WordPressКак правильно настроить WordPress для его быстрой работы? WordPress — одна из наиболее популярных систем управления контентом (CMS), но, к сожалению, нужно уметь ее правильно настраивать, чтобы обеспечить максимальную скорость работы и минимальное время отклика. Это позволит в том числе сэкономить на стоимости хостинга. Казалось бы, ничего сложного. Берем сервер, ставим пакеты, скачиваем свежий WordPress, устанавливаем его, и всё. Но, на самом деле, всё не так просто. Для настройки сервера для быстрой и эффективной работы сайта на базе системы управления контентом WordPress потребуется следующее:

  • Сервер с операционной системой Debian GNU/Linux 8 (Jessie)
  • Система управления базами данных MariaDB или MySQL
  • PHP-FPM + PHP-APC
  • Веб-сервер Nginx
  • Сам WordPress последней версии,
  • Уже достаточно известная система выдачи цифровых сертификатов Let’s Encrypt
  • кое-какие плагины для WordPress

Сервер с операционной системой Debian GNU/Linux 8 (Jessie)

Где взять сервер? Один из лучших вариантов, который я могу лично рекомендовать, — Digital Ocean. Почему именно там? Во-первых, для приемлемой работы сайта достаточно минимальной конфигурации виртуального сервера из тех, которые у них доступны (1 ядро частотой 1.8GHz, 512Mb оперативной памяти, 20Gb дискового пространства). Во-вторых, выделенный белый IP-адрес уже включен в стоимость. В-третьих, дают бесплатно 10$ при регистрации по рефссылке. В-четвертых, если введете промо-код ALLSSD10, получите еще 10$. Итого 4 месяца бесплатно, потому что сам сервер стоит 5$ в месяц. В-пятых, если вы занимаетесь разработкой, то есть API, который позволяет развернуть целое окружение при необходимости. Есть еженедельные бэкапы всего сервера за 1$/месяц, но можете делать их сами, например, в Yandex.Disk. Как его подключить можно почитать здесь.

В принципе, можете выбирать любой сервер, который вам больше нравится. Почему я рекомендую Debian в качестве операционной системы? Потому что он отлично подходит для продакшен-конфигураций благодаря тому, что стабильный релиз уже тщательно оттестирован, и вероятность всяких неожиданностей очень низка. Плюс огромное количество информации, большое коммьюнити и очень быстрое исправление уязвимостей. А также потому, что Debian является родителем Ubuntu, которую в своё время достаточно широко пиарили, благодаря чему это достаточно известный дистрибутив и он похож на Debian, хотя различий тоже хватает.

Самое главное — нам нужен отдельный сервер, чтобы можно было настраивать всё необходимое, что нельзя настроить на так называемом шаред-хостинге.

Прежде чем приступать к установке программного обеспечения, надо закомментировать все строчки файла /etc/apt/sources.list, которые начинаются с «deb-src».

sed -i /etc/apt/sources.list -e 's/deb-src/#deb-src/g'

И затем выполняем команду

apt-get update

Будем предполагать, что у вас уже есть некоторое зарегистрированное доменное имя, которое указывает на адрес сервера. В моем случае это будет доменное имя freesw.cf.

Система управления базами данных

В качестве системы управления базами данных (СУБД) я рекомендую MariaDB или MySQL. Почему MariaDB? Вот поэтому. Однако некоторые приложения, если вы их ставите из пакетов, требуют по зависимостям именно MySQL (пакет mysql-server), поэтому, если вы что-то такое поставили на сервер (например, MediaWiki), то вам имеет смысл поставить именно MySQL (пакет mysql-server). Ставим пакеты:

apt-get install mariadb-server

По зависимостям установится еще около десятка пакетов. В процессе установки будет запрошен пароль пользователя root. ЭТО НЕ ТОТ ЖЕ root, который используется в системе, поэтому в целях безопасности рекомендуется использовать другой пароль.

После установки помним, что памяти у нас всего 512 Mb, что не очень много, и в зависимости от нагрузки на сайт, может быть придется уменьшить размеры буферов БД для снижения потребления памяти. Для этого в файле /etc/mysql/my.cnf запомните следующие строчки:

key_buffer              = 16M
max_allowed_packet      = 16M
thread_stack            = 192K
thread_cache_size       = 8
query_cache_limit       = 1M
query_cache_size        = 16M
# А этой строчки может не быть, но надо ее знать
# Если MySQL станет падать из-за нехватки памяти, она пригодится
innodb_buffer_pool_size        = 20M

PHP-FPM

Следующее, что ставим после СУБД, — это PHP-FPM. Что это такое? Это PHP FastCGI Process Manager, менеджер процессов для бинарного протокола FastCGI, используемого для взаимодействия приложений с веб-сервером. Он работает очень быстро по сравнению с модулями для веб-серверов, и отлично работает с веб-сервером Nginx, который мы будем использовать.
Устанавливаем пакеты:

apt-get install php5-fpm php5-mysql

После установки идём в директорию /etc/php5/fpm. Делаем резервную копию директории pool.d:

cp -R pool.d pool.d.orig

Теперь в директории pool.d (/etc/php5/fpm/pool.d) удаляем файл www.conf и создаем там же файл wordpress.conf следующего содержания:

[wordpress]

user = www-data
group = www-data

listen = /var/run/php-fpm-wp.sock
listen.backlog = -1
listen.owner = www-data
listen.group = www-data

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
pm.max_requests = 500

; Доменное имя вашего сайта здесь
env[HOSTNAME] = freesw.cf
env[PATH] = /usr/local/bin:/usr/bin:/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

php_admin_value[error_log] = /var/log/nginx/wordpress-fpm.log

И теперь рестартуем php5-fpm:

service php5-fpm restart

APCu

APCu — это Alternative PHP Cache for userland. Это быстрое решение для кэширования PHP локально. Может использоваться совместно с memcached. Нужен этот кэш для того, чтобы не генерировать странички каждый раз, а сгенерировать один раз и отдавать потом много раз. Генерация заметно медленнее, чем отдача из кэша.

Ставим пакет:

apt-get install php5-apcu

Установка и настройка Nginx

Почему именно Nginx? Ну, тут много всяких причин: он расходует относительно мало ресурсов, отлично работает с FastCGI, умеет работать с memcached, умеет работать с дисковым кэшем, работает при необходимости с бэкендом как реверс-прокси, очень надежный, быстрый и гибкий в настройке.

Ставим пакеты:

apt-get install nginx

После установки создаем конфигурационный файл /etc/nginx/sites-available/wordpress и записываем в него следующее (не забывая поменять «freesw.cf» на название вашего домена):

upstream php {
        server unix:/var/run/php-fpm-wp.sock;
}

server {
        server_name freesw.cf;
        listen 80 default_server;
        listen 443 ssl;

        root /var/www/wordpress;
        index index.php;

        # ssl on;
        ssl_certificate /etc/letsencrypt/live/freesw.cf/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/freesw.cf/privkey.pem;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
        ssl_ciphers 'HIGH:!aNULL:!MD5:!kEDH';
        add_header Strict-Transport-Security "max-age=31536000; includeSubdomains;";

    gzip on;
    gzip_disable "msie6";
    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_proxied any;
    gzip_types text/plain text/css text/js text/xml text/javascript
        application/javascript application/x-javascript 
        application/json application/xml application/xml+rss
        image/svg+xml svg svgz;

    # redirect to https
    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

#        error_page 404 /404.html;

#        error_page 500 502 503 504 /50x.html;
#        location = /50x.html {
#                root /usr/share/nginx/html;
#        }

    location ~ \.php$ {
        proxy_cache wp-cache; 
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
        proxy_temp_path /var/cache/nginx/tmp;
        include fastcgi.conf;
        fastcgi_intercept_errors on;
        fastcgi_pass php;
    }

    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
        expires max;
        log_not_found off;
    }

    access_log /var/log/nginx/wordpress-access.log;
    error_log /var/log/nginx/wordpress-error.log;
}

Если у вас есть кастомные странички для ошибок 40x и 50x, можно раскомментировать соответствующие строчки.

Переходим в директорию /etc/nginx/sites-enabled. Удаляем дефолтный сайт, включаем wordpress:

cd /etc/nginx/sites-enabled
rm default
ln -s /etc/nginx/sites-available/wordpress .

Следующий файл, который надо поменять, — это /etc/nginx/nginx.conf. Сделайте резевную копию оригинального файла и запишите в nginx.conf следующее:

user www-data;
# Количество воркеров по количеству ядер
worker_processes 1;
pid /run/nginx.pid;

events {
        worker_connections 1024;
        # multi_accept on;
}

http {

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;

        client_max_body_size 100m;
        server_tokens off;

        server_names_hash_bucket_size 64;

        proxy_headers_hash_bucket_size 128;
        proxy_headers_hash_max_size 1024;
        # Определяем кэш
        proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=wp-cache:64m max_size=1000m inactive=60m;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        gzip on;
        gzip_disable "msie6";

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Таким образом, мы включили кэш nginx, компрессию, и настроили отдачу статики. Странички будут сначала запрашиваться из кэша, а потом, если их нет в кэше, будут запрашиваться с бэкенда. Если бэкенд вернул код 404, то страница в кэше будет находиться 1 минуту, если 200 или 302, то 60 минут. С этими циферками еще можно поработать, посмотреть, что можно еще улучшить.

Перезапускать nginx пока НЕ НАДО. Надо его просто остановить, если он в данный момент работает.

service nginx stop

Установка цифрового сертификата

Зачем сайту нужен цифровой сертификат? Прежде всего затем, что к такому сайту больше доверия у поисковых систем и посетителей, соответственно, последних будет больше. Для установки сертификата воспользуемся известной системой «Let’s Encrypt» и программным пакетом certbot. В первую очередь добавляем репозиторий для установки пакетов. Создаем файл /etc/apt/sources.list.d/certbot.list и записываем в него следующее:

deb http://ftp.debian.org/debian jessie-backports main

После этого обновляем список пактов и устанавливаем необходимые пакеты:

apt-get update
apt-get install certbot -t jessie-backports

После того, как пакеты установятся, нам надо сгенерировать сертификат. Даем команду:

certbot certonly

Начнется процесс верификации и установки цифрового сертификата.

Wordpress: как правильно настроить

Выбираем второй вариант — поднять временный веб-сервер для верификации.

Wordpress: как правильно настроить

Нажимаем ОК.

Wordpress: как правильно настроить

Вводим наш контактный адрес электронной почты. Нажимаем ОК.

Wordpress: как правильно настроить

Идем читать Terms of Services, после прочтения, если согласны (что-то мне подсказывает, что так и есть), нажимаем «Agree».

Wordpress: как правильно настроить

Вводим наше доменное имя, нажимаем ОК. На этом всё. Сертификат и ключ лежат там, где мы уже их ждем. Теперь можно стартовать nginx.

service nginx start

И теперь осталось добавить задание в крон для автоматического обновления сертификата. Добавляем в файл /etc/crontab строчку:

0 6 * * *   root    /usr/bin/letsencrypt renew --quiet && service nginx reload

 

Установка WordPress

Теперь можно устанавливать непосредственно WordPress. Сначала создадим базу данных для WordPress’а и пользователя, под которым он будет работать с этой базой данных.

mysql -u root -p

> create database wordpress;
Query OK, 1 row affected (0.00 sec)

> grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by 'YOURPASSWORD';
Query OK, 0 rows affected (0.00 sec)

> \q
Bye

Теперь будем устанавливать вордпресс. Переходим в директорию /var/www:

cd /var/www

Скачиваем с официального сайта последнюю версию WordPress:

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

Когда файл скачается распаковываем его:

tar -xf latest.tar.gz

Появится новая директория wordpress. Архив после распаковки можно удалить.

rm latest.tar.gz

Осталось выдать права на эту директорию пользователю www-data

chown -R www-data:www-data /var/www/wordpress

Можно переходить к непосредственной установке WordPress в браузере. Открываем в браузере адрес нашего сайта (в моем случае https://freesw.cf).

Wordpress: как правильно настроить

Выбираем язык (в моем случае русский), кликаем кнопку «Продолжить».

Wordpress: как правильно настроить

Читаем всё, что написано, убеждаемся, что мы уже знаем всё необходимое, нажимаем «Вперёд!».

Wordpress: как правильно настроить

Вводим название базы данных (wordpress), имя пользователя базы данных (wordpress), пароль (который мы вводили при выделении прав на базу данных пользователю wordpress). Сервер базы данных оставляем localhost, префикс таблиц оставляем «wp_». Нажимаем кнопку «Отправить».

Wordpress: как правильно настроить

Видим сообщение о том, что можно запускать установку. Нажимаем кнопку «Запустить установку».

Wordpress: как правильно настроить

Перед установкой нужно задать еще кое-какие настройки. В первую очередь это название сайта («FreeSW — мой вордпресс»), затем имя пользователя, который будет использоваться как администратор, его пароль (чем сложнее, тем лучше) и, напоследок, адрес электронной почты. Теперь нажимаем «Установить WordPress».

Wordpress: как правильно настроить

По окончании установки вы увидите вот такое поздравление. Нажимаем кнопку «Войти» и переходим к странице логина. После ввода логина и пароля вы попадете в панель управления.

Wordpress: как правильно настроить

Вот, собственно, WordPress установлен, но это еще не всё, что нужно сделать. Нужно установить еще несколько плагинов. Как ни странно, установка плагинов должна помочь нашему сайту работать лучше. Плагин Akismet уже установлен, его надо оставить. Этот плагин предоствращает спам в комментариях и работает достаточно хорошо. Если его не устанавливать, вам придется разгребать спам-комментарии самостоятельно.

Установка плагина JetPack для WordPress

Плагин JetPack делает много всего интересного, но нас больше всего интересует возможность использования CDN от WordPress с названием Proton. В меню «Плагины» выбираем «Добавить новый». На открывшейся страничке видим вот такой плагин:

Wordpress: как правильно настроить

Нажимаем кнопку «Установить». После установки надпись на кнопке поменяется на «Активировать». Нажимаем её. Нас перенаправляет на такую страничку:

Wordpress: как правильно настроить

Нажимаем кнопку «Подключение к WordPress.com». Если вы уже зарегистрированы, то вма нужно будет только нажать кнопку «Approve», если нет, то придется сначала зарегистрировать, что я и рекомендую. После этого вас перенаправит обратно в админ-панель вашего сайта.

Wordpress: как правильно настроить

Нажимаем кнопку «Активировать рекомендованные функции». Будут активированы следующие функции:

  • Блокировка несанкционированных попыток входа
  • Эффективная работа с изображениями (Proton)

Дополнительно можно включить «Мониторинг простоя», чтобы получать извещения по электронной почте о том, что ваш сайт недоступен.

Плагин Akismet

Wordpress: как правильно настроить

Чуть выше я уже написал, зачем он нужен. Теперь его надо активировать. Переходим в «Плагины» -> «Установленные» и кликаем «Активировать». После активации вам нужно получить API-ключ.

Теперь перейдём к установке плагина для кэширования.

Установка плагина W3 Total Cache

В панели в меню «Плагины» -> «Добавить новый» в поиске набираем «W3 Total Cache», устанавливаем и активируем.

Wordpress: как правильно настроить

Этот плагин позволяет очень детально настроить кэширование для вашего сайта. Да, это займет некоторое время, но это определенно того стоит. Надо только помнить вот о чем при использовании этого плагина: при включении какой-то настройки тщательно проверяйте, всё ли правильно работает.

В заключение

Возможно, это не самая лучшая конфигурация WordPress, но это очень неплохой вариант для начала, который позволит не только сэкономить денег на хостинге, но и ускорить работу вашего сайта минимальными усилиями. В дальнейшем вы можете оптимизировать работу сайта дальше. Помните только о том, что не все плагины одинаково полезны.

Как обычно, жду в комментариях предложения, дополнения, замечания.

P.S.: Присмотритесь к плагинам Yoast SEO и WP-Mail-SMTP ;-)

WordPress: как правильно настроить: 8 комментариев

  1. Alex

    Постоянно ругается на unknown directive

    nginx -t nginx: [emerg] unknown directive » ssl_protocols» in /etc/nginx/nginx.conf:32 nginx: configuration file /etc/nginx/nginx.conf test failed

    1. Maxim Norin Автор записи

      Можно весь конфиг посмотреть?

  2. Alex

    cd /etc/nginx/sites-enabled
    rm default
    ln -s /etc/nginx/sites-available/wordpress

    по моему вы имели виду

    sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress

    1. Maxim Norin Автор записи

      У вас точка пропущена. Должно быть «ln -s /etc/nginx/sites-available/wordpress .», что в данном случае значит то же самое, что и «ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress».

  3. Alex

    Спасибо Максим буду иметь виду за точку.

    Да и у меня всё заработало полез в SFTP за конфигом и обнаружил посторонние символы которые в редакторе не отображались.

  4. Alex

    Привет Максим!
    Для автоматического продления наверно нужно сначала приостановить работу NGINX.
    Иначе команда /usr/bin/letsencrypt renew не работает ругается на занятость 80го порта..

    1. Maxim Norin Автор записи

      Привет! На самом деле надо для автоматического продления использовать webroot, я чуть позже Let’s Encrypt вынесу в отдельную статью, где детально опишу, какой способ когда лучше использовать, и как это сделать удобно.

  5. AkeHayc

    Отличная статья для начинающих и для тех кто просто хочет слезть с публичных блог платформ на свой маленький бложик.
    Вот все не решался сделать свой бложик, теперь благодаря этой статье начну поднимать свой сайтик!

    Спасибо

Обсуждение закрыто.