Введение

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

Эта статья предназначена в основном для web-мастеров, которые уже знакомы с основами web-разработки, умеют работать с FTP, панелью управления хостинга, вели разработку на локальном сервере типа WAMP или Open Server, знают, что такое права на файлы и знакомы с некоторыми другими мелочами. В тексте рассматриваются основы администрирования серверов на операционной системе Debian.

Некоторые читатели уже знают, что Debian — это дистрибутив OS Linux. Другие же, не знакомые с Linux, зададут справедливый вопрос: «Почему именно Linux, а не Windows? Ведь на базе Windows также существуют VDS, и если Windows популярнее Linux для домашних пользователей, то не проще ли будет работать с Windows?» На самом деле, всё обстоит с точностью до наоборот. Windows — это, прежде всего, графическая OS, и её графический интерфейс очень помогает в рутинной работе с файлами, папками, приложениями, но не в администрировании серверов.

Несмотря на то, что Windows имеет довольно мощные инструменты для администрирования, которые действительно широко используются в IT-индустрии, логика работы с этой ОС намного сложнее и запутаннее, чем с Linux. На Windows в основном работают с платформой .NET. Если вы не знакомы с платформой .NET, то VDS на Windows вам, скорее всего, не подойдёт: обслуживание сайтов на PHP, MySQL при такой серверной схеме может быть запутанным и сложным, а система будет работать медленно.

OS Linux имеет множество дистрибутивов, например Debian, Ubuntu, Centos, FreeBSD. Несмотря на то, что их объединяет одно общее ядро Linux, они могут существенно между собой различаться в логике администрирования. Золотым стандартом в web-индустрии является Debian, open source дистрибутив, который используется на большинстве серверов. Основное преимущество Debian — это его стабильность. Крупное сообщество этой операционной системы позволяет постоянно её развивать. Поэтому из всех дистрибутивов Linux наиболее предпочтительным выбором для обслуживания сайтов является Debian.

Приступая к установке программного обеспечения на ваш VDS, рекомендуется потратить некоторое время на изучение фундаментальных основ Linux и Debian. Их совсем немного, но их знание поможет вам избежать распространённых и неприятных ошибок, которые могут испортить всю систему, привести к состоянию невозможности её восстановления. Некоторые основы я попытаюсь раскрыть в серии моих статей на тему администрирования, однако этого будет мало — необходимо также изучить руководство к Debian. Не рекомендуется проводить манипуляции над системой одним лишь методом copy/paste, не вникая в смысл происходящего. Хорошим признаком развития будет являться ваш живой интерес к той или иной функции или команде, а также активное желание узнать о них больше.


Общие сведения. Понятие VDS. Протоколы передачи данных

VDS — это простой виртуальный контейнер, в котором установлена операционная система. Многие хостинг-провайдеры предлагают VDS уже с установленной панелью управления и программным обеспечением, однако по субъективному мнению автора такой подход является излишним, а панель управления в большинстве случаев и не нужна вовсе: на мой взгляд, она только замедляет процесс администрирования и накладывает на него определённые ограничения, которые можно обойти только вручную. Поэтому лучше сразу учиться устанавливать всё вручную. Это совсем не сложно: необходимо лишь запомнить пару десятков команд и разобраться в основах Linux. В дальнейшем вам будет проще работать с системой, когда вы поймёте, что с чем связано. Поэтому в статье рассматриваются способы установки основных компонентов на чистую операционную систему без предустановленных пакетов. Если вам всё же нужна панель управления, то вам следует учесть, что для стабильной работы всей системы, панель управления обязательно должна устанавливаться на «чистую» систему.

После того как вы приобрели VDS у хостинг-провайдера, у вас имеется только IP адрес вашего сервера и пароль ROOT пользователя, — больше ничего. Наверное, вы пребываете в растерянности и не понимаете, какую дверь можно открыть этими двумя ключами, чтобы попасть на сервер. Существует основной протокол передачи данных, который называется SSH, а также его разновидность — SFTP. С помощью SSH интерфейса вы можете подключиться к серверу при помощи SSH клиента и вводить команды в командной строке.

Самым популярным клинетом SSH является бесплатная программа PuTTY. Загрузите её с официального сайта. PuTTY состоит всего из одного файла .exe (для Windows версии). Откройте её, создайте новую сессию, введите IP адрес вашего сервера, затем сохраните сессию и нажмите open. Когда система запросит логин — введите root, затем введите ваш пароль, не обращая внимания на то, что на экране нет индикатора ввода пароля (так устроен Linux, это политика безопасности) — вот и всё, вы в системе. Теперь вы можете вводить команды.

Для того, чтобы манипулировать файлами при помощи файлового менеджера необходимо установить SFTP клиент. SFTP протокол — это не привычный всем FTP, а совсем другая технология, предоставляющая гораздо больше возможностей по сравнению с FTP, к тому же SFTP безопаснее, так как вся информация шифруется и не может быть перехвачена злоумышленником при MITM атаке. Если вы используете SFTP, интерфейс FTP вам может и не потребоваться вовсе, хотя FTP может быть уобен в некоторых случаях, и его тоже можно настроить для работы по безопасному протоколу, но это тема для отдельной статьи.

