Tutorial

Процедура установки и настройки Laravel с помощьтю Nginx на сервере Ubuntu 20.04

NginxUbuntuPHPPHP FrameworksLEMPUbuntu 20.04

Введение

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

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

Предварительные требования

Для прохождения этого обучающего модуля необходимо предварительно выполнить на сервере Ubuntu 20.04 следующие задачи:

Шаг 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, мы создадим приложение 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

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

Шаг 3 — Создание нового приложения Laravel

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

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

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

  • cd ~

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

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

Вы увидите примерно следующий вывод:

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

После завершения установки откройте каталог приложения и запустите команду Laravel artisan для проверки успешной установки всех компонентов:

  • cd travellist
  • php artisan

Вывод будет выглядеть следующим образом:

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

Шаг 4 — Настройка 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.

/var/www/travellist/.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

...

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

Теперь наше приложение Laravel настроено, но нам еще нужно настроить веб-сервер для доступа к нему через браузер. На следующем шаге мы настроим Nginx для обслуживания вашего приложения 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:

/etc/nginx/sites-available/travellist
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

Результат должен выглядеть следующим образом:

Output
  • 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. Теперь вы можете начать создание собственного приложения на основе созданной базовой структуры.

На следующем шаге мы изменим основной маршрут приложения для запроса базы данных через фасад Laravel DB.

Шаг 6 — Настройка главной страницы

Если вы выполнили все вышеперечисленные шаги, у вас должно быть работающее приложение Laravel и таблица базы данных places, содержащая образцы данных.

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

Откройте файл основного маршрута, routes/web.php:

  • nano routes/web.php

По умолчанию этот файл имеет следующее содержание:

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, заменив его содержимое:

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. Скопируйте следующий код в новый файл представления:

resources/views/travellist/blade.php
<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

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

Заключение

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

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

0 Comments

Creative Commons License