Рубрики
WebDev Wordpress Операционные системы

Поднимаем виртуальный сервер на LEMP с CMS WordPress(Linux+Nginx+MYSQL+PHP+WordPress)

В этом гайде будет разобрана установка виртуального сервера на связке Linux+Nginx+MYSQL+PHP для производительного хостинга для сайта на WordPress. Это в разы более производительный вариант сервера, нежели вариант на Apache.

Все нижеописанные действия проводились на компьютере под управлением Windows 10, десктопным процессором i3 с поддержкой технологий виртуализации, 4 Гб оперативной памяти и SSD-диском на 120 Гб .

Все упоминания yoursite, yourdomen, yourname и т. д. подразумевают замену на Ваше значение. Т . е. если Вы прикупили для будущего сайта имя s3abreeze в доменной зоне .ru, и в гайде Вам попалось yoursite, то следует ввести s3abreeze. Если попалось yoursite.yourdomen, то вводите s3abreeze.ru. Надеюсь с этим проблем не возникнет.

Поехали!

Для начал установим основу нашего сервера, свободно распространяемый пакет виртуализации — VirtualBox. Заходим на сайт VirtualBox и жмем большущую кнопку:

Выбираем дистрибутив для используемой системы(В нашем случае Windows):

Запускаем скачанный дистрибутив и следуем инструкциям установщика.

Во время установки нужно будет принять предупреждение и согласиться на установку виртуального устройства.

После установки запускаем программу и создаем виртуальную машину:

 

Заполните указанные поля(оперативной памяти в 1 Гб для 1 сайта на wordpress более, чем достаточно):

Следующим шагом будет выбор объема жесткого диска и тип(предпочтительно создавать фиксированный жесткий диск):

Ждем окончания процесса создания виртуального пк:

Теперь созданная машина будет отображаться в левой панели VirtualBox. Выбираем ее жмем Настроить для финальной настройки:

В настройках все можно оставить по-умолчанию, кроме пункта Cеть — здесь необходимо выставить режим Сетевой мост:

Теперь оставим окно настроек открытым и перейдем в браузер для скачивания операционной системы для нашего сервера. Использовать будем Ubuntu 18.04 LTS Server. Это не самая свежая редакция, но приставка LTS говорит о том, что данная версия имеет длительный срок поддержки и в случае с версией 18.04 — поддержка продлится до 2023 года.

Переходим по ссылке: https://ubuntu.com/download/server/thank-you?country=RU&version=18.04.3&architecture=amd64  и подтверждаем загрузку серверной версии Ubuntu 18.04 LTS:

Или можно воспользоваться альтернативным источником  загрузки:

По завершению скачивания образа ubuntu-18.04.3-live-server-amd64 возвращаемся к настройкам виртуальной машины. Подключаем образ ОС к оптическому приводу виртуальной машины:

 

Теперь можно запустить созданную машинку и приступить к установке ubuntu:

Я настоятельно рекомендую использовать английский язык в ubuntu:

А вот раскладку, разумеется выбираем русскую:

Переключение раскладок я предпочитаю оставлять по-умолчанию -виндовое:

С настройками сети придется повозиться. Во-первых нужно наличие статического белого IP(предоставляется провайдером, как правило на платной основе), который позволяет обращаться к вашему роутеру извне. Существует сервис No-Ip, предоставляющий ip адреса, и даже вроде как бесплатно. Не знаю — не пользовался. Зарегистрированный домен, который следует привязать к этому статическому ip. Помимо ip — адреса необходимо будет настроить проброс портов от роутера к виртуальному серверу. Например, по умолчанию обращение к серверу сайта происходит через порт 80, обращение сайту, защищенному SSL сертификатом происходит через порт 443. Теперь смотрите, заходим на домен https://yoursite.yourdomen, и открывается у нас админка роутера. Поэтому в данном примере нужно сделать так, что бы обращение к порту 443, роутер перебрасывал на локальный адрес нашего сервера, например на 192.168.1.150. Это и есть функция роутера, называемая проброс портов. Админки роутеров отличаются друг от друга и гайд по пробросу именно на вашей модели роутера следует искать индивидуально. Но принцип я разобрал в примере выше.