Доступ по SFTP возможен при помощи таких файловых менеджеров, как FileZilla или Total Commander. FileZilla имеет поддержку SFTP «из коробки» — просто создайте новое соединение по такому же принципу, как в SSH клиенте, откройте сессию, после чего вы сразу попадёте на ваш сервер. Автору больше нравится файловый менеджер Total Commander. На мой взгляд, он более удобен. Если вам ближе FileZilla, то можете использовать его сразу. Однако если вы привыкли работать с Total Commander, то для его использования по протоколу SFTP сначала необходимо установить специальный плагин.


Выбор серверной схемы

Итак, вы соединились с сервером через SSH и наблюдаете командную строку в терминале, зашли на сервер при помощи SFTP клиента и видите каталоги операционной системы. Если вы до этого момента ни разу не работали с Linux, то можете поначалу растеряться, потому что в отличие от Windows, в Linux нет привычных логических разделов, или дисков, а структура файловой системы начинается с единого «корня». Поэтому суперпользователь в Linux называется пользователем root (англ. корень) — он имеет полный доступ ко всем файлам и каталогам файловой системы начиная с её «корня», и вы зашли на сервер именно под этим пользователем. Пока мы настраиваем систему, можно действовать от пользователя root, но в дальнейшем, в целях безопасности, этого делать не рекомендуется – лучше создать другого пользователя и дать ему sudo привелегии (права суперадминистратора), а пользователя root заблокировать вовсе.

Теперь мы можем приступить к установке минимального набора программ для web:

  • HTTP сервер Nginx
  • Cервер MariaDB (MySQL)
  • PHP-7 с интерфейсом FPM
  • Web-приложение phpMyAdmin

«Почему именно такой набор и нет Apache?» — спросят некоторые читатели. «И что делать без .htaccess?» Ответ: рассматриваемая серверная схема позволяет достигнуть высокой производительности и максимальной простоты в обслуживании. На сегодняшний день Apache испытывает со стороны web-специалистов серьёзную критику по вопросам производительности. Поэтому предпочтительным выбором будет Nginx в связке с PHP-интерпретатором через интерфейс FPM. Для специфических задач можно использовать другие компоненты и добавить их по мере необходимости, например, тот же Apache можно использовать вместе с Nginx по схеме обратного проксирования.

Установка приложений в OS Linux осуществляется двумя способами: первый способ — это их загрузка из официальных и неофициальных репозиториев, второй — ручная установка после компиляции из исходного кода. Установка из репозиториев не требует компиляции — вы загружаете уже готовые приложения, а установщик автоматически распаковывает файлы в нужные директории. Компиляция приложений из исходного кода может потребоваться для специфических целей. Предпочтителен именно способ установки из репозиториев, потому что таким образом проще поддерживать систему и обновлять приложения.


Установка и обновление базовых пакетов для Debian

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

apt-get update
apt-get upgrade

Первая команда обновляет кэш репозиториев — её нужно использовать всегда перед тем, как вы захотите что-либо установить (один раз в рабочий сеанс будет достаточно, если вы не добавляли новые репозитории в базу), делается это для того, чтобы система получила информацию о доступных новых версиях ПО. Вторая команда проверяет новые версии и автоматически обновляет приложения. Попробуйте ввести эти команды в терминале (командной строке программы PuTTY). Команда посылается на сервер после нажатия клавиши enter. Система укажет вам, какие приложения будут обновлены и запросит подтверждение. После вашего подтверждения требующие обновлений приложения будут обновлены. Для полноценной работы сервера потребуются два служебных пакета, которые не входят в стандартную комплектацию операционной системы: python-software-properties и software-properties-common. Установка приложений из репозиториев осуществляется при помощи команды apt-get install:

apt-get install python-software-properties
apt-get install software-properties-common

При работе с клиентом PuTTY вам необходимо знать об основных полезных командах: ctrl + c — остановить текущее выполнение программы и вернуться к исходному состоянию (выйти из программы, не выходя из терминала). Для того чтобы скопировать что-то из терминала в буфер обмена, просто выделите мышью нужный фрагмент. Для того чтобы вставить текст в командную строку из буфера обмена вашего рабочего компьютера используйте сочетание клавиш shift + insert. Вставка фрагмента в командную строку также возможна при помощи нажатия правой кнопки мыши, но при работе с важными данными, например с паролями, лучше не использовать этот способ, так как вы можете случайно вставить фрагмент дважды.


Установка приложений из репозиториев

