Поиск по сайту:

Как развернуть приложение Laravel с помощью Nginx в Ubuntu 16.04


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

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

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

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 16.04, настроенный с помощью этого руководства по начальной настройке сервера, включая пользователя без полномочий root и брандмауэр.
  • Стек LEMP, установленный в соответствии с руководством по Linux, Nginx, MySQL, PHP (стек LEMP) в Ubuntu 16.04.
  • Доменное имя, указывающее на ваш сервер, как описано в разделе «Как настроить имя хоста с помощью DigitalOcean». В этом руководстве везде будет использоваться example.com. Это необходимо для получения SSL-сертификата для вашего веб-сайта, чтобы вы могли безопасно обслуживать свое приложение с помощью шифрования TLS.

Шаг 1 — Установка зависимостей пакетов

Для запуска приложений Laravel вам понадобятся некоторые расширения PHP и менеджер зависимостей PHP под названием Composer в дополнение к базовому стеку LEMP.

Начните с обновления кеша менеджера пакетов.

  1. sudo apt-get update

Вам понадобятся расширения PHP для поддержки многобайтовых строк и поддержки XML. Вы можете установить эти расширения, Composer и unzip (что позволяет Composer обрабатывать zip-файлы) одновременно.

  1. sudo apt-get install php7.0-mbstring php7.0-xml composer unzip

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

Шаг 2 — Настройка MySQL

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

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

Войдите в административную учетную запись MySQL root.

  1. mysql -u root -p

Вам будет предложено ввести пароль, который вы установили для корневой учетной записи MySQL во время установки.

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

  1. CREATE DATABASE laravel DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

  1. GRANT ALL ON laravel.* TO 'laraveluser'@'localhost' IDENTIFIED BY 'password';

Сбросьте привилегии, чтобы уведомить сервер MySQL об изменениях.

  1. FLUSH PRIVILEGES;

И выйти из MySQL.

  1. EXIT;

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

Шаг 3 — Настройка демонстрационного приложения

Демонстрационное приложение quickstart, распространяемое Laravel на GitHub, представляет собой простой список задач. Он позволяет добавлять и удалять элементы списка дел и сохраняет свои задачи в базе данных MySQL.

Сначала создайте каталог в корневом каталоге Nginx, в котором будет храниться приложение. Поскольку демонстрационное приложение называется quickstart, давайте использовать /var/www/html/quickstart.

  1. sudo mkdir -p /var/www/html/quickstart

Затем измените владельца вновь созданного каталога на своего пользователя, чтобы вы могли работать с файлами внутри без использования sudo.

  1. sudo chown sammy:sammy /var/www/html/quickstart

Перейдите в новый каталог и клонируйте демонстрационное приложение с помощью Git.

  1. cd /var/www/html/quickstart
  2. git clone https://github.com/laravel/quickstart-basic .

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

Git output
Cloning into '.'... remote: Counting objects: 263, done. remote: Total 263 (delta 0), reused 0 (delta 0), pack-reused 263 Receiving objects: 100% (263/263), 92.75 KiB | 0 bytes/s, done. Resolving deltas: 100% (72/72), done. Checking connectivity... done.

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

  1. composer install

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

Composer output
Loading composer repositories with package information Installing dependencies (including require-dev) from lock file . . . Generating autoload files > php artisan clear-compiled > php artisan optimize Generating optimized class loader

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

Шаг 4 — Настройка среды приложения

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

Откройте файл конфигурации среды Laravel с помощью nano или вашего любимого текстового редактора.

  1. sudo nano /var/www/html/quickstart/.env

Вам нужно будет внести следующие изменения в файл. Обязательно обновите переменные-заполнители, такие как password и example.com, с соответствующими значениями.

APP_ENV=production
APP_DEBUG=false
APP_KEY=b809vCwvtawRbsG0BmP1tWgnlXQypSKf
APP_URL=http://example.com

DB_HOST=127.0.0.1
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=password

. . .

Сохраните файл и выйдите.

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

В разделе настройки приложения:

  • Переменная APP_ENV обозначает системную среду, в которой запускается приложение. Значение по умолчанию — local, которое используется для локальных сред разработки. Для производственного развертывания его следует изменить на production, как мы сделали здесь. Изменение этой переменной управляет детализацией журнала, настройками кэширования и способом отображения ошибок (в зависимости от приложения). Настройки local упрощают разработку и отладку, что удобно при работе с приложением, но не следует использовать в рабочей среде.
  • Переменная APP_DEBUG дополняет APP_ENV и явно включает или отключает отладочную информацию и подробное отображение ошибок. В производственных установках для этого значения должно быть установлено значение false, чтобы отладочная информация не отображалась пользователям.
  • Переменная APP_URL указывает IP-адрес или доменное имя, под которым сайт должен быть доступен. Здесь мы использовали доменное имя example.com, но вы должны заменить его своим собственным доменом, с которого будет осуществляться доступ к веб-сайту.

Раздел конфигурации базы данных немного проще:

  • DB_DATABASE – это имя базы данных.
  • DB_USERNAME – это имя пользователя MySQL, которое должно использовать приложение.
  • DB_PASSWORD — пароль к базе данных для этого пользователя.

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

  1. php artisan migrate

Artisan попросит подтвердить, собираемся ли мы запускать его в рабочем режиме. Ответьте y на вопрос. После этого он будет запускать необходимые задачи базы данных.

