Настройка VPS — Ubuntu 18.04

Настраиваем

Итак, у нас есть свежеустановленная на VPS система и доступ по SSH. Логинимся на сервер под рутом.

 

Русифицируем

sudo apt install language-pack-ru
sudo update-locale LANG=ru_RU.UTF-8

 

1. Создадим себе пользователя. Работать под рутом без надобности — признак дурачины.

adduser user

Где user — меняем на ваш будущий логин. Отвечаем на вопросы системы, пароль придумываем сложный, ваш логин будет основным для удаленного управления системой, рут мы в дальнейшем отключим от удаленного терминала из соображений безопасности.

 

2. Добавляем нашего созданного пользователя в группу sudo, дабы выполнять команды из-под рута:

usermod -a -G sudo user

Плюс, добавим самого себя в группу администраторов:

sudo usermod -aG adm YourUserName

 

3. Выходим из системы (logout) и логинимся под своим новым созданным пользователем на SSH. С этого момента, если нам нужно выполнить команду от имени рута, мы используем операнд sudo перед остальными операндами команды (примеры ниже).

 

4. Стоит вам только опубликовать ваш сайт-адрес сервера VPS, как всяческие хакинговые боты начнут стучаться к вам на терминальный порт 22. Поэтому, обезопасим терминал VPS, сменив порт с 22 на чтото другое. Как новый порт, вводим любое число от 1 до 65535. Нельзя использовать для этого порты 80, 443, 3306, 22, 21 и 8080. Они заняты под другие сервисы нашего VPS.

sudo nano /etc/ssh/sshd_config

Nano — консольный «блокнот». Наверняка вы уже с ним знакомы, но я напомню базовое управление: Ctrl+X — выход, Ctrl+O — сохранение, Ctrl+W — поиск, стрелки — перемещение курсора.

Ищем в открывшемся файле строку «Port 22», обычно она прямо сверху. Изменяем 22 на выбранный вами порт.

ClientAliveInterval 60
ClientAliveCountMax 5

Далее проматываем кнопкой PgDn до самого низа файла и дописываем каждую команду с новой строки:

AddressFamily inet

PermitRootLogin no

AllowUsers user

Первая команда ограничивает подключения только стандартом IPv4, отключая не нужный IPv6. Вторая запрещает логиниться в терминал под рутом. Третья запрещает вообще кому либо логиниться, кроме вас — подставляйте свой логин вместо user.

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

sudo service sshd restart

 

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

 

6. Обновим источники приложений и сами приложения:

sudo apt update && sudo apt upgrade

Соглашаемся на установку обновлений нажав Y и Enter.

 

7. Если у вас не самой последней версии система, имеет смысл обновить дистрибутив до последнего подрелиза (необязательный шаг):

sudo apt dist-upgrade

 

8. Ускоряем общую работу системы — Prelink и Preload. Prelink нужен для создания статичных адресов для библиотек, Preload — это небольшое приложение, которое следит за файлами наиболее часто используемых приложений, и предзагружает их в память, пока система простаивает.

sudo apt install prelink

sudo apt install preload

Далее, нужно включить Prelink:

sudo nano /etc/default/prelink

Откроется знакомый Nano, и там измените строку с PRELINKING=unknown на PRELINKING=yes. Не забываем сохранять перед закрытием, вы же запомнили уже, ага? Следующий шаг — добавляем в планировщик cron ежедневный запуск:

sudo /etc/cron.daily/prelink

 

9. C системными предустановками пока закончим, ставим апач:

sudo apt install apache2

Также, включим mod_rewrite. Почему-то по умолчанию в большинстве систем он отключен. Отвечает за переписывание билибердовых ссылок под красивые короткие. Критично для работы многих сайтов.

sudo a2enmod rewrite

 

10. Далее, MySQL-сервер:

sudo apt install mysql-server

Установка может спросить адрес вашего сервера, указываем localhost, если вы пока не назначили внешний домен. Также задаем главный пароль базы данных, сложный, буквы-цифры-разный регистр. Если вы еще не догадались, напоминаю — все логины-пароли нужно записать и хранить в безопасном месте.

MySQL сервер последних версий корректно настроен для работы в нашем окружении, принимает запросы только от localhost. Поэтому, не лезем в конфиг.

11. Ставим php последней версии:

sudo apt-get install php-cli php-common libapache2-mod-php php php-mysql php-fpm php-mbstring php-gd php-curl

Набор модулей тут мной определен эксперементально. Во всех источниках указаны разные, где-то нет mbstring, но он нужен для phpmyadmin, админки для MySQL. Где-то отсутствует curl и gd, но они нужны для капчи и некоторых плагинов CMS. В любом случае, дополнительные модули можно всегда доставить после.

 

12. Поднастроим Apache.  Отредактируем главный конфигурационный файл:

sudo nano /etc/apache2/apache2.conf

Уже установленные переменные не трогаем, проматываемся в конец файла. Там добавляем каждую команду с новой строки:

ServerName localhost
ServerSignature Off

