Установка и настройка Laravel на стеке LEMP в Ubuntu 18.04

Laravel – это PHP-фреймворк с открытым исходным кодом, который предоставляет набор инструментов и ресурсов для создания современных PHP-приложений. Благодаря широкой экосистеме, использующей встроенные функции, популярность Laravel за последние несколько лет быстро выросла, и многие разработчики приняли ее за основу для упрощенного процесса разработки.

В этом мануале вы научитесь устанавливать и настраивать новое приложение Laravel на сервер Ubuntu 18.04, используя Composer для загрузки и управления зависимостями платформы. В результате у вас будет рабочий образец приложения Laravel, которое извлекает контент из базы данных MySQL.

Требования

  • Сервер Ubuntu 18.04 с пользователем sudo и брандмауэром ufw. Все инструкции можно найти здесь.
  • Стек LEMP, установить который можно по этому мануалу.
  • Установка Composer (читайте этот мануал).

1: Установка модулей PHP

Прежде чем вы сможете установить 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, но сначала нужно создать базу данных для приложения.

2: Создание базы данных для приложения

Чтобы продемонстрировать базовую установку и использование Laravel, мы создадим простое тестовое  приложение со списком: оно будет показывать список мест, в которые пользователь хотел бы отправиться, и список мест, которые он уже посетил. Эти данные можно сохранить в простой таблице places. Поле для хранения названий стран или городов мы назовем name. Второе поле, которое будет отмечать места как посещенные или не посещенные, будет называться visited. Кроме того, мы добавим поле id для уникального идентификатора каждой записи.

Чтобы подключиться к базе данных из приложения Laravel, мы создадим выделенного пользователя MySQL и предоставим ему полные права доступа к БД travel_list.

Чтобы начать работу, войдите в консоль MySQL как пользователь root:

sudo mysql

Чтобы создать новую базу данных, выполните следующую команду из консоли MySQL:

CREATE DATABASE travel_list;

Теперь вы можете создать нового пользователя и предоставить ему полные права доступа к базе данных, которую вы только что создали. В этом примере мы назовем пользователя travel_user и присвоим ему пароль password (не рекомендуем использовать такой простой пароль в настоящем приложении):

GRANT ALL ON travel_list.* TO 'travel_user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

Теперь у пользователя travel_user есть полные права доступа к базе данных travel_list, но при этом он не может создавать или изменять другие базы данных на вашем сервере.

После этого выйдите из оболочки MySQL:

exit

Теперь вы можете проверить, есть ли у нового пользователя соответствующие привилегии. Для этого снова войдите в консоль MySQL, указав учетные данные нового пользователя:

mysql -u travel_user -p

Обратите внимание на флаг -p в этой команде, который попросит вас ввести пароль, использованный при создании пользователя travel_user. После входа в консоль MySQL убедитесь, что у вас есть доступ к базе данных travel_list:

SHOW DATABASES;

Команда покажет следующий результат:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| travel_list        |
+--------------------+
2 rows in set (0.01 sec)

Теперь создайте таблицу places в базе данных travel_list. Из консоли MySQL запустите команду:

CREATE TABLE travel_list.places (
id INT AUTO_INCREMENT,
name VARCHAR(255),
visited BOOLEAN,
PRIMARY KEY(id)
);

Затем заполните таблицу places какими-нибудь данными:

INSERT INTO travel_list.places (name, visited)
VALUES ("Tokyo", false),
("Budapest", true),
("Nairobi", false),
("Berlin", true),
("Lisbon", true),
("Denver", false),
("Moscow", false),
("Oslo", false),
("Rio", true),
("Cincinati", false),
("Helsinki", false);

Убедитесь, что данные успешно сохранены в таблице:

SELECT * FROM travel_list.places;

Вы получите такой результат:

+----+-----------+---------+
| 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 | Cincinati |       0 |
| 11 | Helsinki  |       0 |
+----+-----------+---------+
11 rows in set (0.00 sec)

Убедившись, что у вас есть валидные данные, с которыми можно работать, закройте консоль MySQL:

exit

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

3: Создание приложения Laravel

Давайте создадим новое приложение Laravel с помощью команды composer create-project. Эта команда Composer обычно используется для начальной загрузки новых приложений на основе существующих платформ и систем управления контентом.

В этом мануале в качестве тестового приложения мы будем использовать travel_list, но вы можете изменить его другим. Приложение travel_list отобразит список мест, извлеченных с локального сервера MySQL: так вы увидите базовую конфигурацию Laravel и убедитесь, что можете подключиться к базе данных.

Сначала перейдите в домашний каталог вашего пользователя:

cd ~

Следующая команда на основе стандартных настроек создаст новый каталог travel_list, содержащий базовое приложение Laravel:

composer create-project --prefer-dist laravel/laravel travel_list

Вы увидите примерно такой вывод:

Installing laravel/laravel (v5.8.17)
- Installing laravel/laravel (v5.8.17): Downloading (100%)
Created project in travel_list
> @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%)
...

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

cd travel_list
php artisan

Вы увидите следующий вывод:

Laravel Framework 5.8.29
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 работают должным образом. Однако нам еще нужно настроить приложение на взаимодействие с БД и внести пару других поправок.

4: Настройка Laravel

