# Запуск Laravel на Ubuntu

Laravel — фреймворк для PHP с большим набором инструментов и возможностей.

В этой инструкции мы установим Laravel на VPS с Ubuntu 20.04. Устанавливать Laravel будем при помощи Composer — утилиты для установки зависимостей для PHP — на подготовленный к работе сервер с предустановленным программным стеком LEMP.

# Установка Composer

Composer — популярный инструмент для работы с зависимостями PHP. Composer проверяет списки зависимостей проектов и устанавливает необходимые, если они указаны, но не установлены.

Перед началом установки обновим список пакетов apt и установим необходимые инструменты:

sudo apt update
sudo apt install php-cli unzip

После окончания установки скачаем установщик Composer из официального источника и поместим его в папку для временных файлов:

curl -sS https://getcomposer.org/installer -o /tmp/composer-setup.php

После скачивания запустим установку:

sudo php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer

Здесь мы указали, что после установки Composer будет доступен для использования всем пользователям на этом сервере.

Когда установка завершится, мы сможем проверить правильность установки Composer командой composer, в ответ на которую в консоли должно появиться приветствие:

composer

# Output
   ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.3.5 2022-04-13 16:43:00

Usage:
  command [options] [arguments]

Если вы видите такое сообщение на экране, то Composer установлен и готов к работе.

# Дополнительные модули PHP

Установим несколько дополнительных модулей PHP, которые потребуются для работы Laravel:

sudo apt install php-mbstring php-xml php-bcmath

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

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

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

Создадим отдельного пользователя, чтобы подключаться к базе из приложения. Зайдём в MySQL и создадим новую базу данных для нашего приложения:

sudo mysql
mysql> CREATE DATABASE booklist

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

mysql> CREATE USER 'reader'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> GRANT ALL ON booklist.* TO 'reader'@'%';

Чтобы проверить правильность наших операций, выйдем из MySQL и зайдём уже от имени нового пользователя:

mysql> exit
mysql -u reader -p

MySQL попросит указать пароль пользователя и после этого откроет доступ. Теперь проверим список доступных баз данных:

SHOW DATABASES;

# Output

+--------------------+
| Database           |
+--------------------+
| booklist           |
| information_schema |
+--------------------+
2 rows in set (0.00 sec)

Здесь мы видим созданную по умолчанию базу и нашу только что созданную booklist.

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

CREATE TABLE booklist.names (
  id INT AUTO_INCREMENT,
  name VARCHAR(255),
  read BOOLEAN,
  PRIMARY KEY(id)
);

Теперь заполним нашу таблицу данными:

INSERT INTO booklist.names (name, mark) 
VALUES ("Transmetropolitain. 4", false),
("V For Vendetta", true),
("Dance, dance, dance", true),
("Doors Of Stone", false),
("Sandman.9", true),
("Neuromancer", true),
("How To Administrate On Linux", false),
("Python And Other Snakes", false),
("Imitation", false),
("StreetArt For Beginners", false);

# Output
Query OK, 10 rows affected (0.04 sec)
Records: 10  Duplicates: 0  Warnings: 0

После этого можно проверить, что таблица заполнилась правильно:

SELECT * FROM bookllist.names;

# Output

+----+------------------------------+------+
| id | name                         | mark |
+----+------------------------------+------+
|  1 | Transmetropolitain. 4        |    0 |
|  2 | V For Vendetta               |    1 |
|  3 | Dance, dance, dance          |    1 |
|  4 | Doors Of Stone               |    0 |
|  5 | Sandman.9                    |    1 |
|  6 | Neuromancer                  |    1 |
|  7 | How To Administrate On Linux |    0 |
|  8 | Python And Other Snakes      |    0 |
|  9 | Imitation                    |    0 |
| 10 | StreetArt For Beginners      |    0 |
+----+------------------------------+------+
10 rows in set (0.00 sec)

Как видим, все данные собрались в таблицу и правильно отмечены. Можно переходить к созданию приложения.

# Создание Laravel-приложения

Создавать приложение будем при помощи Composer — укажем в основной команде, что нам необходим Laravel:

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

# Output
Creating a "laravel/laravel" project at "./booklist"
Installing laravel/laravel (v8.6.12)
  - Installing laravel/laravel (v8.6.12): Extracting archive
…
Publishing complete.
> @php artisan key:generate --ansi
Application key set successfully.