Это задаст хост по умолчанию для самоопределения апача (localhost) и отключит отображение версии системы и сервера на страницах ошибок. Это небезопасно. Как всегда, сохраняем, закрываем.

 

13. Поднастроим PHP.

sudo nano /etc/php/7.2/apache2/php.ini

Многие скрипты используют короткий тэг открытия, вместо полного, поэтому включим эту опцию, заменив Off на On (отсюда и далее указываю то, как должно быть, а не как было):

short_open_tag = On

Раздвинем ограничения по памяти и загрузке файлов:

memory_limit = 128M
post_max_size = 64M

 

14. Установим phpmyadmin. Это графическая панель управления базами данных MySQL.

sudo apt install phpmyadmin

Как сбросить пароль root MySQL на Ubuntu 18.04

Все готово, перезапустим апач:

sudo service apache2 restart

 

15. После всех манипуляций, у нас будет тестовая страница апача открываться в браузере по адресу вашего сервера, а phpmyadmin будет доступен по адресу http://вашсайт/phpmyadmin . Логин туда root, пароль — указанный при установке MySQL.

 

16. Создадим старницу phpinfo для проверки работы сервера:

sudo nano /var/www/html/info.php

Вставляем такой код в Nano и сохраняем:

<?php phpinfo();

Теперь по адресу http://вашсайт/phpinfo должна открываться сервисная страница с информацией о PHP.

Если все работает и отображается, можно файл удалить:

sudo rm -f /var/www/html/info.php

Прямой доступ по известному пути — дыра в безопасности VPS.

 

17. Поставим FTP. Используем vsftpd:

sudo apt install vsftpd

Правим конфигурацию:

sudo nano /etc/vsftpd.conf

Убедитесь, что параметры в этом файле соответствуют приведенным ниже. Если параметры закомментированы знаком #, раскомментируйте его, удалив #. Если параметра нет, добавьте вручную в конец файла:

local_umask=002
anonymous_enable=No
local_enable=YES
write_enable=YES

Перезапустим фтп:

sudo service vsftpd restart

После этого, можно логиниться на сервер по FTP, используя логин и пароль от системы. C этим конфигом, у вас будет доступ ко ВСЕЙ операционной системе. Если вам нужно ограничить доступ к папкам, поищите в интернете руководства.

 

18. Резервное копирование. Альфа и Омега администрирования VPS. Бэкапы надо делать хотя бы раз в неделю. Следующий скрипт создает архив с бэкапом папок /var/www (где обычно лежат сайты), /etc, /var/log и /root. Также бэкапит все базы MySQL. Скрипт следует исполнять от имени рута из папки, в которой будут хранится бэкапы. Также, желательно внести файл скрипта в cron. Собственно, скрипт:

#!/bin/bash

USER=root #юзер базы данных
PASSWORD=password #пароль
BACKUP=/media/Backup #куда сохранять бэкапы
LOG=/var/log # директория для чистки старых логов
OLD=30 # сколько дней хранить бэкапы (более старые будет удаляться)
PREFIX=work # если несколько серверов - используйте разные префиксы, чтобы не путаться
DATE=`date '+%Y-%m-%d'`

echo "Backup database to $BACKUP"
mkdir $BACKUP/$DATE.sql
cd $BACKUP/$DATE.sql
 for i in `mysql -u $USER -p$PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`;
 do mysqldump -u $USER -p$PASSWORD $i > $DATE-$i.sql;
 done

cd ..
tar -cjf $BACKUP/$DATE-sql-$PREFIX.tar.bz2 ./$DATE.sql
rm -rf ./$DATE.sql


echo "Backup files to $BACKUP"
tar -cjf $BACKUP/$DATE-files-$PREFIX.tar.bz2 \
 /var/www/ \
 /etc/ \
 /var/log/ \
 /root/ \
 --exclude=$BACKUP

echo "Deleting old backups and logs from $BACKUP & $LOG"
find $LOG -type f \( -name "*.gz" -o -name "*.1*" \) -exec rm '{}' \;
find $BACKUP -mtime +$OLD -exec rm '{}' \;

Обратите внимание, верхние несколько строчек скрипта нужно изменить в соответствии с вашей конфигурацией MySQL.

Допустим, у нас в корне будет папка /backup и в ней будет и скрипт, и сами резервные копии. Переходим в корень файловой системы:

cd /
sudo mkdir backup
cd backup
sudo nano start.sh

И вставляем туда скрипт выше. Сохраняем, назначаем его исполняемым:

sudo chmod +x start.sh

Теперь, командой:

sudo ./start.sh

Мы запустим процесс бэкапа. Для среднего сайта на средней мощности VPS это занимает 5-10 минут. После окончания процесса, в папке /backup будут несколько архивов с резервными копиями. Как я говорил выше, лучше всего этот скрипт запихнуть в cron. Погуглите, как это сделать.

На этом основная настройка сервера закончена — мы получили полностью рабочий, современный и производительный веб-сервер на VPS. Я не затронул некоторые мелкие вопросы, связанные с настройкой доступов на веб-сервере, так как этим часто занимаются админы и на обычном виртуальном хостинге, которые как раз и перелезают со временем на VPS.

 

 

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