Developer Advocate
Laravel — это инфраструктура PHP с открытым исходным кодом, включающая инструменты и ресурсы для создания современных приложений PHP. Благодаря полной экосистеме с встроенными функциями популярность Laravel за последние годы быстро возросла, и многие разработчики предпочитают ее для ускорения процесса разработки.
В этом обучающем модуле мы установим и настроим новое приложение Laravel на сервере Ubuntu 20.04, используем Composer для загрузки зависимостей инфраструктуры и управления ими и используем Nginx для обслуживания приложения. После завершения этого обучающего модуля вы получите работающее демонстрационное приложение Laravel, извлекающее контент из базы данных MySQL 8.
Для прохождения этого обучающего модуля необходимо предварительно выполнить на сервере Ubuntu 20.04 следующие задачи:
sudo
и включить ufw
. Чтобы выполнить настройку сервера, воспользуйтесь нашим руководством по начальной настройке сервера Ubuntu 20.04.Прежде чем выполнить установку Laravel, необходимо установить несколько модулей PHP, требующихся для инфраструктуры. Мы будем использовать apt
для установки модулей PHP php-mbstring
, php-xml
и php-bcmath
. Эти расширения PHP предоставляют дополнительную поддержку при работе с кодированием символов, кодом XML и точными математическими операциями.
Если вы впервые используете apt
в этом сеансе, необходимо запустить команду update
, чтобы обновить кэш диспетчера пакетов:
- sudo apt update
Теперь вы можете установить требуемые пакеты с помощью следующей команды:
- sudo apt install php-mbstring php-xml php-bcmath
Теперь ваша система готова к установке Laravel через Composer, но перед этим нам потребуется база данных для нашего приложения.
Чтобы продемонстрировать основы установки и использования Laravel, мы создадим приложение travel list, показывающее список мест, куда хотят поехать пользователи, и места, где они уже побывали. Эти данные можно хранить в таблице places с полем для мест, которому мы присвоим имя name, а также с полем visited, где мы можем отметить места, которые пользователи посещали или не посещали. Также мы добавим поле id для уникальной идентификации каждой записи.
Чтобы подключиться к базе данных из приложения Laravel, мы создадим отдельного пользователя MySQL и предоставим этому пользователю полные права доступа к базе данных travellist
.
На момент написания этого руководства собственная библиотека MySQL PHP mysqlnd
не поддерживает метод аутентификации caching_sha2_authentication
, используемый по умолчанию в MySQL 8. Для подключения к базе данных MySQL из кода PHP необходимо создать нового пользователя с помощью метода аутентификации mysql_native_password
.
Для начала войдите в консоль MySQL как пользователь root базы данных:
- sudo mysql
Чтобы создать новую базу данных, запустите следующую команду в консоли MySQL:
- CREATE DATABASE travellist;
Теперь вы можете создать нового пользователя и предоставить ему полный набор прав для только что созданной вами базы данных. В этом примере мы создаем пользователя travellist_user с паролем password
, но вам следует изменить его на безопасный пароль по своему усмотрению:
- CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
Теперь нам нужно предоставить этому пользователю разрешение для базы данных travellist
:
- GRANT ALL ON travellist.* TO 'travellist_user'@'%';
Это даст пользователю travellist_user полные права доступа к базе данных travellist
, но не даст ему возможности создавать или изменять другие базы данных на вашем сервере.
После этого выйдите из оболочки MySQL:
- exit
Теперь вы можете проверить наличие у нового пользователя необходимых разрешений, выполнив повторный вход в консоль MySQL, на этот раз используя учетные данные вашего собственного пользователя:
- mysql -u travellist_user -p
В этой команде используется флаг -p
, то есть она будет запрашивать пароль, заданный вами при создании пользователя travellist_user. Войдите в консоль MySQL и убедитесь, что у вас имеется доступ к базе данных travellist
:
- SHOW DATABASES;
Результат будет выглядеть следующим образом:
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| travellist |
+--------------------+
2 rows in set (0.01 sec)
Создайте таблицу places
в базе данных travellist
. Из консоли MySQL запустите следующее выражение:
- CREATE TABLE travellist.places (
- id INT AUTO_INCREMENT,
- name VARCHAR(255),
- visited BOOLEAN,
- PRIMARY KEY(id)
- );
Заполните таблицу places
определенными образцами данных:
- INSERT INTO travellist.places (name, visited)
- VALUES ("Tokyo", false),
- ("Budapest", true),
- ("Nairobi", false),
- ("Berlin", true),
- ("Lisbon", true),
- ("Denver", false),
- ("Moscow", false),
- ("Olso", false),
- ("Rio", true),
- ("Cincinnati", false),
- ("Helsinki", false);
Чтобы подтвердить, что данные были успешно сохранены в таблицу, запустите следующую команду:
- SELECT * FROM travellist.places;
Вы увидите примерно следующий вывод:
Output+----+-----------+---------+
| id | name | visited |
+----+-----------+---------+
| 1 | Tokyo | 0 |
| 2 | Budapest | 1 |
| 3 | Nairobi | 0 |
| 4 | Berlin | 1 |
| 5 | Lisbon | 1 |
| 6 | Denver | 0 |
| 7 | Moscow | 0 |
| 8 | Oslo | 0 |
| 9 | Rio | 1 |
| 10 | Cincinnati| 0 |
| 11 | Helsinki | 0 |
+----+-----------+---------+
11 rows in set (0.00 sec)
Убедившись в том, что у вас есть надлежащие данные в тестовой таблице, вы можете закрыть консоль MySQL:
- exit
Вы готовы создать приложение и настроить его для подключения к новой базе данных.
Теперь мы создадим новое приложение Laravel, используя команду composer create-project
. Эта команда Composer обычно используется для загрузки новых приложений на базе существующих инфраструктур и систем управления контентом.
В этом обучающем модуле мы будем использовать в качестве примера приложение travellist
, но вы можете свободно изменить его на что-то другое. Приложение travellist
отображает список мест, извлеченный с локального сервера MySQL. Оно создано для демонстрации основ конфигурации Laravel и проверки возможности подключения к базе данных.
Вначале откройте домашний каталог вашего пользователя:
- cd ~
Следующая команда создаст новый каталог travellist
, содержащий базовое приложение Laravel с настройками по умолчанию:
- composer create-project --prefer-dist laravel/laravel travellist
Вы увидите примерно следующий вывод:
OutputInstalling laravel/laravel (v5.8.17)
- Installing laravel/laravel (v5.8.17): Downloading (100%)
Created project in travellist
> @php -r "file_exists('.env') || copy('.env.example', '.env');"
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 80 installs, 0 updates, 0 removals
- Installing symfony/polyfill-ctype (v1.11.0): Downloading (100%)
- Installing phpoption/phpoption (1.5.0): Downloading (100%)
- Installing vlucas/phpdotenv (v3.4.0): Downloading (100%)
- Installing symfony/css-selector (v4.3.2): Downloading (100%)
...
После завершения установки откройте каталог приложения и запустите команду Laravel artisan
для проверки успешной установки всех компонентов:
- cd travellist
- php artisan
Вывод будет выглядеть следующим образом:
OutputLaravel Framework 7.11.0
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable 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 располагаются в директории config
внутри корневой директории приложения. При установке Laravel с помощью Composer создается файл среды. Этот файл содержит настройки текущей среды, где выполняется приложение, и имеет приоритет перед обычными файлами конфигурации, расположенными в каталоге config
. Для каждого случая установки в новую среду требуется персонализированный файл среды, где будут определены такие настройки, как параметры подключения к базе данных, параметры отладки, URL приложения и другие параметры, в зависимости от используемой приложением среды.
Предупреждение. Файл конфигурации среды содержит важную информацию о вашем сервере, включая учетные данные базы данных и ключи безопасности. В связи с этим не следует предоставлять этот файл в открытый доступ.
Теперь мы изменим файл .env
для настройки конфигурации текущей среды приложения.
Откройте файл .env
, используя предпочитаемый редактор командной строки. Здесь мы будем использовать nano
:
- nano .env
Хотя в этом файле содержится много переменных конфигурации, вам не нужно настраивать их все. В следующем списке содержится обзор переменных, требующих внимания:
APP_NAME
: имя приложения, используется для уведомлений и сообщений.APP_ENV
: текущая среда приложения.APP_KEY
: используется для генерирования солей и хэш-сумм, этот уникальный ключ создается автоматически при установке Laravel с помощью Composer, изменять его не нужно.APP_DEBUG
: указывает, нужно ли отображать данные отладки на стороне клиента.APP_URL
: базовый URL приложения, используется для генерирования ссылок на приложение.DB_DATABASE
: имя базы данных.DB_USERNAME
: имя пользователя для подключения к базе данных.DB_PASSWORD
: пароль для подключения к базе данных.По умолчанию эти значения настроены для локальной среды разработки, которая использует Homestead, упакованный комплект Vagrant, который предоставляется Laravel. Мы изменим эти значения, чтобы отразить текущие настройки среды нашего приложения.
Если вы устанавливаете Laravel на систему, предназначенную для разработки или тестирования, вы можете оставить опцию APP_DEBUG
включенной, чтобы получать важные данные отладки при тестировании приложения в браузере. В этом случае для переменной APP_ENV
следует задать значение development
или testing
.
Если вы устанавливаете Laravel в производственной среде, вам необходимо будет отключить опцию APP_DEBUG
, потому что она показывает конечному пользователю важные данные о вашем приложении. В этом случае для APP_ENV
следует задать значение production
.
Следующий файл .env
содержит настройки нашего приложения-примера для разработки:
Примечание. Переменная APP_KEY
содержит уникальный ключ, который был автоматически сгенерирован при установке Laravel с помощью Composer. Это значение изменять не нужно. Если вы хотите сгенерировать новый ключ безопасности, вы можете воспользоваться командой php artisan key:generate
.
APP_NAME=TravelList
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=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...
Измените переменные соответствующим образом. Завершив редактирование, сохраните и закройте файл для сохранения изменений. Если вы используете nano
, то можете выйти, введя CTRL+X
, а затем Y
и Enter
для подтверждения.
Теперь наше приложение Laravel настроено, но нам еще нужно настроить веб-сервер для доступа к нему через браузер. На следующем шаге мы настроим Nginx для обслуживания вашего приложения Laravel.
Мы установили Laravel в локальную папку в домашнем каталоге удаленного пользователя. Хотя это подходит для локальной среды разработки, это не рекомендуется для веб-серверов, доступных через интернет. Мы переместим папку приложения в /var/www
, где обычно хранятся веб-приложения, работающие на Nginx.
Используйте команду mv
для перемещения папки приложения со всем ее содержимым в каталог /var/www/travellist
:
- sudo mv ~/travellist /var/www/travellist
Далее нам нужно дать пользователю веб-сервера доступ к папкам storage
и cache
, где Laravel хранит сгенерированные приложением файлы:
- sudo chown -R www-data.www-data /var/www/travellist/storage
- sudo chown -R www-data.www-data /var/www/travellist/bootstrap/cache
Теперь файлы приложения упорядочены, но нам еще нужно настроить Nginx для обслуживания контента. Для этого мы создадим новый файл конфигурации виртуального хоста в каталоге /etc/nginx/sites-available
:
- sudo nano /etc/nginx/sites-available/travellist
Следующий файл конфигурации содержит рекомендуемые настройки для приложений Laravel, работающих на Nginx:
server {
listen 80;
server_name server_domain_or_IP;
root /var/www/travellist/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/php7.4-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/travellist
, и при необходимости измените выделенные значения для соответствия вашей конфигурации. Сохраните и закройте файл после завершения редактирования.
Чтобы активировать новый файл конфигурации виртуального хоста, создайте символическую ссылку на travellist
в sites-enabled
:
- sudo ln -s /etc/nginx/sites-available/travellist /etc/nginx/sites-enabled/
Примечание. Если вы ранее настраивали другой файл виртуального хоста для того же имени сервера server_name
, которое использовалось в виртуальном хосте travellist
, лучше отключите старую конфигурацию, удалив соответствующую ссылку из каталога /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 и таблица базы данных places
, содержащая образцы данных.
Теперь мы изменим главный маршрут приложения так, чтобы оно отправляло запрос в базу данных и выводило контент на экран приложения.
Откройте файл основного маршрута, 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
, который принимает путь и функцию обратного вызова в качестве аргументов.
Следующий код заменяет функцию обратного вызова основного маршрута. Она отправляет в базу данных 2 запроса, используя флаг visited
для фильтрации результатов. Результаты выводятся на экран travellist
, который мы создадим далее. Скопируйте следующий код в файл routes/web.php
, заменив его содержимое:
<?php
use Illuminate\Support\Facades\DB;
Route::get('/', function () {
$visited = DB::select('select * from places where visited = ?', [1]);
$togo = DB::select('select * from places where visited = ?', [0]);
return view('travellist', ['visited' => $visited, 'togo' => $togo ] );
});
Сохраните и закройте файл после завершения редактирования. Теперь мы создадим экран, где будет выполняться рендеринг вывода базы данных для пользователя. Создайте новый файл представления в каталоге resources/views
:
- nano resources/views/travellist.blade.php
Следующий шаблонг создает два списка мест на базе переменных visited
и togo
. Скопируйте следующий код в новый файл представления:
<html>
<head>
<title>Travel List</title>
</head>
<body>
<h1>My Travel Bucket List</h1>
<h2>Places I'd Like to Visit</h2>
<ul>
@foreach ($togo as $newplace)
<li>{{ $newplace->name }}</li>
@endforeach
</ul>
<h2>Places I've Already Been To</h2>
<ul>
@foreach ($visited as $place)
<li>{{ $place->name }}</li>
@endforeach
</ul>
</body>
</html>
Сохраните и закройте файл после завершения. Откройте браузер и перезагрузите приложение. Страница будет выглядеть следующим образом:
Теперь у вас имеется работающее приложение Laravel, извлекающее содержимое из базы данных MySQL.
В этом обучающем модуле мы настроили новое приложение Laravel поверх комплекта LEMP (Linux, Nginx, MySQL и PHP) на сервере Ubuntu 20.04. Также мы настроили маршрут по умолчанию для запроса базы данных и вывели результаты в отдельном представлении.
Теперь вы можете создавать новые маршруты и представления для любых дополнительных страниц, которые потребуются вашему приложению. Ознакомьтесь с официальной документацией Laravel, чтобы найти дополнительную информацию о маршрутах, представлениях и поддержке баз данных. Если вы развертываете приложение в производственной среде, ознакомьтесь также с разделом оптимизации, чтобы узнать о различных возможностях повышения производительности вашего приложения.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!