Установка Laravel-приложений на хостинг с ispmanager
Дисклеймер: Я не являюсь гуру PHP и Laravel. Но в этой статье на конкретных примерах расскажу, как развернуть веб-приложение на базе Laravel framework на сайте под управлением панели ispmanager. Будет мало теории, но много практических шагов, командной строки, скриншотов, немного докера и компиляции кода.
Готовы? Поехали!
Подготовка
Для начала разберёмся с совершенно необходимым для нас компонентом — composer. Панель ispmanager поддерживает установку на разные операционные системы. Поэтому версия composer, в зависимости от вашей операционной системы, может быть 1.x или 2.x. Современные Laravel-приложения требуют composer не ниже версии 2.x
Когда вы начнёте устанавливать ваше первое Laravel-приложение, вы можете увидеть примерно такую вот ошибку:
bash-4.2$ composer create-project --prefer-dist laravel/laravel .
Creating a "laravel/laravel" project at "./laravel"
Deprecation Notice: preg_match(): Passing null to parameter #2 ($subject) of type string is deprecated in /usr/share/php
/Composer/Command/CreateProjectCommand.php:329
Deprecation Notice: preg_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /usr/s
hare/php/Composer/Semver/VersionParser.php:53
Warning from https://repo.packagist.org: Support for Composer 1 is deprecated and some packages will not be available.
You should upgrade to Composer 2. See https://blog.packagist.com/deprecating-composer-1-support/
Info from https://repo.packagist.org: #StandWithUkraine
Killed
Это значит, что на вашей операционной системе установлена устаревшая версия composer 1.x, и приложение намекает вам, что нужно бы его обновить. Например, такое случается на CentOS 7. А вот на Debian 11, где я проводил все свои эксперименты, по умолчанию установлен composer 2.x
Проверить версию можно так:
bash-4.2$ composer -v
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 1.10.26 2022-04-13 16:39:56
Попытка обновить его простым способом заканчивается такой ошибкой:
bash-4.2$ composer self-update --2
[Symfony\Component\Console\Exception\CommandNotFoundException]
Command "self-update" is not defined.
Поэтому давайте обновим его до версии 2.x другим, безопасным способом.
Сначала выясняем расположение composer чтобы потом добавить при обновлении как опцию --install-dir /usr/bin --filename composer
в третьей команде:
bash-4.2$ which composer
/usr/bin/composer
И обновляем composer из-под пользователя root:
# php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
# php -r "if (hash_file('sha384', 'composer-setup.php') === '55ce33d7678c5a611085589f1f3ddf8b3c52d662cd01d4ba75c0ee0459970c2200a51f492d557530c71c15d8dba01eae') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
Installer verified
# php composer-setup.php --install-dir /usr/bin --filename composer
All settings correct for using Composer
Downloading...
Composer (version 2.2.21) successfully installed to: /usr/bin/composer
Use it: php /usr/bin/composer
# php -r "unlink('composer-setup.php');"
# composer -v
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Continue as root/super user [yes]?
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.2.21 2023-02-15 13:07:40
Следующий шаг подготовки — установка в систему всех необходимых нам в дальнейшем пакетов:
# apt install git gcc make autoconf
Теперь пришло время перейти в панель ispmanager и создать сайт и базу данных для него.
Тут самое основное — указать public вручную в конце Директории сайта и включить настройки Обработчика PHP, как отмечено на скриншоте:
Создание сайта
После создания сайта необходимо выполнить важнейший шаг в подготовке — внести изменение в конфигурационный файл nginx. Без этого изменения ваш Laravel-сайт работать не будет. Это изменение можно внести в интерфейсе ispmanager, выделив нужный сайт и нажав кнопку Файлы конфигурации в меню. Но я покажу, как это сделать в командной строке, так как там вы лучше проконтролируете процесс.
Нужно открыть в любом консольном редакторе файл конфигурации nginx вашего сайта /etc/nginx/vhosts/www-root/domain.ru.conf
и внести в него строку в указанное стрелкой место:
location / {
try_files $uri $uri/ /index.php?$query_string; # <----- добавить эту строку сюда!
location ~ [^/]\.ph(p\d*|tml)$ {
try_files /does_not_exists @php;
}
location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf|webp|woff|woff2)$ {
expires 24h;
}
После сохранения файла нужно проверить, что ошибок в конфигурации nginx нет и перезапустить nginx:
# nginx -t
# systemctl restart nginx
После создания сайта, если вы нажмете в меню кнопку Файлы сайта, вы попадёте в ту самую корневую директорию public, где будут находится следующие файлы:
Файлы сайта по умолчанию
Выделенный файл composer.phar нужно скопировать или перенести выше в директорию /var/www/www-root/data/www/
Он нам понадобится в дальнейшем. Сделать это можно с помощью того же Менеджера файлов.
Базу данных создаём обычным способом (запоминаем название базы, логин и пароль к ней):
Создание базы данных
На этом подготовка к установке закончена. Теперь мы можем перейти к самому процессу установки Laravel-приложений на наш сайт.
Установка Laravel-приложений
Сама установка приложений достаточно проста и однотипна. Я покажу её на примере одной популярной CMS и онлайн-магазина. По аналогии вы сможете устанавливать и другие Laravel-приложения.
Начнём с PyroCMS.
Первое, что мы делаем, — подключаемся пользователем www-root, переходим в директорию сайта, где располагается public, и удаляем в ней абсолютно всё. Даже директорию public. При установке приложения, эта директория будет создана снова:
# su www-root
$ cd /var/www/www-root/data/www/domain.ru/
$ rm -rf * .*
Теперь у нас всё готово для установки приложения. Выполняем её парой команд:
$ /opt/php81/bin/php /var/www/www-root/data/www/composer.phar create-project pyrocms/pyrocms --prefer-dist /var/www/www-root/data/www/domain.ru/
$ composer update
Небольшое замечание. При создании сайта в интерфейсе ispmanager мы выбрали версию PHP 8.1.x. Поэтому в приведённой выше команде мы используем именно эту версию PHP — /opt/php81/bin/php
. Если вы используете другую версию PHP — используйте, соответственно /opt/php82/bin/php
или /opt/php74/bin/php
.
Дальше нужно выполнить начальное конфигурирование нашего PyroCMS. На этом этапе создаётся структура базы данных, аккаунт администратора и другие настройки. Делаем это при помощи следующей команды, отвечая на задаваемые вопросы о параметрах подключения к созданной базе данных и другие:
$ /opt/php81/bin/php artisan install
После успешной конфигурации идём на https://domain.ru/admin, логинимся админским аккаунтом и видим примерно такой дашборд нашего PyroCMS, где и производится всё конфигурирование и настройка:
Админский интерфейс PyroCMS
Установку можно выполнить из интерфейса ispmanager, запустив Shell-клиент для сайта. В нём нужно будет выполнить следующие команды в директории /var/www/www-root/data/www/domain.ru/
:
$ rm -rf * .*
$ composer create-project --prefer-dist pyrocms/pyrocms .
$ composer update
$ php artisan install
Дополнительную информацию о том, как устанавливать PyroCMS можно найти в документации на их сайте.
Теперь давайте рассмотрим установку платформы для развёртывания онлайн магазина на базе Aimeos.
По сути, используются все те же команды, за исключением того, что настройка приложения начинается автоматически сразу после последней команды:
$ cd /var/www/www-root/data/www/domain.ru/
$ rm -rf * .*
$ /opt/php81/bin/php /var/www/www-root/data/www/composer.phar create-project aimeos/aimeos --prefer-dist /var/www/www-root/data/
www/domain.ru/
После успешного окончания процесса конфигурирования открывайте ваш сайт в любимом браузере. Вы должны увидеть такую вот красоту:
Магазин на базе Aimeos
Магазин на базе Aimeos
Но это ещё не всё!
Если заглянуть в конфигурационный файл .env
в директории сайта, то можно там увидеть упоминание о возможности использовать Redis для ещё большего ускорения и без того быстрого Laravel-сайта:
$ cd /var/www/www-root/data/www/domain.ru/
$ cat .env | grep -i redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=
REDIS_PORT=6379
Давайте же рассмотрим, как мы можем использовать эту возможность в рамках ispmanager-сервера.
Для начала нам нужно запустить Redis-сервис на порту 6379. Несомненно, что это можно сделать установкой Redis-сервиса с помощью пакетного менеджера операционной системы — yum или apt. И в этом есть свои преимущества. Но я покажу, как это сделать используя новую фичу ispmanager — поддержку Docker. Просто идём в пункт меню Docker и создаём контейнер Redis:
Создание Docker контейнера Redis
После того, как контейнер будет создан и запустится, проверяем, работает ли сервис Redis и доступен ли порт:
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3256bbd4fdec redis:latest "docker-entrypoint.s…" 46 seconds ago Up 45 seconds 0.0.0.0:6379->6379/tcp cranky_poincare
# lsof -i tcp:6379
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 179896 root 4u IPv4 662904 0t0 TCP *:redis (LISTEN)
# docker exec -it 3256bbd4fdec redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
Теперь нам нужно выбрать способ, которым наше Laravel-приложение будет общаться с Redis-сервером. На сайте Laravel пишут следующее:
Перед использованием Redis с Laravel мы рекомендуем вам установить и использовать расширение phpredis PHP через PECL. Расширение сложнее установить по сравнению с пакетами PHP пользовательского слоя, но оно может обеспечить лучшую производительность для приложений, интенсивно использующих Redis.
Если вы не можете установить расширение phpredis, то установите пакет predis/predis через Composer. Predis — это клиент Redis, полностью написанный на PHP и не требующий дополнительных расширений:
composer require predis/predis
Нам нужна лучшая производительность и поэтому мы пойдём сложным путём — скомпилируем модуль PHP для Redis из самого свежего исходного кода :) Все необходимые для компиляции системные пакеты мы уже установили apt-ом ещё на этапе подготовки.
Итак, наши действия будут такими: скачиваем исходный код, распаковываем, конфигурируем, компилируем и устанавливаем модуль для нашей версии PHP 8.1.х в ispmanager. Теперь то же самое в командах:
# wget https://github.com/phpredis/phpredis/archive/5.3.7.zip -O phpredis.zip
# unzip -o ./phpredis.zip
# cd phpredis-5.3.7/
# /opt/php81/bin/phpize
# ./configure --with-php-config=/opt/php81/bin/php-config
# make
# make install
# echo 'extension=redis.so' > /opt/php81/etc/php.d/redis.ini
Проверяем, что модуль подключён и работает:
# /opt/php81/bin/php -m | grep redis
redis
# /opt/php81/bin/php -i | grep redis
/opt/php81/etc/php.d/redis.ini
redis
redis.arrays.algorithm => no value => no value
redis.arrays.auth => no value => no value
redis.arrays.autorehash => 0 => 0
redis.arrays.connecttimeout => 0 => 0
redis.arrays.consistent => 0 => 0
redis.arrays.distributor => no value => no value
redis.arrays.functions => no value => no value
redis.arrays.hosts => no value => no value
redis.arrays.index => 0 => 0
redis.arrays.lazyconnect => 0 => 0
redis.arrays.names => no value => no value
........
Проверим заодно, что модуль Redis включён и в интерфейсе ispmanager в соответствующих настройках PHP:
Проверка модуля PHP Redis
Тем, кому лень заморачиваться с компиляцией модуля вручную, могу рекомендовать воспользоваться простой командой из цитаты с сайта Laravel выше и установить расширение Laravel Predis. Для этого достаточно внутри директории /var/www/www-root/data/www/domain.ru/
запустить команду composer require predis/predis
Заключение
В результате описанных выше шагов вы получаете максимально быстрый сайт с CMS или онлайн-магазином на модном Laravel framework под управлением популярной хостинговой панели ispmanager. А заодно получаете опыт установки подобных приложений и их конфигурации.
Я специально не затронул в статье вопросы безопасности такого сайта и его сервисов, поскольку это тема для отдельной статьи, а эта и так получилась объёмной :)