Развертывание Laravel 8 с нулевым временем простоя (2 часть)

Доброго времени суток!

Мы продолжаем создание нашего «конвейера» непрерывного развертывания приложения Laravel.

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

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

В качестве веб-сервера будем использовать Nginx, а в качестве СУБД — MySQL. Также, мы получим SSL сертификат и настроим его автоматический перевыпуск.

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


Создание сервера

Как я говорил в первом уроке, буду использовать услуги компании Selectel.ru.Если вы планируете размещать проект для зарубежного сегмента пользователей, рекомендую использовать в качестве альтернативы воспользоваться услугами DigitalOcean.com. Суть у обоих провайдеров весьма схожа.

  1. Выбираем «Облачная платформа»
  2. Предпочтительный для Вас дата центр
  3. Создаем сервер

  1. Имя сервера, которое будет отображено в панели управления
  2. Тип и версия ОС (в моем случае это Ubuntu 20.04)
  3. Конфигурация сервера
Выбор ОС сервера

  1. Выбираем размер диска
  2. ВАЖНО. Приватная подсеть + плавающий IP. Это необходимо для того, чтобы в будущем можно было подключить домен к нашему серверу и при этом у нас была приватная подсеть для возможного масштабирования в будущем
  3. Загружаем публичный SSH ключ (~/.ssh/id_rsa.pub)
  4. Подтверждаем создание сервера

В течении пары минут сервер будет создан.

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

Это не срытая реклама сервиса. Я правда, искренне, рекомендую его. Он очень удобен!)


В любой момент вы можете «выключить» сервер и средства не будут списываться за его использование. Ту же операцию можно проделать и с IP адресом в соответствующей вкладке.


Подключение домена

Скажу сразу, что обновление DNS записей и соответственно доступ к Вашему сайту через домен, а не IP, может занять до 72 часов. Обычно, сервер становится доступен по домену в течении 6 часов.

Добавляем домен, следуя шагам ниже (домен указываете свой):

Далее нам необходимо «склеить» домен и сервер. Для этого нужно добавить NS запись типа A для нашего домена и домена с www.

  1. Повторяем действия указанные ниже
  2. Указываем плавающий IP своего сервера
  3. Сохраняем запись
  4. Проделываем ту же операцию, но в «Имя записи» указываем www

Итого, у нас должно появится 2 новые записи типа A:


Настройка сервера

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

ssh root@плавающий_ip_вашего_сервера

Если вы все сделали правильно, Вам зададут вопрос, на который следует написать yes и нажать клавишу ввод.

Я надеюсь Вы добавили публичный SSH ключ при создании сервера и по этому, у вас не запросит пароль и сразу впустит на сервер 🙂


Установка NGINX

Обновляем все пакеты сервера:

apt update

Устанавливаем NGINX:

apt install nginx

Активируем автозапуск сервера:

systemctl enable nginx

Проверяем, выполнив следующую команду. Если ответ enabled — все отлично!

systemctl is-enabled nginx

Запускаем наш веб-сервер:

service nginx start

Проверяем статус (должен быть active):

service nginx status

Перейдя, по плавающему IP (в моем случае это 92.53.69.30), должны увидеть такую картину:

Давайте теперь настроим NGINX. Выполним команду, чтобы перейти в наш пакет:

cd /etc/nginx

Удалим тестовые конфиги сайтов:

rm -rf sites-available/* sites-enabled/*

Создадим свой конфиг. Для этого нам нужно выполнить следующую команду, в которой Вы замените домен сайта на свой (это очень важно).

vim sites-available/testmysite.pro

Содержимое конфига должно быть следующим. Замените в нем домен на свой и версию PHP также:

server {
    server_name testmysite.pro www.testmysite.pro;
    root /var/www/testmysite.pro/current/public;
    index index.html index.htm index.php;

    charset utf-8;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    access_log off;
    error_log  /var/log/nginx/testmysite.pro-error.log error;

    error_page 404 /index.php;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_pass unix:/run/php/php8.0-fpm.sock;
    }

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

Создадим символическую ссылку, выполнив следующий команды:

cd sites-enabled
ln -s ../sites-available/testmysite.pro testmysite.pro

Перезапустим наш NGINX и PHP-FPM:

service nginx restart
service php8.0-fpm reload

Установка MySQL

Теперь займемся установкой СУБД MySQL. Если у вас командная строка сейчас недоступна для записи, после предыдущей команды, нажмите один или два раза сочетание клавиш CTRL+C.

Выполним следующую команду:

sudo apt install mysql-server

Мы всегда подтверждаем установку пакетов вводом буквы «y«.

Далее установим сложность пароля командой:

sudo mysql_secure_installation

Далее вводим «y«. После, нужно выбрать сложность пароля, указав значение от 0 до 2. Для демонстрации, я укажу «0″, но рекомендую указывать как минимум «1″.

Далее указываем наш придуманный root пароль. После, подтверждаем его еще раз.

Все остальные вопросы установщика просто подтверждаем клавишей ENTER.

В конце, мы должны увидеть такую картину:

Проверить работу можно, выполнив команду:

sudo systemctl status mysql

Для начала войдем в оболочку, выполнив команду:

mysql -uroot -p

Создадим базу данных (название давайте свое):

CREATE DATABASE testmysite;

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

# Создание пользователя.
CREATE USER 'testmysite'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD';

# Даем все разрешения этому пользователю.
GRANT ALL PRIVILEGES ON *.* TO 'testmysite'@'localhost';

# Перезапускаем разрешения.
FLUSH PRIVILEGES;

Установка PHP

Я буду ставить 8 версию PHP. В вашем же случае, версия может быть иная. Выполняем следующие команды:

# Добавляем PHP репозиторий.
add-apt-repository -y ppa:ondrej/php

# Обновляем репозитории сервера.
apt update -y

# Устанавливаем PHP со всеми необходимыми зависимостями.
apt install -y php8.0 php8.0-common php8.0-gd php8.0-intl php8.0-zip php8.0-sqlite3 php8.0-mysql php8.0-fpm php8.0-mbstring php8.0-xml php8.0-curl php8.0-memcached unzip zip composer

Проверить версию PHP, после установки, можно, командой:

php -v

Установка NodeJS

Если для вашего проекта необходим NodeJS — установим его следующими командами:

# Обновляем репозитории сервера.
apt update -y

# Устанавливаем acl и npm.
apt install -y acl nodejs npm

Установка SSL сертификата

Выполняем следующие команды, заменив домен на свой:

certbot --nginx -d testmysite.pro —d www.testmysite.pro

Certbot обеспечивает автоматическое обновление ваших сертификатов с помощью задания CRON.

Запустите, certbot renew —dry-run чтобы убедиться, что CRON будет работать правильно в следующий раз, когда ему потребуется обновить сертификат.

Если все прошло хорошо, вы должны увидеть некоторые специальные строки, отмеченные как #managed by Certbot в вашем файле конфигурации Nginx:

cat /etc/nginx/sites-available/testmysite.pro

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

mkdir /var/www/testmysite.pro/current/public

После, поместите туда файл с названием index.php, содержимое которого будет:

<?php
phpinfo();

После, перейдя на сайт, вы должны будете увидеть окно конфигурации PHP.

Это будет означать, что мы все сделали правильно!)


Самое сложное позади 😁.

В следующем эпизоде мы настроим инструмент Deployer.

Всем хорошего дня и адекватных заказчиков!