Linux, Nginx, PHP и MySQL — поднимаем хост за 10 минут

Собрал свои разбросанные записки в два скрипта, с помощью которых за 10 минут из «чистой» системы Centos7 получается готовый к дальнейшему использованию хост. Под готовым в первом приближении я понимаю следующее:

  1. Все обновлено
  2. Вход только по сертификатам
  3. Закрыт удаленный вход рутом, сделан другой пользователь с правами sudo
  4. Поставлен файрвол с пропуском http и https
  5. Установлен и работает ntp
  6. Поставлены и работают:
    1. Nginx
    2. PHP-fpm
    3. MySQL, а точнее — Percona, что в общем то же самое

Собственно, первый скрипт делает пункты с 1 по 5 и загружает второй, который устанавливает nginx, php-fpm и mysql. Такое разделение продиктовано тем соображением, что пункты с 1 по 5 по уму нужно делать на любом сервере, даже если там будет совершенно другой стек технологий.

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

Сперва мы инициируем сервер с «голым» Centos7, например на SimpleCloud или vScale. И любым способом заходим в него рутом. Затем берем прямо отсюда копипастим команды в командную строку (можно сразу всей кучей):

wget pavlyuts.ru/tools/init.sh
chmod +x init.sh
./init.sh

Собственно, скрипт обновляет систему, доставляет утилиты, и, в частности, ставит последний openssh (7.5b1) с обходом всех подводный камней как я описал здесь.

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

Следом за именем он попросит ввести открытый ключ, который дальше и будет использоваться в SSH. Проще всего скопипастить его из окна PuTTY Key Generator, это окошко в верхней части, озаглавленное «Public key for passing into…». Скрипт проверяет его по формату и если он получает не открытый ключ, а нечто другое — то он опять и опять просит дать ему именно открытый ключ.

Когда имя и ключ заданы, будет создан пользователь и после этого надо задать для него пароль. Этот пароль не будет использоваться для входа на сервер, вход — по сертификату. Он нужен для того, чтобы перейти к полномочиям root командой sudo. Позволять «перескакивать» в root без пароля — плохая идея, так что пароль надо придумать и ввести, причем такой чтобы точно его не забыть.

В результате скрипт попросит Вас открыть другой терминал и проверить, что вы можете зайти по SSH с этим именем и этим ключом, а так же войдя на сервер успешно сделать sudo -s, ввести пароль и получить консоль root (символ в командной строке изменится с $ на #). Это важно, потому что следующим шагом удаленный доступ root блокируется, и если Вы чего-то сделали не так — быть беде. Поэтому если не получается — то лучше сказать скрипту нет и запустить его еще раз, с большим вниманием.

Дальше мы задаем имя хоста и это последний вопрос в этой части истории.

Следом будет установлен и активирован firewalld и настроен на пропуск http и https, а также если памяти 1Гб или меньше — будет создан своп-файл. Как показала практика, это единственная возможность сохранить стабильность работы системы с таким набором софта.

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

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

Чтобы закончить установку nginx, php-fpm и MySQL — надо зайти по SSH с именем пользователя и ключом, заданным на первом этапе и запустить второй скрипт, который первым уже аккуратно положен в домашний каталог пользователя. Но поскольку мы уже не root, то и запускать его надо через sudo, вот так:

sudo ./setup.sh

В этом случае сервер попросит пароль, помните, переход в полномочия root защищен им.

Этот скрипт так же спрашивает, уверены ли Вы что хотите его запустить. Он ставит и запускает следующее:

  1. Nginx из моего репозитория repo.pavlyuts.ru. Дело в том, что Nginx в оригинальном репозитории по каким-то причинам собран с очень старой версией openssl. В моем репозитории лежит сборка с последней версией openssl, поддерживающая HTTP/2
  2. PHP-fpm одной из версий на выбор: 5.4, 5.5, 5.6, 7.0 или 7.1. Версии 5.5 и старше берутся из репозитория webtatic.com. Пожалуйста, будьте внимательны при выборе.
  3. Percona for MySQL (клон MySQL) из оригинального репозитория percona.com

Все необходимые репозитории подключаются автоматически. Для обнволения установленных пакетов достаточно стандартно использовать yum [ update | upgrade]

Последним шагом скрипт находит в логах и показывает временный пароль MySQL root и запускает такую нужную штуку как mysql_secure_installation, для которой этот пароль и нужен. Там надо поменять пароль root, убрать анонимный доступ и удаленный доступ для root, удалить демо-базы, ну в общем — стандартная процедура от MySQL, описанная в документации.

Все, готово! В зависимости от скорости работы серверов и сети вся эта история на круг занимает от семи до пятнадцати минут и почти полностью избавляет от геморроя.

Оттестировано на серверах на SimpleCloud или vScale. Должно также работать на любых «базовых» сборках Centos7, возможно — Centos7, а так же на всех ветвях RHEL, которые для управления репозиторием используют yum.

Enjoy! С вопросами, комментариями и предложениями — пишите, звоните, стучитесь в чаты!