Существуют официальные репозитории Debian, официальные репозитории разработчиков отдельных программ и неофициальные репозитории, поддерживаемые сообществом. Недостатком официальных репозиториев является их редкая обновляемость, поэтому если вам требуются свежие версии программ, то вам необходимо загружать их либо из неофициальных репозиториев, либо из репозиториев разработчиков этих программ (при наличии). Не всем неофициальным репозиториям можно доверять, выбирайте только надёжные источники. Попробуем проверить доступную версию Nginx в официальных репозиториях. Для этого введите следующую команду:

apt-cache policy nginx

Можно видеть, что версия, лежащая в официальных репозиториях Debian, далеко не свежая. Поэтому необходимо добавить репозитории Nginx в базу репозиториев вашего сервера. Перейдите на официальный сайт Nginx и добавьте репозитории для вашего дистрибутива Linux. Лист репозиториев находится в файле /etc/apt/sources.list. Репозитории подразделяются на репозитории бинарных пакетов deb и репозитории исходного кода deb-src. Вы можете добавить в этот файл нужные репозитории:

deb http://nginx.org/packages/debian/ codename nginx
deb-src http://nginx.org/packages/debian/ codename nginx

Где codename – кодовое название версии Debian. Если вы используете восьмую версию, то кодовое слово для неё – jessie. Также можно добавить репозитории непосредственно из командной строки, выполнив команду apt-add-repository. Обратите внимание на флаг -s, который автоматически добавляет репозиторий с исходным кодом. То есть репозиторий исходного кода deb-src в этом случае не указывается:

apt-add-repository -s 'deb http://nginx.org/packages/debian/ codename nginx'

