Настройка VDS. Подробное руководство по развертыванию своего сервера.

Данное руководство предназначено для развертывания и настройки VDS сервера на примере Ubuntu 20.04 с установкой веб-сервера nginx, php 7 и сервера базы данных MySQL.

Автор материала

Артем Зернов. Веб-разработчик, создатель проекта Лектория, эксперт MODX Revolution, директор веб-студии OpenColour. Youtube-канал OpenModx.

14
29 минут на прочтение
Теги по этой теме:

Для чего?

Вы уже получили навыки в создании web приложений и хотите разместить созданный сайт в интернете, но как это сделать? Все просто! Есть хостинг провайдеры, которые, как раз и предоставляют услуги, по размещению сайтов в сети. Заходя на страничку к провайдеру, вы видите, что можно взять в аренду виртуальный хостинг или VDS.

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

Хостинг - это услуга по предоставлению ресурсов для размещения информации на сервере, постоянно имеющем доступ к интернету. Следовательно виртуальный хостинг - вид хостинга, при котором множество веб-сайтов расположено на одном веб-сервере. Это самый экономичный вид хостинга, подходящий для небольших проектов. Исходя из определения разные тарифы на виртуальные хостинг могут отличаться по следующим основным параметрам:

  1. размер дискового пространства;
  2. количество месячного трафика;
  3. количество сайтов, которые можно разместить в рамках хостинга как одной услуги;
  4. количество баз данных и количество места под базы данных;
  5. количество почтовых ящиков и FTP-аккаунтов;
  6. ресурсы CPU;
  7. количество оперативной памяти.
Примеры тарифов (хостинг timeweb)
Примеры тарифов (хостинг timeweb)

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

Альтернативой виртуального хостинга является использование VDS\VPS (Virtual Dedicated\Private Server) — это, виртуальный выделенный или приватный сервер, который предоставляется хостинг провайдером в аренду заказчику.Чтобы не вводить в заблуждение, сразу отмечу, что разницы между аббревиатурами VPS и VDS нет никакой. Дело в том, что два этих понятия появились практически одновременно и параллельно развивались.

Что же такое VDS? Говоря простым языком, поставщик услуг на своем оборудовании, с помощью средств виртуализации разворачивает несколько виртуальных (программных) серверов. С точки зрения функциональности такой сервер ничем не отличается от физического, на него также устанавливаются операционная система и программное обеспечение, он также расположен в сети и управляется, как и остальные ПК, средствами удаленного администрирования. При этом данный сервер находится на удаленной площадке провайдера, которая защищена от сбоев и оптимизирована под работу 24/7/365. В свою очередь хостинг провайдер берет на себя все обязательства по обслуживанию и сопровождению оборудования и системы виртуализации. Но соответственно цену на эту услугу несколько выше чем на виртуальный хостинг.

Примеры тарифов VDS
Примеры тарифов VDS

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

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

Что бы исправить возникшую несправедливость и обучить настройке и азам администрирования VDS и создано это руководство.

Исходные данные

Определим, что у нас есть некоторый сайт, работающий на php+MySQL под управлением некой CMS (в нашем случае это будет MODX Revolution, но на процесс настройки VDS это не влияет), а это значит, что помимо развертывания CMS необходимо установить и настроить основные модули php, nginx, mysql. Для этого определим следующую последовательность наших действий:

  1. Регистрация на хостинге и конфигурация VDS;
  2. Создание VDS из панели управления;
  3. Подключение по SSH;
  4. Обновление и установка пакетов системы;
  5. Установка nginx + php;
  6. Установка mariadb (mysql);
  7. Создание нового пользователя системы;
  8. Конфигурирование php-fpm;
  9. Конфигурация nginx;
  10. Конфигурация mysql;
  11. Создание пароля для root пользователя mysql;
  12. Создание нового пользователя и базы данных для сайта;
  13. Создание недостающих каталогов и перезапуск сервисов;
  14. Установка MODX.

Регистрация на хостинге и конфигурация VDS

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

В текстовые поля вводим свою фамилию, имя и отчество, и адрес электронной почты. В выпадающем списке меняем операционную систему на Ubuntu 20.04

Форма регистрации
Форма регистрации

Далее жмем кнопку "ЗАКАЗАТЬ" и переходим к оплате. После окончания регистрации на электрону почту придет письмо, содержащее данные для подключения к виртуальному серверу (ip адрес сервера, пароль root пользователя).