Artisan output
************************************** * Application In Production! * ************************************** Do you really wish to run this command? [y/N] (yes/no) [no]: > y Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2015_10_27_141258_create_tasks_table

Теперь у нас полностью установлен и настроен Laravel. Далее нам нужно настроить Nginx для обслуживания приложения.

Шаг 5 — Настройка Nginx

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

Давайте изменим групповое владение каталогами storage и bootstrap/cache на www-data.

  1. sudo chgrp -R www-data storage bootstrap/cache

Затем рекурсивно предоставьте группе все разрешения, включая запись и выполнение.

  1. sudo chmod -R ug+rwx storage bootstrap/cache

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

  1. sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Откройте только что созданный файл конфигурации.

  1. sudo nano /etc/nginx/sites-available/example.com

Вам нужно будет внести несколько необходимых изменений:

  • Удаление обозначения default_server из директив listen,
  • Обновление корня веб-сайта путем изменения директивы root,
  • Обновление директивы server_name, чтобы она правильно указывала на доменное имя сервера,
  • Обновление обработки URI запроса путем изменения директивы try_files.

Измененный файл конфигурации Nginx будет выглядеть так:

server {
    listen 80;
    listen [::]:80;
    
    . . .

    root /var/www/html/quickstart/public;
    index index.php index.html index.htm index.nginx-debian.html;

    server_name example.com www.example.com;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    . . .
}

Поясним эти изменения более подробно.

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

Директива root указывает, где хранятся файлы приложения. Приложение Laravel хранится в /var/www/html/quickstart, но только подкаталог /public должен быть доступен в Интернете; все остальные файлы приложения вообще не должны быть доступны через браузер. Чтобы соответствовать этим передовым методам, мы устанавливаем корневой каталог веб-сайта /var/www/html/quickstart/public.

Директива server_name указывает список доменных имен, на которые будет отвечать блок сервера. Здесь мы использовали example.com и www.example.com, но вы должны заменить их именем домена. вы хотите использовать для своего веб-сайта.

Мы также изменили обработку URI запроса. Настройки по умолчанию говорят веб-серверу найти существующий файл, затем существующий каталог или, наконец, выдать ошибку 404 Not Found (используя встроенную настройку =404). Чтобы Laravel работал правильно, все запросы должны направляться в сам Laravel. Это означает, что мы удаляем обработчик ошибок 404 Nginx по умолчанию и устанавливаем его на /index.php?$query_string, который передает запрос в файл index.php, основное приложение Laravel. файл.

Когда вы внесли вышеуказанные изменения, вы можете сохранить и закрыть файл. Мы должны включить новый файл конфигурации, создав символическую ссылку из этого файла на каталог sites-enabled.

  1. sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/

И, наконец, перезагрузите Nginx, чтобы учесть изменения.

  1. sudo systemctl reload nginx

Теперь, когда Nginx настроен для обслуживания демонстрационного приложения Laravel, все компоненты настроены.

Убедиться, что ваше развертывание работает на этом этапе, несложно. Просто зайдите на http://example.com в своем любимом браузере. Вы увидите страницу с простым приложением задач, и вы можете попробовать добавить или удалить задачи. Все внесенные вами изменения будут сохранены в базе данных и сохранены для последующих посещений веб-сайта, в чем вы можете убедиться, закрыв браузер и снова открыв сайт.

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

Шаг 6 — Защита вашего приложения с помощью TLS

Для завершения производственной настройки рекомендуется обслуживать приложение через безопасный HTTPS с использованием TLS. Это гарантирует, что вся связь между приложением и его посетителями будет зашифрована, что особенно важно, если приложение запрашивает конфиденциальную информацию, такую как логин или пароль.

Как защитить Nginx с помощью Let’s Encrypt в учебнике Ubuntu 16.04 с некоторыми небольшими изменениями, чтобы приспособиться к настройке этого конкретного приложения Laravel.

Единственными изменениями будут:

  • Использование местоположения приложения Laravel (/var/www/html/quickstart) вместо корневого веб-сайта по умолчанию (/var/www/html) при запросе SSL-сертификата.
  • Изменение файла конфигурации /etc/nginx/sites-available/example.com вместо файла блока сервера по умолчанию.

В частности, команда для получения сертификата будет следующей:

  1. sudo certbot certonly --webroot --webroot-path=/var/www/html/quickstart -d example.com -d www.example.com

И окончательная версия конфигурационного файла /etc/nginx/sites-available/example.com будет выглядеть так

server {
        listen 80;
        listen [::]:80;

        server_name example.com www.example.com;
        return 301 https://$server_name$request_uri;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        include snippets/ssl-example.com.conf;
        include snippets/ssl-params.conf;

        root /var/www/html/quickstart/public;

        index index.php index.html index.htm index.nginx-debian.html;

        server_name example.com www.example.com;

        location / {
                try_files $uri $uri/ /index.php?$query_string;
        }

        location ~ \.php$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        location ~ /\.ht {
                deny all;
        }

        location ~ /.well-known {
                allow all;
        }
}

Убедитесь, что в конфигурации нет синтаксических ошибок.

  1. 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, чтобы изменения вступили в силу.

  1. sudo systemctl restart nginx

Сертификат Let’s Encrypt TLS/SSL будет полностью установлен, и приложение будет доступно через безопасное соединение. Чтобы убедиться, что все работает должным образом, просто посетите https://example.com. Вы должны увидеть ту же форму заявки, что и раньше, но на этот раз соединение будет полностью защищено.

Заключение

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