В этом гайде будет разобрана установка виртуального сервера на связке 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. Дело в том, что я сам очень долго искал подробный гайд по этой теме, но везде сталкивался с непредвиденными ошибками и несостыковками. Надеюсь этот гайд убережёт от тех же ошибок, что преследовали меня. Если есть вопросы/предложения/дополнения или в моем тексте обнаружится ошибка — пишите в комментариях.