Root – это суперпользователь в системах *nix. С помощью этой учетной записи можно осуществлять административные операции над важными файлами ОС.

Создание VDS из панели управления

Если вы уже зарегистрированы на этом хостинге, то заходим панель управления, нажимаем кнопку "СОЗДАТЬ СЕРВЕР" (1), вводим имя сервера (2), выбираем операционную систему "Ubuntu 20.04" (3), указываем конфигурацию сервера (выбираем тариф) (4). Чтобы создать виртуальный сервер в верхней части окна, нажимаем на кнопку "СОЗДАТЬ СЕРВЕР".

Панель управления при создании нового сервера
Панель управления при создании нового сервера

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

Подключение по SSH

Для подключения к серверу мы будем использовать встроенный терминал macOS или, если вы работаете в операционной системе windows, то программой Putty.

SSH - (Secure Shell) - это протокол удаленного управления компьютером с операционной системой Linux. В основном ssh используется для удаленного управления серверами через терминал.

Дальнейшая руководство будет построено на примере работы из под macOS, для windows все действия аналогичны и не различаются.

Откройте окно терминала и введите следующую команду

ssh root@193.168.3.225

где ssh - означает подключиться к удаленному компьютеру по протоколу ssh, в записи "root@193.168.3.225" - обозначает имя пользователя (root), @ - разделитель, 193.168.3.225 - ip адрес удаленного компьютера (смените на полученный в письме)

Нажмите клавишу "Enter", введите пароль и нажмите еще раз "Enter". Приглашение терминала изменится и это является свидетельством подключения к серверу.

Вид терминала после успешного подключения по SSH
Вид терминала после успешного подключения по SSH

Обратите внимание!

root@343158-artprog157:~#

Такая запись называется приглашением терминала (командной строки), состоит из:

  1. root - имя подключенного пользователя;
  2. @ - разделитель;
  3. 343158-artprog157 - имя компьютера
  4. знак "#" на конце строки означает, что пользователь имеет права суперпользователя, у обычного пользователя знак "$".

Обновление и установка пакетов системы

Обновление пакетов системы является неотъемлемой частью перед установкой программного обеспечения и настройкой сервера. В Ubuntu используется пакетный менеджер APT (Advanced Package Tool, Улучшенный инструмент для работы с пакетами), который умеет работать с репозиториями, разрешать зависимости и взаимодействовать с dpkg, которая, собственно, и занимается установкой пакетов. APT всегда работает с локальным кешем списков, поэтому перед любыми действиями с пакетным менеджером следует обновить списки в кэше. Это можно сделать следующей командой

apt-get update

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

apt-get upgrade

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

Установка nginx + php

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

apt-get install {имя пакета}

Так как, необходимо установить более одного пакета, то не нужно вводить команду каждый раз для конкретного пакета. Можно все имена пакетов вписать в одну команду, отделяя их друг от друга пробелами. Выполните установку необходимых нам пакетов следующей командой:

apt-get install nginx php-common php-cli php-curl php-json php-gd php-mysql php-xml php-zip php-fpm php-mbstring php-bcmath php-pear

И так, мы выполнили установку nginx и php с библиотеками. Проверим, как установились пакеты. Для этого откройте браузер и в адресную строку впишите ip адрес виртуального сервера. У Вас должно отобразится приветственное окно nginx.

Страница приветствия nginx по-умолчанию
Страница приветствия nginx по-умолчанию

Установка mariadb (mysql)

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

apt-get install mariadb-server-10.3

На этом установке завершена, настройка будет происходить в последующих шагах.

Создание нового пользователя системы

Теперь перейдем к созданию пользователя, от имени которого мы будем в дальнейшем работать с удаленным сервером. Так же использование root пользователя, в качестве основного создает предпосылки к нарушению системы безопасности. Определим следующую логику создания пользователей: один сайт - один пользователь с соответствующими настройками nginx, php, mariadb и правами на каталоги своего сайта. Таким образом, если один сайт взломают, то другие будут защищены благодаря нашей настройки.
Создадим пользователя с именем test, который входит в группу www-data командой:

useradd -d /home/test -g www-data -m -s /bin/bash test

-d - определяет домашний каталог (в нашем случае /home/test)
-g - задает группу создаваемого пользователя (www-data)
-m - создает домашний каталог если он не существует
-s - устанавливает командную оболочку