По умолчанию установлено автоматическое назначение роутером локального адреса для машины(DHCP). Это может быть не очень удобно. Например у нас проброшены порты к автоматически назначенному серверу ip 192.168.1.50, но при перезагрузке компьютера с VirtualBox или самого виртуального сервера, произошло переназначение ip адреса. То порты придется пробрасывать заново, уже для нового ip. Поэтому назначим вручную постоянный локальный адрес виртуальной машины. Заходим в настройки роутера и смотрим занятые локальные ip адреса. Допустим локальный адрес 192.168.1.150 не занят.

Возвращаемся к окну виртуалки и выбираем настройку сети вручную:

Этих данных достаточно для настройки сети, остальное сервер подхватит с роутера.

5 шаг также пропускаем.

Далее идет разметка диска. Я выбираю следующий вариант:

Здесь только добавляю раздел Swap(подкачка):

*На скриншотах объем диска равен 10 Гб вместо рекомендованных мной 20 Гб. Это связано исключительно с целью экономии места на физическом диске моего компьютера, так как этот виртуальный сервер не будет использован под проекты, а будет удален сразу после создания всех необходимых для гайда скриншотов.

2 Гб будет достаточно и формат выбираем swap:

Нажимаем кнопку Done>Continue>Create

Заполняем административные данные и переходим к следующему экрану:

С помощью клавиши пробел отмечаем пункт Install OpenSSH server и продолжаем:

На следующем экране будет предложено установить дополнительное ПО, просто игнорируем его нажав Done. Начнется установка файлов операционной системы.

Возможно вылезет пару запросов о перезагрузке, с которыми следует согласиться. После загрузки Ubuntu заходим под указанными при установки логином и паролем и приступаем к установке серверного движка и других его компонентов.

Состав сервера будет таким:

  • MariaDB(MySql) — в качестве базы данных
  • Nginx — Шустрый веб-сервер
  • Redis — резидентная система управления базами данных класса NoSQL
  • Nginx FastCGI Cache — самый быстрый из доступных ускоритель HTTP
  • Fail2ban — защита от спама и перебора

Включаем режим root-доступа

Чтобы не писать перед каждой командой sudo, давайте включим режим суперпользователя(root)

sudo passwd root

Вас попросят создать новый пароль для суперпользователя.

sudo -i

Вводим пароль.

Теперь командная строка консоли поменяется с такой :

на такую:


(Чтобы отключить учетную запись суперпользователя введите команду: sudo passwd -dl root)

Устанавливаем компоненты:

Можно просто копировать/вставлять

apt install software-properties-common
add-apt-repository ppa:ondrej/php
apt-get update && apt-get upgrade
apt-get install -y mariadb-server mariadb-client
apt-get -y install php7.3
apt-get purge apache2 -y
apt-get install nginx -y
apt-get install -y tmux curl wget php7.3-fpm php7.3-cli php7.3-curl php7.3-gd php7.3-intl
apt-get install -y php7.3-mysql php7.3-mbstring php7.3-zip php7.3-xml unzip php7.3-soap php7.3-redis
apt-get install -y redis
apt-get install -y fail2ban
apt-get install -y postfix

Настраиваем компоненты

REDIS

Открываем файл конфигурации:

nano /etc/redis/redis.conf

Скроллим файл в конец и вставляем:

#You can adjust this value as you see fit - 200mb or 20000mb
#it depends on how much RAM you have. On a 1GB server, I use 100mb.
maxmemory 200mb
# this forces old keys to be deleted using first-in-first-out
maxmemory-policy allkeys-lru

Далее находим следующие строки:

save 900 1
save 300 10
save 60 10000

…и комментируем их:

#save 900 1
#save 300 10
#save 60 10000

Перезагружаем Redis:

service redis-server restart

MARIADB(MYSQL)

Запускаем сервис, добавляем его в автозагрузку и инициируем настройку безопасности:

systemctl start mariadb.service
systemctl enable mariadb.service
mysql_secure_installation

После ввода последней команды запускается пошаговое усиление сервера баз данных, просто следуйте инструкции программы.

Теперь войдем в mariadb(mysql), создадим базу, пользователя для неё, предоставим пользователю стандартные привилегии и сделаем сброс:

mysql -u root -p
CREATE DATABASE yoursite_db;
CREATE USER 'yoursite_db'@'localhost' IDENTIFIED BY 'secure_password';
GRANT ALL ON yoursite_db.* TO 'yoursite_db'@'localhost';
FLUSH PRIVILEGES;
EXIT;

