Как правильно настроить 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
Начнется процесс верификации и установки цифрового сертификата.
Выбираем второй вариант — поднять временный веб-сервер для верификации.
Нажимаем ОК.
Вводим наш контактный адрес электронной почты. Нажимаем ОК.
Идем читать Terms of Services, после прочтения, если согласны (что-то мне подсказывает, что так и есть), нажимаем «Agree».
Вводим наше доменное имя, нажимаем ОК. На этом всё. Сертификат и ключ лежат там, где мы уже их ждем. Теперь можно стартовать 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). Сервер базы данных оставляем localhost, префикс таблиц оставляем «wp_». Нажимаем кнопку «Отправить».
Видим сообщение о том, что можно запускать установку. Нажимаем кнопку «Запустить установку».
Перед установкой нужно задать еще кое-какие настройки. В первую очередь это название сайта («FreeSW — мой вордпресс»), затем имя пользователя, который будет использоваться как администратор, его пароль (чем сложнее, тем лучше) и, напоследок, адрес электронной почты. Теперь нажимаем «Установить WordPress».
По окончании установки вы увидите вот такое поздравление. Нажимаем кнопку «Войти» и переходим к странице логина. После ввода логина и пароля вы попадете в панель управления.
Вот, собственно, WordPress установлен, но это еще не всё, что нужно сделать. Нужно установить еще несколько плагинов. Как ни странно, установка плагинов должна помочь нашему сайту работать лучше. Плагин Akismet уже установлен, его надо оставить. Этот плагин предоствращает спам в комментариях и работает достаточно хорошо. Если его не устанавливать, вам придется разгребать спам-комментарии самостоятельно.
Установка плагина JetPack для WordPress
Плагин JetPack делает много всего интересного, но нас больше всего интересует возможность использования CDN от WordPress с названием Proton. В меню «Плагины» выбираем «Добавить новый». На открывшейся страничке видим вот такой плагин:
Нажимаем кнопку «Установить». После установки надпись на кнопке поменяется на «Активировать». Нажимаем её. Нас перенаправляет на такую страничку:
Нажимаем кнопку «Подключение к WordPress.com». Если вы уже зарегистрированы, то вма нужно будет только нажать кнопку «Approve», если нет, то придется сначала зарегистрировать, что я и рекомендую. После этого вас перенаправит обратно в админ-панель вашего сайта.
Нажимаем кнопку «Активировать рекомендованные функции». Будут активированы следующие функции:
- Блокировка несанкционированных попыток входа
- Эффективная работа с изображениями (Proton)
Дополнительно можно включить «Мониторинг простоя», чтобы получать извещения по электронной почте о том, что ваш сайт недоступен.
Плагин Akismet
Чуть выше я уже написал, зачем он нужен. Теперь его надо активировать. Переходим в «Плагины» -> «Установленные» и кликаем «Активировать». После активации вам нужно получить API-ключ.
Теперь перейдём к установке плагина для кэширования.
Установка плагина W3 Total Cache
В панели в меню «Плагины» -> «Добавить новый» в поиске набираем «W3 Total Cache», устанавливаем и активируем.
Этот плагин позволяет очень детально настроить кэширование для вашего сайта. Да, это займет некоторое время, но это определенно того стоит. Надо только помнить вот о чем при использовании этого плагина: при включении какой-то настройки тщательно проверяйте, всё ли правильно работает.
В заключение
Возможно, это не самая лучшая конфигурация WordPress, но это очень неплохой вариант для начала, который позволит не только сэкономить денег на хостинге, но и ускорить работу вашего сайта минимальными усилиями. В дальнейшем вы можете оптимизировать работу сайта дальше. Помните только о том, что не все плагины одинаково полезны.
Как обычно, жду в комментариях предложения, дополнения, замечания.
P.S.: Присмотритесь к плагинам Yoast SEO и WP-Mail-SMTP ;-)
Постоянно ругается на 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
Можно весь конфиг посмотреть?
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
У вас точка пропущена. Должно быть «ln -s /etc/nginx/sites-available/wordpress .», что в данном случае значит то же самое, что и «ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress».
Спасибо Максим буду иметь виду за точку.
Да и у меня всё заработало полез в SFTP за конфигом и обнаружил посторонние символы которые в редакторе не отображались.
Привет Максим!
Для автоматического продления наверно нужно сначала приостановить работу NGINX.
Иначе команда /usr/bin/letsencrypt renew не работает ругается на занятость 80го порта..
Привет! На самом деле надо для автоматического продления использовать webroot, я чуть позже Let’s Encrypt вынесу в отдельную статью, где детально опишу, какой способ когда лучше использовать, и как это сделать удобно.
Отличная статья для начинающих и для тех кто просто хочет слезть с публичных блог платформ на свой маленький бложик.
Вот все не решался сделать свой бложик, теперь благодаря этой статье начну поднимать свой сайтик!
Спасибо