Чтобы в дальнейшем мы могли выполнять какие-либо административные действия добавим созданного пользователя в группу sudo

usermod -a -G sudo test

Осталось задать пароль пользователю, выполним команду

passwd test

После этого необходимо ввести пароль и повторить его (при вводе пароль не отображается)

Проверим этот путем подключения к удаленному серверу под созданным пользователем, для этого повторим шаг "Подключение по SSH"

ssh test@193.168.3.225

Обратите внимание, что приглашение теперь содержит имя пользователя test и заканчивается на знак $, что это значит можно узнать выше. Продолжим настройку сервера. Переподключитесь к нему под пользователем root.

Конфигурирование php-fpm

Начнем настройку php-fpm - это программный пакет, позволяющий выполнить обработку скриптов, написанных на языке PHP.
Настройка в операционной системе Linux, в большинстве случаев, сводится к правке конфигурационных файлов. Соответсвенно, для настройки php-fpm, необходимо перейти в каталог с этими файлами. Введите команду которая сменит каталог

cd /etc/php/7.4/fpm/pool.d/

Посмотрите какие файлы есть в этом каталоге

ls -al

Как видим в этой директории есть только один файл - www.conf. Он содержит конфигурацию сайтов, которые будут запускаться на этом сервере. Теперь удалим его и создадим новый, с описанием запуска нашего сайта.

rm www.conf

Новый файл будет состоять из следующих строк

[test.site]
listen = /run/php/php-test.sock //сокет
listen.mode = 0666 //права на запуск
user = test //пользователь от имени которого будет запущен php
group = www-data //принадлежность к группе

//задание директив php
php_admin_value[upload_tmp_dir] = /home/test/tmp  //каталог для загружаемых файлов
php_admin_value[date.timezone] = Europe/Moscow //временная зона
php_admin_value[open_basedir] = /home/test  //корневой каталог сайта
php_admin_value[post_max_size] = 512M  // максимальной размер POST
php_admin_value[upload_max_filesize] = 512M //максимальный размер загружаемого файла
php_admin_value[cgi.fix_pathinfo] = 0
php_admin_value[short_open_tag] = On //использовать короткую запись php
php_admin_value[memory_limit] = 512M //лимит оперативной памяти
php_admin_value[session.gc_probability] = 1 //настройки сессий
php_admin_value[session.gc_divisor] = 100 //настройки сессий
php_admin_value[session.gc_maxlifetime] = 28800; //максимальное время жизни сессии
php_admin_value[error_log] = /home/test/logs/php_errors.log; //файл записи лога ошибок

//задание динамических параметров
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 4

Создадим файл конфигурации test.conf, с помощью встроенного редактора nano вставим строки кода приведеные выше, и сохраним файл.

nano test.conf

На этом настройка php-fpm закончена, переходим далее.

Конфигурация nginx

NGINX – это мощный веб-сервер, использующий не потоковую, управляемую событиями архитектуру, которая позволяет ему превосходить Apache. Приступим к его конфигурированию.
Перейдите в каталог веб-сервера

cd /etc/nginx/

В этой папке нас интересует два каталога, которые хранят настройки сайтов - sites-available, sites-enabled. Перейдем в первый каталог sites-available

cd sites-available/

Здесь находится файл default, который содержит установки по умолчанию. Удалите его командой

rm default

С помощью редактора nano создадим файл конфигураций 00-default. (00 в начале имени файла необходим для того, файл был первым в каталоге т.к. в своей работе nginx обращается сначала к первому файлу)

 nano 00-default.conf

Внутрь файла поместите следующий код

 server {
    listen [::]:80;
    listen      80;
    server_name "";
    return      444; # закрытие соединения без ответа
}

Данный код запрещает обращаться к сайту через ip адрес и в этом случае выводит пользователю ошибку 444.
Сохраните файл. Далее создайте второй файл конфигураций, который будет задавать правила работы с нашим сайтом

nano 01-test.sites.conf

Внутрь файла поместите следующий код, потом сохраните его

upstream backend-test {
  server unix:/run/php/php-test.sock;
}