Конфигурационные файлы Laravel находятся в каталоге config, внутри корневого каталога приложения. Кроме того, при установке Laravel через Composer он создает файл среды .env . Этот файл содержит специфичные параметры для текущей среды, в которой запущено приложение, и они имеют приоритет над значениями, установленными в обычных конфигурационных файлах в каталоге config. Каждой новой среде требуется отдельный файл .env для определения таких настроек, как параметры подключения к базе данных, параметры отладки, URL-адрес приложения и другие элементы (что могут различаться в зависимости от среды, в которой выполняется приложение).

Важно: Конфигурационный файл среды содержит конфиденциальную информацию о вашем сервере, включая учетные данные БД и ключи безопасности. По этой причине этот файл ни в коем случае нельзя выкладывать в публичный доступ.

Теперь мы отредактируем файл .env, чтобы настроить параметры текущей среды приложения.

Откройте файл .env в редакторе.

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_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=travel_list
DB_USERNAME=travel_user
DB_PASSWORD=password
...

Примечание: Переменная APP_KEY содержит уникальный ключ, который был автоматически сгенерирован при установке Laravel через Composer. Вам не нужно менять это значение. Если вы хотите сгенерировать новый безопасный ключ, вы можете использовать команду php artisan key:generate.

Настройте свои переменные так, как этого требует ваша стреда. Когда вы закончите редактирование, сохраните и закройте файл. Если вы используете nano, вы можете сделать это с помощью сочетания клавиш CTRL + X, затем Y и Enter.

Теперь приложение Laravel настроено, но нам еще нужно настроить веб-сервер, чтобы иметь доступ к приложению из браузера. Давайте настроим Nginx для обслуживания вашего приложения Laravel.

5: Настройка Nginx

Мы установили Laravel в локальную папку домашнего каталога вашего удаленного пользователя. Это подходит для локальных сред разработки, но не для веб-серверов с публичным доступом в интернете. Давайте переместим папку приложения в /var/www, где обычно хранятся файлы веб-приложений, работающих на Nginx.

Сначала с помощью команды mv переместите папку приложения со всем ее содержимым в /var/www/travel_list:

sudo mv ~/travel_list /var/www/travel_list

Теперь нам нужно предоставить пользователю веб-сервера право на запись в папках storage и cache, где Laravel хранит файлы, сгенерированные приложением:

sudo chown -R www-data.www-data /var/www/travel_list/storage
sudo chown -R www-data.www-data /var/www/travel_list/bootstrap/cache

Файлы приложений находятся в правильном месте. Теперь нужно настроить Nginx для обслуживания контента. Для этого давайте создадим новый файл для виртуального хоста в /etc/nginx/sites-available:

sudo nano /etc/nginx/sites-available/travel_list

Следующий конфигурационный файл содержит рекомендуемые настройки для приложений Laravel на Nginx:

server {
listen 80;
server_name server_domain_or_IP;
root /var/www/travel_list/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.2-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/travel_list и, при необходимости, отредактируйте значения server_name и root, чтобы они соответствовали вашей среде. Сохраните и закройте файл, когда вы закончите редактирование.

Чтобы активировать новый файл виртуального хоста, создайте симлинк на travel_list в sites-enabled:

sudo ln -s /etc/nginx/sites-available/travel_list /etc/nginx/sites-enabled/

Примечание: Если у вас есть другой файл виртуального хоста, который вы настроили ранее для того же server_name, которое использовалось в виртуальном хосте travel_list, вам нужно деактивировать старую конфигурацию, удалив соответствующий симлинк из /etc/nginx/sites-enabled/.

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

sudo nginx -t

Вы должны увидеть примерно такой результат:

nginx: 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

Вы увидите стандартную страницу Laravel.

Это подтверждает, что сервер Nginx правильно настроен и может обслуживать Laravel. Теперь вы можете приступить к созданию уникального приложения поверх этого «скелета» по умолчанию.

Далее мы покажем, как изменить основной маршрут приложения, чтобы запрашивать данные в БД, используя интерфейс DB в Laravel.

6: Пользовательская настройка главной страницы

Если вы выполнили все разделы в этом руководстве, у вас должно быть рабочее приложение 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 для фильтрации результатов. Затем он возвращает результаты в представление travel_list (которое мы скоро создадим). Скопируйте этот код в файл 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('travel_list', ['visited' => $visited, 'togo' => $togo ] );
});

Сохраните и закройте файл, когда закончите редактирование. Теперь давайте создадим представление, которое будет отображать результаты из БД пользователю. Создайте новый файл представления в resources/views:

nano resources/views/travel_list.blade.php

Следующий шаблон создает два списка мест, основанных на переменных visited and 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>

Сохраните и закройте файл. Теперь зайдите в браузер и перезагрузите приложение. На экране вы увидите список My Travel Bucket List, который состоит из двух разделов: Places I’d Like to Visit и Places I’ve Already Been To

Теперь у вас есть простое рабочее приложение Laravel, извлекающее данные из MySQL.

Заключение

В этом мануале вы научились создавать простые приложения Laravel на основе стека LEMP (Linux, Nginx, MySQL и PHP) на сервере Ubuntu 18.04. Вы также настроили приложение для запроса данных из БД и отображения результатов в пользовательском представлении.

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

Для повышения безопасности следует также рассмотреть возможность установки сертификата TLS/SSL, чтобы веб-сервре мог обслуживать контент через HTTPS. Для этого вы можете следовать нашему мануалу Создание сертификата Let’s Encrypt для Nginx в Ubuntu 18.04.

Tags: , , , , ,

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