Laravel — это PHP-фреймворк с открытым исходным кодом, предоставляющий набор инструментов и ресурсов для создания современных PHP-приложений.
В этом руководстве вы установите и настроите новое приложение Laravel на сервере Ubuntu 20.04, используя Composer для загрузки и управления зависимостями фреймворка и Nginx для обслуживания приложения. После завершения работы у вас будет функциональное демонстрационное приложение Laravel.
Сначала нужно выполнить следующие задачи на вашем сервере Ubuntu 20.04:
- Создайте пользователя sudo и включите ufw. При необходимости вы можете использовать наше руководство по начальной настройке сервера с Ubuntu 20.04.
- Установите стек LEMP с MySQL 8.
- Установите Composer. Мы будем использовать Composer для установки Laravel и его зависимостей.
Установка необходимых модулей PHP
Прежде чем устанавливать Laravel, необходимо установить несколько PHP-модулей, которые требуются фреймворку. Мы будем использовать apt для установки PHP-модулей php-mbstring, php-xml и php-bcmath.
Если вы впервые используете apt в этой сессии, сначала выполните команду update
, чтобы обновить кэш менеджера пакетов:
sudo apt update
Теперь вы можете установить необходимые пакеты с помощью:
sudo apt install php-mbstring php-xml php-bcmath php-curl
Теперь ваша система готова к выполнению установки Laravel через Composer, но перед этим вам понадобится база данных для вашего приложения.
Создание базы данных для приложения
Чтобы продемонстрировать базовую установку и использование Laravel, мы создадим приложение, которое будет показывать список задач, которые пользователь хотел бы выполнить, и список дел, которые он уже закончил. Эти данные можно хранить в таблице tasks с полем для задач, которое мы назовем name, и другим полем для отметки их как посещённых или не посещённых, которое мы назовём completed. Кроме того, мы включим поле id для уникальной идентификации каждой записи.
Чтобы подключиться к базе данных из приложения Laravel, мы создадим специального пользователя MySQL и предоставим ему полные привилегии на базу данных laravel_tasks.
Чтобы начать работу, войдите в консоль MySQL как пользователь базы данных root:
sudo mysql
Чтобы создать новую базу данных, выполните следующую команду из консоли MySQL:
CREATE DATABASE laravel_tasks;
Теперь вы можете создать нового пользователя и предоставить ему полные привилегии на только что созданную пользовательскую базу данных. В этом примере мы создаём пользователя под именем laravel_user с паролем password, хотя вы должны изменить его на безопасный пароль по своему усмотрению:
CREATE USER 'laravel_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Теперь нам нужно дать этому пользователю права на работу с базой данных laravel_tasks:
GRANT ALL ON laravel_tasks.* TO 'laravel_user'@'%';
Это даст пользователю laravel_user полные привилегии над базой данных laravel_tasks, не позволяя ему создавать или изменять другие базы данных на вашем сервере.
exit
Теперь вы можете проверить, имеет ли новый пользователь соответствующие разрешения, снова войдя в консоль MySQL, на этот раз используя учётные данные пользовательского пользователя:
mysql -u laravel_user -p
Обратите внимание на флаг -p
в этой команде, который запросит у вас пароль, использованный при создании пользователя laravel_user. После входа в консоль MySQL подтвердите, что у вас есть доступ к базе данных laravel_tasks:
SHOW DATABASES;
Затем создайте таблицу с именем tasks в базе данных laravel_tasks. В консоли MySQL выполните следующую команду:
CREATE TABLE laravel_tasks.tasks (
id INT AUTO_INCREMENT,
name VARCHAR(255),
completed BOOLEAN,
PRIMARY KEY(id)
);
Теперь заполните таблицу мест некоторыми примерными данными:
INSERT INTO laravel_tasks.tasks (name, completed)
VALUES ("Купить сервер", false),
("Выполнить первоначальную настройку", true),
("Установить стек LEMP с MySQL 8", true),
("Установить Composer", true),
("Установить Laravel", false);
Чтобы подтвердить, что данные были успешно сохранены в вашей таблице, выполните команду:
SELECT * FROM laravel_tasks.tasks;
Вы увидите результат, подобный этому:
+----+--------------------------------------------------------------------+-----------+
| id | name | completed |
+----+--------------------------------------------------------------------+-----------+
| 1 | Купить сервер | 1 |
| 2 | Выполнить первоначальную настройку | 1 |
| 3 | Установить стек LEMP с MySQL 8 | 1 |
| 4 | Установить Composer | 1 |
| 5 | Установить Laravel | 0 |
+----+--------------------------------------------------------------------+-----------+
5 rows in set (0.00 sec)
Убедившись, что в вашей тестовой таблице есть достоверные данные, вы можете выйти из консоли MySQL:
exit
Теперь вы готовы создать приложение и настроить его для подключения к новой базе данных.
Создание нового приложения Laravel
Сейчас вы создадите новое приложение Laravel с помощью команды composer create-project. Эта команда Composer обычно используется для создания новых приложений на основе существующих фреймворков и систем управления контентом.
В этом руководстве в качестве примера приложения мы будем использовать laravel-tasks, но вы можете изменить это на что-то другое. Приложение laravel-tasks отображает список дел, взятый с локального сервера MySQL, и предназначено для демонстрации базовой конфигурации Laravel и подтверждения того, что вы можете подключиться к базе данных.
Сначала перейдите в домашний каталог вашего пользователя:
cd ~
Следующая команда создаст новый каталог laravel-tasks, содержащий приложение Laravel с настройками по умолчанию:
composer create-project --prefer-dist laravel/laravel laravel-tasks
Вы увидите результат, подобный этому:
Creating a "laravel/laravel" project at "./laravel-tasks"
Installing laravel/laravel (v9.1.5)
- Installing laravel/laravel (v9.1.5): Extracting archive
Created project in /home/atlex/laravel-tasks
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies
. . .
Package manifest generated successfully.
78 packages you are using are looking for funding.
Use the `composer fund` command to find out more!
> @php artisan vendor:publish --tag=laravel-assets --ansi --force
No publishable resources for tag [laravel-assets].
Publishing complete.
> @php artisan key:generate --ansi
Application key set successfully.
. . .
После завершения установки зайдите в каталог приложения и запустите команду Laravel's artisan
, чтобы убедиться, что все компоненты были успешно установлены:
cd laravel-tasks
php artisan
Вы увидите результат, подобный этому:
Laravel Framework 9.8.1
Usage:
command [options] [arguments]
Options:
-h, --help Display help for the given command. When no command is given display help for the list command
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi|--no-ansi Force (or disable --no-ansi) ANSI output
-n, --no-interaction Do not ask any interactive question
--env[=ENV] The environment the command should run under
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug
. . .
Этот результат подтверждает, что файлы приложения на месте, а инструменты командной строки Laravel работают, как ожидалось. Однако нам всё еще нужно сконфигурировать приложение, чтобы настроить базу данных и несколько других деталей.
Конфигурирование Laravel
Файлы конфигурации Laravel находятся в каталоге config
, расположенном в корневом каталоге приложения. Кроме того, когда вы устанавливаете Laravel с помощью Composer, создаётся файл окружения. Этот файл содержит настройки, специфичные для текущей среды, в которой работает приложение, и будет иметь приоритет над значениями, заданными в обычных конфигурационных файлах, расположенных в каталоге config
. Каждая установка в новой среде требует специального файла окружения для определения таких параметров, как настройки подключения к базе данных, параметры отладки, URL-адрес приложения, а также других элементов, которые могут отличаться в зависимости от того, в какой среде запущено приложение.
Внимание!
Файл конфигурации среды содержит конфиденциальную информацию о вашем сервере, включая учётные данные базы данных и ключи безопасности. По этой причине вы никогда не должны предоставлять этот файл публично.
Теперь мы отредактируем файл .env
, чтобы настроить параметры конфигурации для текущей среды приложения.
nano .env
Несмотря на то, что в этом файле много конфигурационных переменных, вам не нужно настраивать их все сейчас. Следующий список содержит обзор переменных, которые требуют немедленного внимания:
- APP_NAME: имя приложения, используемое для уведомлений и сообщений;
- APP_ENV: текущая среда приложения;
- APP_KEY: используется для генерации солей и хэшей, этот уникальный ключ автоматически создаётся при установке Laravel через Composer, поэтому вам не нужно его менять;
- APP_DEBUG: показывать или нет отладочную информацию на стороне клиента;
- APP_URL: базовый URL для приложения, используемый для генерации ссылок на приложение;
- DB_DATABASE: имя базы данных;
- DB_USERNAME: имя пользователя для подключения к базе данных;
- DB_PASSWORD: пароль для подключения к базе данных.
По умолчанию эти значения настроены для локальной среды разработки. Мы изменим эти значения, чтобы отразить текущие настройки среды нашего примера приложения.
Если вы устанавливаете Laravel в среде разработки или тестирования, вы можете оставить опцию APP_DEBUG включённой, так как это даст вам важную отладочную информацию при тестировании приложения из браузера. Переменная APP_ENV в этом случае должна быть установлена на development или testing.
Если вы устанавливаете Laravel на продакшене, вам следует отключить опцию APP_DEBUG, поскольку она показывает конечному пользователю конфиденциальную информацию о вашем приложении. Параметр APP_ENV в этом случае должен быть установлен на production.
Следующий файл .env
устанавливает наше примерное приложение для разработки:
Внимание!
Переменная APP_KEY содержит уникальный ключ, который был автоматически сгенерирован при установке Laravel через Composer. Вам не нужно изменять это значение. Если вы хотите сгенерировать новый безопасный ключ, вы можете использовать команду php artisan key:generate
.
APP_NAME=Laravel Tasks
APP_ENV=development
APP_KEY=APPLICATION_UNIQUE_KEY_DONT_COPY
APP_DEBUG=true
APP_URL=http://domain_or_IP
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_tasks
DB_USERNAME=laravel_user
DB_PASSWORD=password
. . .
Настройте переменные соответствующим образом. Когда вы закончите редактирование, сохраните и закройте файл, чтобы сохранить изменения. Если вы используете nano, вы можете сделать это с помощью CTRL+X, затем Y и Enter для подтверждения.
Ваше приложение Laravel теперь настроено, но нам всё еще нужно настроить веб-сервер, чтобы иметь возможность получить доступ к нему через браузер. На следующем этапе мы настроим Nginx для обслуживания вашего приложения Laravel.
Настройка Nginx
Мы установили Laravel в локальную папку домашнего каталога удаленного пользователя, и хотя это хорошо подходит для локальных сред разработки, это не рекомендуется для веб-серверов, открытых для публичного доступа в интернет. Мы переместим папку приложения в /var/www
, что является обычным расположением для веб-приложений, работающих на Nginx.
Сначала с помощью команды mv
переместите папку приложения со всем её содержимым в /var/www/laravel-tasks
:
sudo mv ~/laravel-tasks /var/www/laravel-tasks
Теперь нам нужно предоставить пользователю веб-сервера доступ на запись к папкам storage
и cache
, в которых Laravel хранит файлы, созданные приложением:
sudo chown -R www-data.www-data /var/www/laravel-tasks/storage
sudo chown -R www-data.www-data /var/www/laravel-tasks/bootstrap/cache
Файлы приложения теперь в порядке, но нам все еще нужно настроить Nginx для обслуживания содержимого. Для этого мы создадим новый файл конфигурации виртуального хоста по адресу /etc/nginx/sites-available
:
Следующий конфигурационный файл содержит рекомендуемые настройки для приложений Laravel на Nginx:
server {
listen 80;
server_name server_domain_or_IP;
root /var/www/laravel-tasks/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
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; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}
Скопируйте это содержимое в свой файл /etc/nginx/sites-available/laravel-tasks
и, при необходимости, скорректируйте выделенные значения в соответствии со своей конфигурацией. После завершения редактирования сохраните и закройте файл.
Чтобы активировать новый файл конфигурации виртуального хоста, создайте символическую ссылку на laravel-tasks
в sites-enabled
:
sudo ln -s /etc/nginx/sites-available/laravel-tasks /etc/nginx/sites-enabled/
Внимание!
Если у вас есть другой файл виртуального хоста, который ранее был настроен на то же имя_сервера, которое используется в виртуальном хосте laravel-tasks, вам может понадобиться деактивировать старую конфигурацию, удалив соответствующую символическую ссылку внутри /etc/nginx/sites-enabled/
.
Чтобы убедиться, что конфигурация не содержит синтаксических ошибок, вы можете использовать:
sudo nginx -t
Вы должны увидеть результат, подобный этому:
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Чтобы применить изменения, перезагрузите Nginx с помощью:
sudo systemctl reload nginx
Теперь перейдите в браузер и зайдите в приложение, используя доменное имя или IP-адрес сервера, как определено директивой server_name в вашем конфигурационном файле:
http://server_domain_or_IP
Вы увидите страницу, подобную этой:
Это подтверждает, что ваш сервер Nginx правильно настроен для работы с Laravel. С этого момента вы можете начать создавать свое приложение на основе, предоставленной установки по умолчанию.
На следующем этапе мы изменим главный маршрут приложения, чтобы он запрашивал данные в базе данных, используя фасад Laravel DB.
Настройка главной страницы
Если вы выполнили все шаги этого руководства, у вас должно быть рабочее приложение Laravel и таблица базы данных с именем tasks, содержащая некоторые примеры данных.
Теперь мы отредактируем основной маршрут приложения, чтобы он запрашивал базу данных и возвращал её содержимое в представление приложения.
Откройте основной файл маршрута, routes/web.php
:
nano routes/web.php
По умолчанию этот файл поставляется со следующим содержимым:
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', function () {
return view('welcome');
});
Маршруты определяются в этом файле с помощью статического метода Route::get, который получает в качестве аргументов путь и callback-функцию.
Следующий код заменяет callback-функцию главного маршрута. Он делает 2 запроса к базе данных, используя флаг completed
для фильтрации результатов. Он возвращает результаты в представление с именем taskslist, которое мы создадим следующим. Скопируйте это содержимое в свой файл routes/web.php
, заменив уже имеющийся там код:
<?php
use Illuminate\Support\Facades\DB;
Route::get('/', function () {
$completed = DB::select('select * from tasks where completed = ?', [1]);
$todo = DB::select('select * from tasks where completed = ?', [0]);
return view('taskslist', compact('completed', 'todo'));
});
Сохраните и закройте файл после завершения редактирования. Теперь мы создадим представление, которое будет отображать результаты базы данных для пользователя. Создайте новый файл представления в папке resources/views
:
nano resources/views/taskslist.blade.php
Следующий шаблон создаёт два списка мест на основе переменных completed и todo. Скопируйте это содержимое в ваш новый файл представления:
<html>
<head>
<title>Список дел</title>
</head>
<body>
<h1>Мой список дел:</h1>
<h2>Задачи, которые надо выполнить:</h2>
<ul>
@foreach ($todo as $task)
<li>{{ $task->name }}</li>
@endforeach
</ul>
<h2>Завершённые задачи:</h2>
<ul>
@foreach ($completed as $task)
<li>{{ $task->name }}</li>
@endforeach
</ul>
</body>
</html>
Сохраните и закройте файл, когда закончите. Теперь перейдите в браузер и перезагрузите приложение. Вы увидите страницу, подобную этой:
Теперь у вас есть функциональное приложение Laravel, получающее содержимое из базы данных MySQL.