server {
	listen [::]:80;
	listen 80;
	server_name test.site; # имя нашего сайта
	access_log /home/test/logs/nginx_access.log;
	error_log /home/test/logs/nginx_error.log;
	
	gzip on;
	# Минимальная длина ответа, при которой модуль будет жать, в байтах
	gzip_min_length 1000;
	# Разрешить сжатие для всех проксированных запросов
	gzip_proxied any;
	# MIME-типы которые необходимо жать
	gzip_types text/plain application/xml application/x-javascript text/javascript text/css text/json;
	# Запрещает сжатие ответа методом gzip для IE6 (старый вариант gzip_disable "msie6";)
	gzip_disable "MSIE [1-6]\.(?!.*SV1)";
	# Уровень gzip-компрессии
	gzip_comp_level 6;
	
	# корневой каталог сайта
	root /home/test/test.site/www;
	index index.php;
	
	# запрет для всех для при обращению к ядру MODx из браузера
	location ~ ^/core/.* {
	  deny all;
	  return 403;
	}
	# переадресация запросов на адрес index.php
	location / {
	  try_files $uri $uri/ @rewrite;
	}
	location @rewrite {
	  rewrite ^/(.*)$ /index.php?q=$1;
	}
	
	# При обращении к файлам php будет происходить запуск сокета php который мы настраивали на предыдущем шаге (Конфигурирование php-fpm)
	location ~ \.php$ {
	  try_files  $uri =404;
	  include fastcgi_params;
	  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
	  fastcgi_pass backend-test;
	}
  
	# кэширование файлов с указанными расширениями
	location ~* \.(jpg|jpeg|gif|png|css|js|woff|woff2|ttf|eot|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|tar|wav|bmp|rtf|swf|ico|flv|txt|docx|xlsx)$ {
	  try_files $uri @rewrite;
	  access_log off;
	  expires 10d;
	  break;
	}

	location ~ /\.ht {
	  deny all;
	}
}

Продолжаем настройку nginx. Перейдите в каталог sites-enabled

cd ../sites-enabled/

В этом каталоге удалите ссылку на уже не существующую конфигурацию

rm default

Создайте две ссылки на конфигурационные файлы созданные выше

ln -s ../sites-available/00-default.conf
ln -s ../sites-available/01-test.sites.conf

На этом конфигурация сервера nginx завершена. Двигаемся дальше!

Конфигурация mysql

Переходим в каталог mysql.

cd /etc/mysql/

В этом каталоге находится файл my.cnf, в котором содержатся настройки нашей системы управления базами данных. Откройте этот файл в редакторе nano и отредактируйте

nano my.conf

В конец файла вставьте следующий код, который обеспечит работу системы MODx с базой данных без ошибок

[mysqld]
sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Теперь настроим парольный доступ root пользователя к базе данных. Для этого подключимся к СУБД

mysql -u root

Подключение к базе сопровождается выводом ее приветствия (смотри изображение), после этого подключитесь к базе mysql. Обратите внимание, что при работе с базой данных каждая строка должна завершаться точкой с запятой, в случае ее отсутствия СУБД будет воспринимать следующую строку как продолжение предыдущей.

USE mysql;

Создание пароля для root пользователя mysql

Для того, чтобы, пользователь root мог подключаться с паролем, необходимо изменить значения столбца plugin с unix_socket на mysql_native_password

UPDATE user SET plugin='mysql_native_password' WHERE User='root';

Такую строку можно прочитать следующим образом:"Обнови в таблице user столбец plugin на mysql_native_password для строк где в колонке User значение root". Таким образом, мы разрешили пользователю root авторизироваться в СУБД через пароль БД. Однако сам пароль мы не задали, исправим это

ALTER USER 'root'@'localhost' IDENTIFIED BY 'testtest';

Таким образом, мы задали пароль testtest для локально подключенного пользователя root. После этого, необходимо перезагрузить привелегии пользователей командой

FLUSH PRIVILEGES;

и отключиться от СУБД

\q

Как проверить правильность выполненных действий? Нужно войти в операционную систему под пользователем test (его мы создали немного выше) и подключиться к СУБД как root. Делаем следующие шаги - подключаемся как test

su test

У вас должно измениться приглашение системы на пользователя test. Теперь настала очередь подключиться к СУБД

mysql -u root -p

В приведенной команде -u - определяет что следующим идет имя пользователя, -р - использовать нативный пароль mysql (именно тот что мы и настраивали). После отправки команды СУБД попросит ввести пароль (нами был задан пароль testtest). Если у Вас все получилось, то шаги, проделанные выше, выполнены правильно. Далее выйдите из СУБД, подключитесь к операционной системе как root, и от имени этого же пользователя подключитесь к СУБД. Переходим дальше.

