О web-разработке
и даже немного больше...

Как перенести Laravel на боевой сервер?

Всем привет. Этот пост является продолжением серии постов на тему разработки веб-приложений на Laravel. Здесь мы рассмотрим процедуру переноса сайта с локального сервера на «боевой». Процедура переноса на самом деле не составляет большой сложности, если всё делать внимательно, то можно избежать разного рода типичных ошибок. Хотя с другой стороны ошибки могут возникать и по причине конфигурации самого сервера. Поэтому, ошибок бояться не нужно, и хорошо если они проявляются.

Подготовка сайта к переносу

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

Для удобной передачи, создайте архив вашего проекта, затем загрузите на сервер. Так же необходимо импортировать базу данных на рабочий сервер. Сделать это можно, например, при помощи утилиты phpMyAdmin.

Настройка конфигурации на сервере

Итак, вы импортировали базу, и распаковали файлы сайта в корневую директорию домена на хостинге. Теперь самое время задать параметры конфигурации для нового сайта.
Основные настройки конфигурации находятся в файлах /.env и /config/database.php.

В файле .env мы меняем следующие основные параметры:

# URL вашего сайта
APP_URL=https://адрес-сайта

# подключение к БД
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE="имя-базы-данных"
DB_USERNAME="пользователь-бд"
DB_PASSWORD="пароль-бд"
DB_TIMEZONE = '+06:00'

В этом же файле находятся все основные параметры, такие как подключение к почтовому серверу и т.д. На период отладки так же рекомендуется выставить параметр:

# включить режим откладки
APP_DEBUG=true

Это позволит в случае возникновения ошибки выполнения скриптов видеть не белую страницу, а сообщение об ошибке. Что касается файла database.php то по умолчанию он наследует параметры подключения из файла .env. По этой причине, если вы используете стандартное подключение к базе данных, то менять в нём ничего не нужно.

Настройка корневой папки

Известно, что в Laravel в качестве корневой папки выступает папка /public. Это говорит о том, что при обращении к сайту через браузер, загрузка сайта должна начинаться именно с этой папки. Поэтому необходимо поменять корневую папку в настройках веб-сервера. Сделать это можно двумя способами.

Способ первый – через файл .htaccess
Если настройки веб-сервера позволяют менять корневую папку через .htaccess, можно создать этот файл в корневой папке домена и вписать в него строки:

RewriteEngine On
RewriteRule ^(.*)$ public/$1 [L] 

Способ второй – настройка корневой папки в панели управления хостингом
Практически все известные панели управления хостингом позволяют менять корневую директорию сайта. По этой причине удобно бывает просто сделать корневой папку /public в настройках панели управления хостингом. К примеру, если сайт лежит в папке /httpdocs, то корневой папкой для сайта должна быть /httpdocs/public.

Сброс старого кэша

Для ускорения загрузки веб-приложения Laravel по умолчанию кэширует данные. Это означает, что при переносе и смене конфигурации сайта нам так же необходимо сбросить кэш Laravel. В случае с локальным сервером, кэш сбрасывается посредством терминала и утилиты artisan. На боевом же сервере удобнее создать временный маршрут, например /clear, при обращении к которому будет сброшен кэш.

Открываем файл роутов /routes/web.php и добавляем такую запись:

Route::get('/clear', function () {
	Artisan::call('cache:clear');
	Artisan::call('config:cache');
	Artisan::call('view:clear');
	Artisan::call('route:clear');
	return "Сброс кэша выполнен!";
});

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

Символические ссылки на файлы

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

Например, в моём проекте есть папка с изображениями:
/storage/app/public/upload

Чтобы сделать публичный доступ к файлам в этой директории, необходимо создать следующую символическую ссылку на неё:
/public/upload

Сделать это можно посредством команды symlink() в php, либо консоли самого сервера.
В моём случае я создал временный маршрут в файле /routes/web.php и поместил в него такой код:

Route::get('/symlink', function () {
	$targetFolder = $_SERVER['DOCUMENT_ROOT'].
						DIRECTORY_SEPARATOR . 'storage' .
						DIRECTORY_SEPARATOR . 'app' .
						DIRECTORY_SEPARATOR . 'public'.
						DIRECTORY_SEPARATOR . 'upload';

	$linkFolder = $_SERVER['DOCUMENT_ROOT'].
					DIRECTORY_SEPARATOR . 'public' .
					DIRECTORY_SEPARATOR . 'upload';

	symlink($targetFolder, $linkFolder);

	return "Создание символьныой ссылки завершено!";
});

Далее вызываем адрес в браузере /symlink относительного вашего сайта, и видим сообщение, что ссылка была создана. После этого, этот код можно убрать.

Хотел бы ещё заметить одну вещь. Важно проверять работу символьной ссылки путём обращения к какому-либо файлу, который лежит в папке назначения. В файловом менеджере визуально мы можем символьную ссылку и не увидеть. Так, например, случилось в моём случае, когда я использовал WinSCP. Что касается других программ, ничего не скажу, т.к. это нужно проверять.

Опубликован: 13.11.2022 г.

См. также:

Как просмотреть SQL запрос в Eloquent Laravel?
Как объявить переменную в шаблоне Laravel Blade?
Проверка на пустоту коллекций Eloquent в Laravel
Как получить URL текущей страницы в Laravel?
Как вывести роуты Laravel в отдельный файл?
Как получить случайные записи из БД в Laravel?
Ограничение выборки (LIMIT) данных в Laravel
Команды Artisan для сброса кэша в Laravel

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Комментарии
  • Загрузка...
Друзья сайта