Теперь перейдём в директорию нашего приложения и проверим правильность установки всех компонентов:

cd booklist
php artisan

# Output

Laravel Framework 8.83.9

Usage:
  command [options] [arguments]
…
 stub
  stub:publish           Publish all stubs that are available for customization
 vendor
  vendor:publish         Publish any publishable assets from vendor packages
 view
  view:cache             Compile all of the application's Blade templates
  view:clear             Clear all compiled view files

Здесь в выдаче указана информация об установленных пакетах и их статусе. В данном случае всё установилось без ошибок. Можно переходить к настройке Laravel.

# Настройка Laravel

Основные настройки Laravel хранятся в папке config, но при установке Laravel с помощью Composer создаётся отдельный файл .env, в котором хранятся переменные среды. Именно этот файл мы и будем редактировать:

vim .env

Этот файл содержит большое количество переменных, отвечающих за работу приложения. Нам будет нужно проконтролировать значения только некоторых из них:

APP_NAME=booklist
APP_ENV=local
APP_KEY=key_number
APP_DEBUG=true
APP_URL=http://domain_name

LOG_CHANNEL=stack
LOG_DEPRECATIONS_CHANNEL=null
LOG_LEVEL=debug

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=booklist
DB_USERNAME=reader
DB_PASSWORD=reader_password
…

Здесь мы указываем имя приложения, локальную среду, ведение логов приложения и URL, по которому будет доступно приложение. В строке APP_KEY= указывается уникальный цифровой идентификатор, который генерируется при создании Laravel при помощи Composer.

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

После сохранения файла можно переходить к настройке Nginx.

# Настройка веб-сервера

Переместим всю директорию с нашим приложением в папку var/www:

sudo mv ~/booklist /var/www/booklist

Теперь передадим веб-серверу права на папки, в которых хранятся файлы приложения и кэш:

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

После этого можно переходить к созданию виртуального хоста для нашего приложения. Для этого в папке sites-available создадим новый файл, отвечающий за работу нашего приложения:

sudo vim /etc/nginx/sites-available/booklist

Содержимое этого файла должно быть следующим:

server {
    listen 80;
    server_name domain_name;
    root /var/www/booklist/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;
    }
}

После сохранения файла добавим его в sites-enabled:

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

Запустим проверку конфигурации веб-сервера, чтобы убедиться в отсутствии синтаксических ошибок:

nginx -t

# Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Теперь осталось только перезагрузить веб-сервер:

sudo systemctl reload nginx

Теперь, если мы зайдём в браузер по адресу сервера, то увидим стартовую страницу Laravel:

«laravel_start»

# Настройка главной страницы

Когда приложение запущено и работает, можно настроить главную страницу, чтобы с неё отправлялся запрос к базе данных, и на экран выводились сведения, указанные в базе.

Сначала настроим php-файл, который будет отправлять запрос к базе и забирать из неё данные. Для этого перейдём в папку с приложением. В папке routes есть файл web.php, который отвечает за содержание главной страницы. Его мы и будем исправлять:

vim routes/web.php

В открывшемся файле вместо базового шаблона, который там содержится, нужно указать следующий код:

<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
  $read = DB::select('select * from names where mark = ?', [1]);
  $toread = DB::select('select * from names where mark = ?', [0]);

  return view('booklist', ['read' => $read, 'toread' => $toread ] );
});

Здесь мы описываем два запроса к базе данных и фильтруем полученные результаты по отметке «прочитано/не прочитано». После этого полученные данные мы будем передавать в HTML-файл, который сейчас создадим:

vim resources/views/booklist.blade.php
<html>
<head>
        <title>Book List</title>
</head>

<body>
        <h1>My List Of Books To Read</h1>
        <h2>Books I Wanted to Read</h2>
        <ul>
          @foreach ($toread as $newbook)
                <li>{{ $newbook->name }}</li>
          @endforeach
        </ul>

        <h2>Books I've Already Read</h2>
        <ul>
          @foreach ($read as $aread)
                <li>{{ $aread->name }}</li>
          @endforeach
        </ul>
</body>
</html>

После этого можно переходить в браузер и проверять адрес сервера. Здесь мы должны увидеть 2 списка книг:

«laravel_list»

Мы изложили основные приёмы работы с Laravel на VPS с программным стеком LEMP. Теперь вы можете приступать к самостоятельной разработке приложений.