Установка и настройка Laravel на Nginx в Ubuntu 20.04

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

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

Требования

  • Сервер Ubuntu 20.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 и предоставим ему полные права доступа к БД travellist.

На момент написания этого мануала нативная PHP-библиотека MySQL mysqlnd не поддерживает caching_sha2_authentication, метод аутентификации MySQL 8 по умолчанию. Потому пользователь нашей базы данных должен быть настроен на поддержку аутентификации mysql_native_password, чтобы иметь возможность подключаться к БД MySQL из PHP.

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

sudo mysql

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

CREATE DATABASE travellist;

Теперь вы можете создать нового пользователя и предоставить ему полные права доступа к новой БД. В этом примере мы назовем пользователя travellist_user и присвоим ему пароль password (не рекомендуем использовать такой простой пароль в настоящем приложении):

CREATE USER 'travellist_user'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

Теперь нужно передать пользователю travellist_user права доступа к базе данных travellist:

GRANT ALL ON travellist.* TO 'travellist_user'@'%';

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

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

exit

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

mysql -u travellist_user -p

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

SHOW DATABASES;

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

+--------------------+
| 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;

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

+----+-----------+---------+
| 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

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

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

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

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

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

cd ~

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

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

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

Installing 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%)
...

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

cd travellist
php artisan

Вы увидите такой вывод:

Laravel Framework 5.8.29
Usage:
Laravel Framework 7.11.0
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=travellist
DB_USERNAME=travellist_user
DB_PASSWORD=password
...

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

php artisan key:generate

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

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

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

Мы установили 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 и, при необходимости, отредактируйте значения server_name и root, чтобы они соответствовали вашей среде. Сохраните и закройте файл, когда вы закончите работу.

Чтобы активировать новый файл виртуального хоста, создайте симлинк на 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

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

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 для фильтрации результатов. Затем он возвращает результаты в представление 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 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). Вы также настроили приложение для запроса данных из БД и отображения результатов в пользовательском представлении.

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

Tags: , , , , , ,