Создание нового пользователя и базы данных для сайта

Создадим базу данных для сайта с именем test

CREATE DATABASE IF NOT EXIST test;

Создадим пользователя в базе данных с именем test и паролем testtest. В дальнейшем этот пользователь будет использоваться системой MODx для работы с базой данных.

CREATE USER 'test'@'localhost' IDENTIFIED BY 'testtest';

Определим для созданного пользователя права при подключении к СУБД

GRANT USAGE ON *.* TO 'test'@'localhost' IDENTIFIED BY 'testtest' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

Выдадим пользователю test все привилегии, на созданную, базу данных с правом ее передачи

GRANT ALL PRIVILEGES ON test.* TO 'test'@'localhost' WITH GRANT OPTION;

После этого необходимо перезагрузить привилегии пользователей командой

FLUSH PRIVILEGES;

Проверьте правильность выполненных шагов следующим образом: подключитесь к СУБД под пользователем test.

Создание недостающих каталогов и перезапуск сервисов

На данном этапе мы выполним следующие шаги:

  1. Подготовка каталогов, которые мы использовали в настройках;
  2. Перезапуск сервисов.

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

sudo -u test mkdir /home/test/tmp
sudo -u test mkdir /home/test/logs
sudo -u test mkdir /home/test/test.site
sudo -u test mkdir /home/test/test.site/www

В приведенных командах, как Вы заметили, операции по созданию каталогов (mkdir) выполняются с правами супер пользователя (sudo), от имени пользователя test (-u test). Это сделано с целью, чтобы пользователь test был владельцем этих каталогов и имел, по отношению к ним, полные права. После выполнения команд проверьте структуру каталога, там должны были появиться созданные нами папки.

Практически все готово к установке MODx, осталось перезапустить службы php, nginx, mysql. Это связано с тем, что настройки всех сервисов содержаться в текстовых файлах и считываются только при запуске служб. Выполните команды

sudo service php7.4-fpm restart
sudo service nginx restart
sudo service mysql restart

Так как, мы запретили подключение по ip адресу, то необходимо в локальном файле hosts указать переадресацию. Добавьте следующую строку в конец файла (Ваш ip адрес может отличаться от того, который приведен в примере)

193.168.3.225 test.site

Проверьте правильность выполненных действий. Введите в адресную строку браузера ip адрес сервера, Вам должна выдаться ошибка 444.

Если обратитесь по имени сайта, то ошибка должна следующей

Это является свидетельством, что все настроено правильно на данном этапе инструкции.

Установка MODX

Перед установкой MODx необходимо его дистрибутив поместить на наш виртуальный сервер. Для этого будем использовать текстовый загрузчик wget. Давайте установим его

apt-get install wget

На официальном сайте MODx скопируйте ссылку на дистрибутив (в моем случае она имеет вид https://modx.com/download/direct?id=modx-2.7.3-pl.zip&0=abs). Теперь с помощью программы wget сохраним его в каталоге /home/test/test.site/www/ командой

wget -P home/test/test.site/www/ https://modx.com/download/direct?id=modx-2.7.3-pl.zip&0=abs  

После скачивания проверьте, что в каталоге www присутствуют следующие файлы и папки (для разных версий MODx состав может незначительно отличаться)

Приступим к установке MODx. В адресную строку строку браузера введите

test.site/setup

Откроется окно выбора языка, оставьте русский и нажимайте "ДАЛЕЕ"

Выберите пункт "НОВАЯ УСТАНОВКА", нажмите "ДАЛЕЕ"

В этом окне установите базу данных mysql, сервер - localhost, имя пользователя - test, укажите его пароль (testtest), имя базы данных - test, кодировка подключения - utf8, сопоставление - utf8_general_ci.

Теперь придумайте логин и пароль администратора сайта

Удостоверьтесь, что в отчете об установке все компоненты установлены и работают

Нажмите войти и введите регистрационные данные администратора сайта

На этом установка MODx закончена.

Заключение

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

Мы используем куки на нашем сайте. Продолжая просмотр, вы соглашаетесь с условиями пользовательского соглашения
Пожалуйста, подождите. Процесс оформления заказа может занимать до 30 секунд.