Для новых репозиториев требуется установить PGP ключ, который будет верифицировать их подлинность, — без него репозитории не будут активны. Ключ можно загрузить из официальных источников. Перейдите на сайт Nginx и скопируйте ссылку на PGP ключ (для ленивых: http://nginx.org/keys/nginx_signing.key). Чтобы импортировать ключ, сначала нужно загрузить его на сервер. С этого момента становится интересно: вы узнаете о команде wget, с помощью которой можно загружать файлы на сервер. Скачивать ключ лучше в папку временных файлов, которая очищается при каждой загрузке системы. Эта папка находится в корневом каталоге и имеет путь /tmp. Перейдите в эту папку, выполнив в терминале команду cd /tmp. После этого загрузите в неё ключ с сайта Nginx:

cd /tmp
wget http://nginx.org/keys/nginx_signing.key

Перейдите в каталог /tmp с помощью клиента SFTP и убедитесь, что файл загружен (этот шаг можно пропустить), после чего импортируйте ключ с помощью команды apt-key add:

apt-key add nginx_signing.key

Обратите внимание, что в команде используется относительный путь nginx_signing.key, так как вы находитесь в этом же каталоге. Если же вы находитесь в другом каталоге, то можно указать абсолютный путь:

apt-key add /tmp/nginx_signing.key

Далее обновите кэш репозиториев:

apt-get update

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

apt-get policy nginx

Версия актуальная, поэтому установим Nginx:

apt-get install nginx

Конфигурационные файлы Nginx вы можете найти в каталоге /etc/nginx. Каталог /etc – это каталог конфигурации приложений. Теперь установим PHP. Нас интересует свежая версия. Её никогда нет в официальных репозиториях, однако благодаря большому сообществу Debian, свежие версии популярных программ, как правило, всегда можно найти в неофициальных репозиториях. Добавьте в базу ваших репозиториев доверенные неофициальные репозитории Debian:

apt-add-repository -s 'deb http://packages.dotdeb.org codename all'

Затем загрузите и установите GPG ключ:

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Обновите кэш репозиториев:

apt-get update

Установите PHP 7 с интерфейсом FPM:

apt-get install php7.0-fpm

Обратите внимание, что система предложит вам установить дополнительные пакеты – соглашайтесь: эти пакеты называются зависимостями, которые необходимы для работы устанавливаемого приложения. Кроме зависимостей также установятся рекомендуемые пакеты. Если вы не хотите устанавливать рекомендуемые пакеты, добавьте к команде флаг --no-install-recommends. В нашем случае ничего лишнего не установится, поэтому можете не использовать данный флаг. Однако при установке, например, следующим способом:

apt-get install php7.0

Система предложит установить также Apache и все возможные интерфейсы PHP как зависимости. В связи с тем, что в статье рассматривается установка и использование высокопроизводительной серверной связки Nginx + php7.0-fpm, Apache на данном этапе устанавливать не рекомендуется. Если в будущем вам всё же понадобится Apache, то его можно будет установить отдельно в любой момент, как и любой другой интерфейс PHP.

После установки PHP можно приступить к созданию первого хоста, который будет выводить тестовую фразу Hello Universe!. Для этих целей создадим каталог, в котором будет находиться индексный файл. Проверьте, существует ли на вашем сервере каталог /var/www, если нет, то давайте его создадим при помощи команды mkdir:

mkdir /var/www

Затем создадим директорию localhost:

mkdir /var/www/localhost

Далее создадим индексный файл с помощью команды touch и поместим его в директорию localhost:

touch /var/www/localhost/index.html

Запишем в созданный файл тестовую фразу с помощью команды echo

echo "Hello Universe!" > /var/www/localhost/index.html

Можете открыть файл /var/www/localhost/index.html при помощи SFTP, чтобы проконтролировать результат.


Настройка Nginx, создание тестового хоста

Чтобы протестировать работоспособность сервера, необходимо придумать какой-нибудь хост и зарегистрировать его в файле hosts. Windows-пользователи могут найти этот файл по адресу C:\Windows\System32\drivers\etc\hosts. Необходимо открыть этот файл от имени администратора с помощью текстового редактора, затем добавить в его конец запись, в которой будет содержаться имя хоста и IP адрес, с которым она будет ассоциирована, то есть IP адрес вашего сервера:

11.222.333.44        server.dev
11.222.333.44        www.server.dev

Где server.dev — имя нашего тестового хоста, www.server.dev — его псевдоним, 11.222.333.44 — пример IP адреса, который необходимо заменить на IP адрес вашего сервера. После добавления записи и сохранения файла, при переходе в браузере по адресу http://server.dev вы попадёте на ваш сервер. Разумеется, это применимо только к вашему рабочему компьютеру. Никто из интернета на ваш сервер зайти пока не может. Чтобы сервер был доступен для интернет-аудитории, для него нужно делегировать настоящий домен. Однако в этом нет ничего сложного, домены делегируются по такому же принципу: пользователи направляются на IP адрес сервера по A-записи, прописанной в биллинге — в личном кабинете, который предоставляется регистратором доменных имён.

Для того, чтобы вывести наш тестовый файл, необходимо сконфигурировать HTTP сервер Nginx. Конфигурационные файлы, как уже было отмечено выше, можно найти в каталоге /etc/nginx. В этом каталоге можно найти файл основной конфигурации nginx.conf. В изначальном варианте этот файл имеет следующее содержимое (комментарии опущены):

user                        nginx;
worker_processes            1;

error_log                   /var/log/nginx/error.log warn;
pid                         /var/run/nginx.pid;

events {
    worker_connections      1024;
}

http {
    include                 /etc/nginx/mime.types;
    default_type            application/octet-stream;
	
    log_format     main     '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';

    access_log              /var/log/nginx/access.log  main;
    sendfile                on;
    keepalive_timeout       65;
    include                 /etc/nginx/conf.d/*.conf;
}

Конфигурация по умолчанию вполне пригодна для использования, однако чтобы сервер заработал для web, в его настройки всё же необходимо внести некоторые изменения (выделено красным):

user                        www-data;
worker_processes            1;

error_log                   /var/log/nginx/error.log warn;
pid                         /var/run/nginx.pid;

events {
    worker_connections      1024;
}

http {
    include                 /etc/nginx/mime.types;
    default_type            application/octet-stream;
    
    client_max_body_size    100m;
    charset                 utf-8;
    index                   index.php index.html index.htm;
	
    log_format     main     '$remote_addr - $remote_user [$time_local] "$request" '
                            '$status $body_bytes_sent "$http_referer" '
                            '"$http_user_agent" "$http_x_forwarded_for"';

    access_log              /var/log/nginx/access.log  main;
    sendfile                on;
    keepalive_timeout       65;
    include                 /etc/nginx/conf.d/*.conf;
}

Мы изменили пользователя, от которого запускается сервер, максимальный размер тела запроса, кодировку и индекс. Самое важное из изменений — последнее. Индекс — это файл, который будет открыт при корневых запросах или запросах к директориям, например http://site.com/, http://site.com/contents. Директива index может иметь несколько значений. При отсутствии первого индексного файла сервер проверит существование второго и откроет его, если он существует. Если файла с таким именем нет в каталоге, то сервер попытается открыть третий и т.д. При отсутствии индекса директория будет раскрыта в листинге, в котором будет находится список вложенных файлов. Так как мы создали файл index.html, то он и будет открыт при переходе в корневой каталог хоста http://server.dev.

Обратите внимание на последнюю строку главного конфигурационного файла include /etc/nginx/conf.d/*.conf; — эта директива подключает к конфигурации все файлы, находящиеся в каталоге conf.d, то есть объявленные хосты. После инсталляции в этом каталоге присутствует всего один файл default.conf — в нём находятся параметры конфигурации хоста по умолчанию. Общепринятой практикой считается создание для каждого хоста отдельного файла *.conf, однако в режиме тестирования можно обойтись без создания дополнительных файлов. По сути, конфигурация хостов — это продолжение главной конфигурации. Для подключения тестового хоста server.dev необходимо привести файл /etc/nginx/conf.d/default.conf к следующему виду:

server {
    listen        80;
    server_name   _;
    return        403;
}

server {
    listen        80;
    server_name   server.dev www.server.dev;
    root          /var/www/localhost;
}

Вы видите два серверных блока. Главные параметры, определяющие хосты, — это порт и имя хоста. Порт задаётся директивой listen. Nginx устроен так, что тот блок, в котором порт встречается в первый раз (то есть верхний) является блоком по умолчанию. Nginx отрабатывает его в том случае, если в конфигурации больше нет дальнейших совпадений хостов для этого порта. То есть независимо от того, какой домен будет подан на обработку, например aaa.bbb.ccc.ddd.server.dev, если он подан на 80-ый порт, то он будет отрабатываться в блоке по умолчанию. Обычно такой блок выключают из конфигурации — при попадании в него возвращается ошибка 403 с помощью директивы return

Второй серверный блок — это блок нашего тестового хоста. В нём так же задан 80-ый порт, используемый браузером для протокола http://, однако в отличие от серверного блока по умолчанию нижний блок идентифицируется именем сервера и его алиасом при помощи директивы server_name. Алиасов может быть сколько угодно (они могут также отсутствовать). Алиасы обычно разделяются пробелами. Третья важная директива — root, она определяет путь файловой системы до корневого каталога хоста. После изменения конфигурации сервера для вступления изменений в силу требуется его перезагрузка. На Debian перезагрузка процессов устроена хитро. Есть 2 основных команды:

service nginx restart
/etc/init.d/nginx restart

Первая команда просто пытается перезагрузить сервер и не выводит никакого результата в случае успеха или неуспеха, вторая команда выводит положительный результат в случае успеха и уведомление об ошибке, если что-то пошло не так. Вторая команда — это путь до загрузчика процесса, ей мы вызываем загрузчик напрямую. Существуют также и другие важные команды, о которых необходимо знать: о назначении первых двух вы можете догадаться исходя из их названий, последняя команда показывает статус процесса (он может быть активным или неактивным):

/etc/init.d/nginx stop
/etc/init.d/nginx start
/etc/init.d/nginx status

После перезагрузки сервера перейдите на тестовый хост http://server.dev — браузер должен отобразить проверочную фразу Hello Universe!. Если вы её видите, значит всё получилось, и можно приступить к подключению PHP интерпретатора.

Создадим индексный файл index.php и поместим его в корневой каталог нашего сервера. Новый файл будет иметь более высокий приоритет, так как в главной конфигурации мы определили его на первое место, и при конкуренции между индексными файлами index.html и index.php, находящимися в одном каталоге, сервер выведет index.php. Для создания нового файла мы воспользуемся более продвинутой командой printf, которая в отличие от echo позволяет записывать в файлы специальные символы, например переносы строк:

touch /var/www/localhost/index.php
printf "<?php \n echo phpinfo(); \n ?>" > /var/www/localhost/index.php

Теперь перейдите на тестовый хост. Обратите внимание на то, что браузер ничего не отображает, при этом файл index.php вывелся на загрузку. Если вы его откроете, то увидите содержимое, которое мы в него записали. Зафиксируйте для себя этот очень важный ньюанс безопасности: при неправильной конфигурации сервера PHP файлы не исполняются, а просто выводятся браузером на скачивание как есть. Таким образом можно легко получить конфиденциальную информацию, например пароли. Учитывайте этот момент в будущем. А чтобы интерпретатор заработал, необходимо указать серверу, чтобы все запросы к файлам PHP он передавал на исполнение интерпретатору. Добавьте к конфигурации тестового сервера блок локации, который по регулярному выражению будет обслуживать файлы PHP (выделено):

server {
    listen       80;
    server_name  _;
    return 403;
}

server {
    listen 80;
    server_name server.dev;
    root /var/www/localhost;
    location ~ \.php($|/) {
	
        # Важный ньюанс безопасности. Nginx не должен обрабатывать запросы к несуществующим файлам PHP. 
        # Это критическая уязвимость, которую обязательно необходимо устранить. Другой вариант решения 
        # этой проблемы — установка параметра cgi.fix_pathinfo в значение 0 в php.ini, однако изменение 
        # параметра cgi.fix_pathinfo может привести к неработоспособности сайтов при определённой конфигурации.
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
		
        # определение и установка переменных сервера
        fastcgi_split_path_info          ^(.+?\.php)(/.*)$;
        fastcgi_param                    PATH_INFO            $fastcgi_path_info;
        fastcgi_param                    SCRIPT_FILENAME      $document_root$fastcgi_script_name;
		
        # определение и установка переменных сервера объявленных в файле /etc/nginx/fastcgi_params
        include                          fastcgi_params;
        
        # связь с FastCGI сервером PHP-FPM через UNIX-сокет
        fastcgi_pass                     unix:/var/run/php/php7.0-fpm.sock;
		
        # перехват и логирование ошибок php-fpm
        fastcgi_intercept_errors         on;
		
    }
}

Настройки PHP-FPM по умолчанию, как правило, выставлены правильно. Откройте файл /etc/php/7.0/fpm/pool.d/www и проследите, чтобы следующие параметры были установлены корректно:

user = www-data
group = www-data
listen = /var/run/php/php7.0-fpm.sock
listen.owner = www-data
listen.group = www-data

После изменения конфигурации перезагрузите Nginx:

/etc/init.d/nginx restart

Если вы изменили конфигурацию PHP, то перезагрузите также и PHP:

/etc/init.d/php7.0-fpm restart

Перейдите на тестовый хост. Если всё прошло успешно, то сервер должен вывести исполненный индексный файл index.php.


Установка SQL сервера MariaDB и web-приложения phpMyAdmin

Сервер MariaDB — это улучшенный сервер MySQL. И тот и другой серверы были созданы одной командой разработчиков. Сервер MySQL был назван в честь Маи, старшей дочери ведущего разработчика Майкла Видениуса, а сервер MariaDB был назван в честь Марии, его младшей дочери. Как правило, в стандартных репозиториях присутствуют относительно свежии версии этого сервера, поэтому его установку можно произвести из стандартных репозиториев:

apt-get install mariadb-server

В процессе установки система попросит вас установить и подтвердить пароль для пользователя root — устанавливайте сложный пароль, содержащий не менее 12 символов. Для этих целей можно воспользоваться online-генератором сложных паролей, например этим. Ваш пароль от root пользователя сервера SQL не должен быть простым: рекомендуется, чтобы в нём присутствовали буквенные символы в разном регистре, цифровые символы, а также специальные символы. Ваш сервер будет не первым и не последним, если его взломают простым перебором паролей, при отсутствии вашего должного внимания к составлению сложного пароля. Абсолютно то же самое касается и пароля root пользователя вашей операционной системы.

В отличие от SQL сервера, версия phpMyAdmin в стандартных репозиториях, как правило, не актуальная. В связи с тем, что очень важно вовремя обновлять это приложение по причинам, связанным с устранением уязвимостей безопасности, лучше устанавливать последнюю актуальную версию. PhpMyAdmin — это web-приложение на PHP, которое, в отличие от скомпилированных программ, не требует никакой конфигурации со стороны операционной системы — его просто необходимо поместить в каталог и предоставить web-серверу доступ к этому каталогу. Загрузите последнюю версию phpMyAdmin с официального сайта. Архив с приложением рекомендуется загружать в формате tar.gz, так как этот формат широко используется в Linux:

cd /tmp
wget https://files.phpmyadmin.net/phpMyAdmin/версия/phpMyAdmin-версия-all-languages.tar.gz -O phpMyAdmin.tar.gz

Обратите внимание, что при помощи флага -O мы сохраним загруженный архив под другим именем, т.е. под именем phpMyAdmin.tar.gz. Не забудьте, что имена файлов в Linux чувствительны к регистру. После загрузки архива распакуйте его во временную папку /tmp, в которую вы ранее перешли:

tar xpzf phpMyAdmin.tar.gz

В дальнейшем вы освоете более продвинутые методы архиватора tar, которые позволят вам с лёгкостью распаковывать архивы в нужные директории одной командой. Пока же мы просто познакомимся с этим архиватором и выполним текущую задачу пошагово. Ключи xpfz говорят о следующем:

  • x (extract, извлеки)
  • p (preserve, сохрани привелегии, или права доступа на файлы)
  • z (разархивируй GZIP)
  • f (создай директорию с файлами на диске)
  • phpMyAdmin.tar.gz — относительный путь к архиву, который необходимо распаковать.

Если вы хотите наблюдать статус выполнения команды во время работы архиватора, вы можете также добавить следующие ключи: v (verbouse) — подробно, vv — очень подробно, например:

tar xvvpzf phpMyAdmin

Зайдите в папку /tmp при помощи SFPT клиента и посмотрите структуру извлечённого каталога. Основные файлы могут находиться непосредственно в верхнем каталоге, либо они могут находиться в промежуточном каталоге. Необходимо переместить каталог (промежуточный) в каталог назначения: туда, где и будет находиться приложение phpMyAdmin. Сделать это можно при помощи команды mv (move):

mv phpMyAdmin/phpMyAdmin-версия-all-languages /usr/share/phpmyadmin

Перейдите в каталог /usr/share/phpmyadmin и посмотрите результат. Однако на этом установка phpMyAdmin ещё не закончена. Для работы этого приложения требуется создать конфигурационный файл /usr/share/phpmyadmin/config.inc.php. В стандартную комплектацию phpMyAdmin уже вложен образец конфигурационного файла /usr/share/phpmyadmin/config.sample.inc.php. Можно скопировать образец конфигурационного файла с помощью команды cp (copy):

cd /usr/share/phpmyadmin
cp confing.sample.inc.php config.inc.php

Первая команда перемещает вас в директорию /usr/share/phpmyadmin, вторая команда копирует файл, она оперирует в данном случае относительными путями, однако вы смело можете использовать пути абсолютные, если имеете в этом необходимость. Так как оба файла находятся в текущем каталоге, в указании абсолютных путей нет необходимости. После копирования не забудьте снова перейти в каталог временных файлов. Давайте его очистим с целью обучения при помощи команды rm (remove, удалить):

cd /tmp
rm -R *

Также можно применить метод удаления без перехода в каталог:

rm -R /tmp/*

В первом случае удаляются все файлы, находящиеся в текущем каталоге (!): используется относительный путь. Во втором случае удаляются все файлы, находящиеся в заданном каталоге: используется абсолютный путь. Символ «звёздочка» (*) означает любые символы в любом порядке и количестве (в том числе и их отсутствие). Обратите внимание на флаг -R, который задаёт рекурсивность — максимально возможную глубину удаляемых каталогов. Если вам необходимо не только удалить содержимое каталога, но и сам каталог, то в этом случае используется абсолютный путь без указания слэша (/) на конце:

rm -R /directory

Вернёмся к phpMyAdmin. После копирования конфигурационного файла откройте его и укажите значение параметра $cfg['blowfish_secret'] — это секретное слово для авторизации по cookie. С помощью него вы сможете принудительно разлогинить пользователей phpMyAdmin (если измените значение этого параметра). Задайте произвольный набор символов в качестве значения, для этой цели можно воспользоваться md5-генератором:

// Md5-хэш фразы "hello world!"
// Не используйте значение из этого примера
$cfg['blowfish_secret'] = 'fc3ff98e8c6a0d3087d515c0473f8677';

Можете также увеличить количество таблиц, отображаемых в сайдбаре, определив параметр $cfg['MaxNavigationItems'] целым положительным числом типа Integer. Если этого параметра нет в конфигурации, добавьте его в любое место:

$cfg['MaxNavigationItems'] = 500;

Установите MySQL/MySQLi расширение для PHP:

apt-get install php7.0-mysql

Наконец, создайте символическую ссылку на каталог, где установлен phpMyAdmin и поместите её в корневой каталог тестового хоста server.dev:

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

Расшифровка:

  • ln (link) — создай ссылку
  • -s (symbolic) — символическую
  • /usr/share/phpmyadmin (откуда) — источник
  • /var/www/localhost/phpmyadmin (куда) — имя ссылки

Символическая ссылка в Linux — это что-то вроде ярлыка в Windows, при переходе по символической ссылке ОС будет открывать файл или каталог, на которые данная ссылка установлена. Откройте SFTP клиентом корневой каталог сервера и посмотрите результат, попробуйте перейти по этой ссылке. Если попадаете туда, куда нужно, то всё прошло успешно, а это значит, что web-приложение phpMyAdmin будет открываться по адресу http://server.dev/phpmyadmin.

Последнее, что необходимо сделать для работы phpMyAdmin — смена владельца файлов. Если вы ещё не знаете систему привелегий в Linux, то вам обязательно следует ознакомиться с такими понятиями, как права на файлы, владельцы файлов, пользователи и группы пользователей. В связи с тем, что каталог /usr/share/phpmyadmin со всем его содержимым был создан от имени пользователя root, владельцем этих файлов является пользователь root. Вам необходимо разрешить серверу запись в каталоге, где установлен phpMyAdmin. Для этого можно назначить владельцем файлов пользователя, от имени которого исполняются файлы PHP. В нашем случае имя этого пользователя — www-data. Делается это с помощью команды chown (change owner, смени владельца). Таким образом рекурсивно -R сменится владелец файлов внутри каталога /usr/share/phpmyadmin включая сам каталог:

chown www-data:www-data -R /usr/share/phpmyadmin

Откройте phpMyAdmin и авторизуйтесь под root пользователем сервера SQL.


Установка сайта на web-хост на примере Joomla!

Создайте пользователя сервера MySQL и базу данных для сайта. Никогда не указывайте пользователя root в конфигурации БД ваших сайтов! В целях безопасности на каждый отдельный сайт необходимо создать отдельного пользователя, который будет иметь доступ только к базе данных этого сайта. Права доступа пользователей различных сайтов не должны пересекаться. Не давайте пользователям БД глобальные привелегии — разрешайте только работу с базой данных отдельного сайта. Для создания базы данных и пользователя выполните в phpMyAdmin следующие действия:

  1. Перейдите во вкладку «Учётные записи пользователей» с помощью верхнего меню навигации.
  2. Нажмите на ссылку «Добавить учетную запись пользователя».
  3. Придумайте имя пользователя БД, введите его в соответствующем поле.
  4. В качестве имени хоста для повышения степени безопасности выберите «Локальный».
  5. Сгенерируйте сложный пароль.
  6. Перепишите имя пользователя и новый пароль.
  7. Отметьте галочкой «Создать базу данных с таким же именем и предоставить на неё все привилегии».
  8. Нажмите на кнопку «Вперёд» в правом нижнем углу.

Создайте пользователя операционной системы с помощью консольной команды adduser. Для этого пользователя будет также создан домашний каталог, находящийся в директории /home. В каталоге нового пользователя и должны размещаться файлы web-сайтов. Права на все файлы в домашнем каталоге пользователя должны принадлежать данному пользователю. Флаг --ingroup определяет группу по умолчанию, в которую входит этот пользователь. Если группа не задана, то будет создана новая группа, и её имя будет совпадать с именем пользователя. При создании нового пользователя необходимо будет определить для него пароль и ответить на необязательные вопросы, которые можно пропустить, если ввести пустые значения.

adduser fil --ingroup www-data

Создайте новый пул PHP для пользователя fil. Для этого скопируйте пул по умолчанию, а потом внесите в него изменения:

cd /etc/php/7.0/fpm/pool.d
cp www.conf fil.conf

/etc/php/7.0/fpm/pool.d/fil.conf:

; pool name ('www' here)
[fil]

user = fil
group = www-data
listen = /run/php/php7.0-fpm-fil.sock
listen.owner = www-data
listen.group = www-data

Создайте общий каталог для web-сайтов, а также каталог нового сайта (одной командой можно создать несколько директорий):

mkdir /home/fil/www /home/fil/www/joomla

Создайте новый хост в конфигурационном файле Nginx /etc/nginx/conf.d/default.conf (при желании можно создать новый файл в этом же каталоге). Скопируйте уже имеющийся серверный блок тестового хоста и внесите в него изменения (выделено красным):

server {
    listen 80;
    server_name joomla.dev;
    root /home/fil/www/joomla;

    # ЧПУ-перенаправление для CMS
    location / {
        try_files $uri $uri/ index.php?$args;
    }
	
    location ~ \.php($|/) {
        if (!-f $document_root$fastcgi_script_name) {
            return 404;
        }
        fastcgi_split_path_info          ^(.+?\.php)(/.*)$;
        fastcgi_param                    PATH_INFO            $fastcgi_path_info;
        fastcgi_param                    SCRIPT_FILENAME      $document_root$fastcgi_script_name;
        include                          fastcgi_params;
        fastcgi_pass                     unix:/var/run/php/php7.0-fpm-fil.sock;
        fastcgi_intercept_errors         on;
    }
}

Директива try_files проверяет существование запрошенного файла — если его не существует, сервер проверяет существование запрошенной директории, если её не существует, сервер делает внутреннее перенаправление на индексный файл index.php. Корневая локация по умолчанию / соответствует любому файлу. Сервер направляет в локацию по умолчанию в том случае, если не было совпадений с указанными ниже локациями по регулярным выражениям, а также если не было точных совпадений.

Создайте запись для нового хоста в файле C:\Windows\System32\drivers\etc\hosts:

11.222.333.44        joomla.dev
11.222.333.44        www.joomla.dev

Для работы сайта могут понадобиться дополнительные расширения PHP. Установите их:

apt-get install php7.0-curl php7.0-bz2 php7.0-mcrypt php7.0-gd

Перезагрузите Nginx и PHP, чтобы изменения вступили в силу:

/etc/init.d/nginx restart
/etc/init.d/php7.0-fpm restart

Загрузите архив последней версии Joomla! CMS в папку временных файлов из официального репозитория GitHub

cd /tmp
wget https://github.com/joomla/joomla-cms/releases/download/3.5.1/Joomla_3.5.1-Stable-Full_Package.tar.gz -O joomla.tar.gz

Распакуйте архив в директорию домашнего каталога нового пользователя. Обратите внимание на флаг -C (change), который меняет каталог назначения:

tar xpzf joomla.gar.gz -C /home/fil/www/joomla

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

chown fil:www-data -R /home/fil

Установите Joomla! В настройках БД укажите имя пользователя и пароль созданного вами ранее пользователя MySQL. На этом всё: сервер готов к использованию. Вам следует учитывать, что в настоящий момент единственной защитой от взлома сервера являются пароли. Поэтому пароли должны быть сложными. Существует ряд необходимых требований, связанных с безопасностью, которые настоятельно рекомендуется выполнить: установка и настройка брандмауэра (файрвола), введение базовой авторизации для открытых точек доступа, защита от перебора паролей, настройка политики безопасности приложений. Эти темы я попытаюсь раскрыть в следующей статье. А пока сделайте полную резервную копию Вашей ОС с помощью архиватора tar. Главное — это вовремя сохраниться:

tar cpzf /backup.tar.gz --exclude=/media --exclude=/proc --exclude=/lost+found --exclude=/backup.tar.gz --exclude=/mnt --exclude=/sys /

Дождитесь завершения выполнения процесса архивирования. После чего загрузите резервную копию /backup.tar.gz на ваш локальный компьютер (архив на сервере можете удалить — он занимает место на диске). Впоследствии вы можете восстановить резервную копию на свежеустановленной операционной системе Debian таким образом:

tar xpfz /backup.tar.gz -C /

Желаю приятной работы!