PHPMYADMIN

Для удобства работы с базами, установим PHPMyadmin.

apt install phpmyadmin

А для удобства доступа к панели phpmyadmin, создадим символическую ссылку:

ln -s /usr/share/phpmyadmin /var/www/yoursite

После завершения вышеописанных действий, вход в phpmyadmin можно будет выполнить пройдя по адресу в браузере:

https://yoursite.yourdomen/phpmyadmin/

NGINX

Для большего удобства скачиваем из моего репозитория заготовку конфигурационного файла для блока сайта, копируем файл в каталог доступных блоков(sites-available), а затем активируем блок сайта копированием файла в каталог активных блоков(sites-enabled). Файл с настройками блока по-умолчанию — затираем.

cd ~
git clone https://github.com/s3abrz/quickNginxStack4ubuntu18Wordpress
cp quickNginxStack4ubuntu18Wordpress/nginx/* /etc/nginx/ -R
ln -s /etc/nginx/sites-available/yoursite.conf /etc/nginx/sites-enabled/
rm /etc/nginx/sites-enabled/default

Скопированные выше файлы, также содержат сниппеты для ускорения сайта и конфиги кэширования. Для них понадобятся рабочие каталоги:

mkdir /var/www/cache
mkdir /var/www/cache/yoursite
chown www-data:www-data /var/www/cache/ -R

Перед перезапуском NGINX следует подредактировать скачанный конфигурационный файл.

nano /etc/nginx/sites-available/yoursite.conf

Внутри файла следует заменить все тексты yoursite и yourdomen(server_name yoursite.yourdomain;), на ваши значения.

Перезагружаем сервер NGINX:

service nginx restart


WORDPRESS

Скачиваем, распаковываем, перемещаем свежайшую версию WordPress в папку сайта. Выставляем рекурсивно владельца папок и файлов сайта. И удаляем ненужный более архив.

wget https://wordpress.org/latest.zip -P /var/www/
unzip /var/www/latest.zip -d /var/www/
mv /var/www/wordpress /var/www/yoursite
chown www-data:www-data /var/www/yoursite -R
rm /var/www/latest.zip

Теперь переходите в браузере на страницу вашего сайта и пройдите процесс установки.

Во время установки используйте данные ранее созданной базы данных(название бд, логин пользователя бд и его пароль:

Знаменитая сверхбыстрая установка WordPress окончена. Едем дальше.

Доступ по sftp

Чтобы вывести только список групп текущего пользователя, необходимо использовать опцию -G:

id -G

Команда выводит идентификаторы групп, если вы хотите получить их имена, то необходимо добавить опцию -n:

id -Gn

Если надо узнать список групп для определённого пользователя, просто передайте его имя в качестве параметра:

id -Gn имя_пользователя

Следующий вариант просмотра списка групп — команда groups:

groups

И точно также можно узнать группу пользователя Linux, передав его имя команде:

groups имя_пользователя

Добавляем себя в нужные группы:

usermod -a -G root yourname
usermod -a -G www-data yourname

Создаем символьную ссылку на ресурсы сайтов внутри каталога пользователя(нас).

ln -s /var/www /home/yourname/

Если »промахнулись» с папками, можно отлинковать ошибочную следующим образом:

unlink /home/yourname/www

Раздельно меняем права на папки и файлы для доступа по sftp под текущим пользователем.

find /var/www/ -type d -exec chmod 775 {} \;

find /var/www/ -type f -exec chmod 664 {} \;

ДОБАВЛЯЕМ SSL

LET’sENCRYPT

Для добавления ssl сертификата можно воспользоваться средствами CDN сервиса Cloudflare, либо Let’sEncrypt.

Сначала разберем вариант Let’sEncrypt. Выполняем следующую последовательность:

apt-get update
apt-get install software-properties-common
add-apt-repository universe
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install python-certbot-nginx
certbot --nginx

Выше указанные команды добавляют репозиторий и устанавливают из него сертификационного бота.

Он сканирует конфигурацию NGINX, выясняет доменные имена, наличие/отсутствие установленного сертификата и устанавливает его при отсутствии.

Для автопродления сертификата запускаем Cron и добавляем задачу:

crontab -e
0 0 1 * * certbot renew

CLOUDFLARE

Для варианта с Cloudflare, заходим на сайт сервиса https://dash.cloudflare.com/ и регистрируемся. Следуем указаниям сервиса для добавления своего домена в обработку Cloudflare.

Затем создаем сертификат для полного шифрования трафика:

НЕ ЗАКРЫВАЙТЕ ОКНО со свежесгенерированным сертификатом и ключом. Иначе придется создавать новый, так как ключ больше показан не будет.

Возвращаемся к консоли сервера.

Создаем в любой удобной папке на сервере(например /etc/cloudflare_ssl/) файл:

nano /etc/cloudflare_ssl/fullchain.pem

Вставляем в него скопированное содержимое предоставленное Cloudflare и сохраняем(CTRL+X > Y > ENTER)

Создаём рядом еще один файл:

nano /etc/cloudflare_ssl/privkey.pem

Копируем в него данные ключа сертификата Cloudflare и сохраняем(CTRL+X > Y > ENTER)

Удостоверяемся, что в настройках WordPress адрес сайта указан аналогичным образом(адрес должен начинаться с https://, если нет, то приводим к подобному виду):

Теперь в настройках сайта Cloudflare можно выбрать полное шифрование:

Дополнительно рекомендую создать, так называемого уокера/воркера/woker’а/раба, который будет принудительно перенаправлять весь трафик по ssl:

ТОНКИЕ НАСТРОЙКИ И ОПТИМИЗАЦИЯ

MARIADB(MySql)

Открываем редактором:

nano /etc/mysql/my.cnf

Вставляем и сохраняем:

# Кэш для работы с ключами и индексами
key_buffer = 64M
#Кэш запросов 
query_cache_size = 32M
# Установка MyISAM в качестве стандартного движка
default-storage-engine=MyISAM
# Отключение движка
InnoDB skip-innodb

После установки движка возможно WordPress потребует переустановки, выполните её(Или удалите последние два пункта, касающиеся движка БД).

PHP

Открываем редактором:

nano /etc/php/7.3/fpm/php.ini

И приводим указанные значения к подобному виду:

max_execution_time = 6000
memory_limit = 512M
upload_max_filesize = 50M

А так же снимите комментирование и измените значение следующей строки на 5000 вместо:

;max_input_vars = 1000

Должно быть:

max_input_vars = 5000


В этом же файле установите следующие значения(если каких то строк не будет в вашем конфиге — пропишите сами):

opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=50000
opcache.revalidate_freq=60
opcache.fast_shutdown=1
opcache.enable=1

Сохраните файл и откройте следующий:

nano

/etc/php/7.3/fpm/pool.d/www.conf

Поменяйте эту строку pm = dynamic на:

pm = static

И выставьте значение строки

pm.max_children

равным 10:

pm.max_children = 10

Fail2Ban

Борьба против спама может быть очень ресурсоёмкой. И fail2ban заметно облегчает её. Тонкая настройка данного скрипта довольно обширна и не будет рассматриваться в данном гайде. Для начала установите плагин WP fail2ban, активируйте и следуйте инструкциям плагина. WP fail2ban также имеет дополнения для таких популярных плагинов контактных форм как:

Redis

Устанавливаем плагин Redis Object Cache и просто включаем его:

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

Кэширование уже было настроено нами, если нужен полный контроль и ручная очистка кэша, можно ещё установить плагин Nginx Cache.

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

Например, если нужно gzip сжатие обслуживаемое nginx, то можно добавить в оба блока(80/443) файла /etc/nginx/sites-available/youtsite.conf следующую строку:

include snippets/gzip.conf

Но если вы используете сервис Cloudflare, то логичнее перекинуть заботу о сжатии на него.

Возможно вы пользуетесь плагином Yoast SEO. Тогда рекомендую подключить следующий сниппет:

include snippets/yoast-sitemaps.xml

Эту строку нужно добавить в оба блока(80/443) файла /etc/nginx/sites-available/youtsite.conf

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

Я постарался максимально полно и пошагово расписать процесс настройки виртуального сервера для self-хостинга на связке на LEMP + WordPress. Дело в том, что я сам очень долго искал подробный гайд по этой теме, но везде сталкивался с непредвиденными ошибками и несостыковками. Надеюсь этот гайд убережёт от тех же ошибок, что преследовали меня. Если есть вопросы/предложения/дополнения или в моем тексте обнаружится ошибка — пишите в комментариях.

 

 

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