14 lip

Laravel na Ubuntu 20: instalacja i konfiguracja framework

laravel-nginx-ubuntu-20

Laravel to otwartoźródłowy framework PHP, który zapewnia zestaw narzędzi i zasobów do tworzenia nowoczesnych aplikacji PHP. Dzięki kompletnemu ekosystemowi wykorzystującemu jego wbudowane funkcje, popularność Laravela gwałtownie wzrosła w ciągu ostatnich kilku lat, a wielu programistów stosuje go z wyboru dla usprawnionego procesu rozwoju.

W tym artykule zainstalujesz i skonfigurujesz nową aplikację Laravel na serwerze Ubuntu 20.04, używając Composer do pobierania zależnych pakietów i zarządzania nimi oraz Nginx do obsługi aplikacji. Po zakończeniu będziesz mieć funkcjonalną aplikację demonstracyjną Laravel, która pobierze zawartość z bazy danych MySQL 8.

Ranking CMS do bloga, wśród których jest również OctoberCMS oparty o Laravel.

Aby wykonać ten przewodnik, musisz najpierw wykonać następujące zadania na serwerze Ubuntu 20.04:

Instalowanie wymaganych modułów PHP

Zanim będziesz mógł zainstalować Laravela, musisz zainstalować kilka modułów PHP wymaganych przez framework. Użyjemy apt do zainstalowania modułów PHP: php-mbstring, php-xml i php-bcmath. Te rozszerzenia PHP zapewniają dodatkową obsługę kodowania znaków, XML i liczb dużej precyzji.

Jeśli używasz apt w tej sesji po raz pierwszy, najpierw uruchom polecenie update, aby zaktualizować pamięć podręczną menedżera pakietów:

sudo apt update

Teraz możesz zainstalować wymagane pakiety za pomocą:

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

Twój system jest teraz gotowy do przeprowadzenia instalacji Laravela za pomocą Composera, ale zanim to zrobisz, potrzebujesz bazy danych dla swojej aplikacji.

Tworzenie bazy danych dla aplikacji

Aby zademonstrować podstawową instalację i użytkowanie Laravela, utworzymy aplikację z listą miast, aby pokazać listę miejsc, do których użytkownik chciałby się udać, oraz listę miejsc, które już odwiedził. Można to zapisać w tabeli miejsc z polem lokalizacji, które nazwiemy “nazwa”, oraz innym polem oznaczającym je jako odwiedzone lub niezwiedzone, które nazwiemy odwiedzonymi. Dodatkowo dołączymy pole identyfikatora, aby jednoznacznie zidentyfikować każdy wpis.

Aby połączyć się z bazą danych z aplikacji Laravel, utworzymy dedykowanego użytkownika MySQL i przyznamy temu użytkownikowi pełne uprawnienia nad bazą danych podróżujących.

W chwili pisania tego tekstu natywna biblioteka PHP MySQL mysqlnd nie obsługuje caching_sha2_authentication, domyślnej metody uwierzytelniania dla MySQL 8. Będziemy musieli skonfigurować użytkownika bazy danych za pomocą metody uwierzytelniania mysql_native_password, aby móc połączyć się z bazą danych MySQL z PHP.

Aby rozpocząć, zaloguj się do konsoli MySQL jako użytkownik root bazy danych za pomocą:

sudo mysql

Aby utworzyć nową bazę danych, uruchom następującą komendę z konsoli MySQL:

CREATE DATABASE miasta;

Teraz możesz utworzyć nowego użytkownika i nadać mu pełne uprawnienia w utworzonej właśnie niestandardowej bazie danych. W tym przykładzie tworzymy użytkownika o nazwie “podroznik” z hasłem “haslo“, ale powinieneś zmienić je na wybrane przez siebie (bezpieczne):

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

Teraz musimy dać temu użytkownikowi uprawnienia do bazy danych miast:

GRANT ALL ON miasta.* TO 'podroznik'@'%';

Daje to użytkownikowi podroznik pełne uprawnienia nad bazą danych miasta, jednocześnie uniemożliwiając temu użytkownikowi tworzenie lub modyfikowanie innych baz danych na twoim serwerze.

Następnie zamknij powłokę MySQL:

exit

Możesz teraz przetestować, czy nowy użytkownik ma odpowiednie uprawnienia, logując się ponownie do konsoli MySQL, tym razem przy użyciu niestandardowych poświadczeń użytkownika:

mysql -u podroznik -p

Zwróć uwagę na flagę -p w tym poleceniu, która wyświetli monit o podanie hasła używanego podczas tworzenia użytkownika podroznik. Po zalogowaniu się do konsoli MySQL potwierdź, że masz dostęp do bazy danych miasta:

SHOW DATABASES;

Otrzymasz następujący rezultat:

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

Następnie utwórz tabelę nazwaną “miejsca” w bazie danych miasta. Z konsoli MySQL uruchom następującą instrukcję:

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

Teraz zapełnij tabelę miejsc przykładowymi danymi:

INSERT INTO miasta.miejsca (name, visited) 
VALUES ("Katowice", false),
("Krakow", true),
("Warszawa", false),
("Gdansk", true),
("Szczecin", true),
("Poznan", false),
("Wroclaw", false),
("Olsztyn", false),
("Lodz", true),
("Lublin", false),
("Rzeszow", false);

Aby potwierdzić, że dane zostały pomyślnie zapisane w tabeli, uruchom:

SELECT * FROM miasta.miejsca;

Zobaczysz rezultat podobny do poniższego:

+----+-----------+---------+
| id | name      | visited |
+----+-----------+---------+
|  1 | Katowice |       0 |
|  2 | Krakow   |       1 |
|  3 | Warszawa |       0 |
|  4 | Gdansk   |       1 |
|  5 | Szczecin |       1 |
|  6 | Poznan   |       0 |
|  7 | Wroclaw  |       0 |
|  8 | Olsztyn  |       0 |
|  9 | Lodz     |       1 |
| 10 | Lublin   |       0 |
| 11 | Rzeszow  |       0 |
+----+-----------+---------+
11 rows in set (0.00 sec)

Po potwierdzeniu, że masz poprawne dane w tabeli testowej, możesz wyjść z konsoli MySQL:

exit

Możesz teraz utworzyć aplikację i skonfigurować ją tak, aby łączyła się z nową bazą danych.

Tworzenie nowej aplikacji Laravel

Utworzysz teraz nową aplikację Laravel za pomocą polecenia composer create-project. Komenda ta jest zwykle używana do ładowania nowych aplikacji w oparciu o istniejące frameworki i systemy zarządzania treścią.

W tym przewodniku wykorzystamy miasta jako przykładową aplikację, ale możesz to zmienić na coś innego. Aplikacja wyświetli listę lokalizacji pobranych z lokalnego serwera MySQL, mającą na celu zademonstrowanie podstawowej konfiguracji Laravela i potwierdzenie, że możesz połączyć się z bazą danych.

Najpierw przejdź do katalogu domowego użytkownika:

cd ~

Następujące polecenie utworzy nowy katalog miasta zawierający bazową aplikację Laravel w oparciu o ustawienia domyślne:

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

Zobaczysz rezultat podobny do tego:

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

Po zakończeniu instalacji przejdź do katalogu aplikacji i uruchom polecenie artisan Laravela, aby sprawdzić, czy wszystkie komponenty zostały pomyślnie zainstalowane:

cd travellist
php artisan

Zobaczysz rezultat podobny do tego:

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

Ten wynik potwierdza, że pliki aplikacji są na miejscu, a narzędzia wiersza polecenia Laravel działają zgodnie z oczekiwaniami. Jednak nadal musimy skonfigurować aplikację, aby skonfigurować bazę danych i kilka innych szczegółów.

Konfigurowanie Laravela

Pliki konfiguracyjne Laravela znajdują się w katalogu o nazwie config, w katalogu głównym aplikacji. Ponadto po zainstalowaniu Laravela z Composerem tworzony jest plik środowiskowy. Ten plik zawiera ustawienia specyficzne dla bieżącego środowiska, w którym działa aplikacja, i będzie miał pierwszeństwo przed wartościami ustawionymi w zwykłych plikach konfiguracyjnych znajdujących się w katalogu config. Każda instalacja w nowym środowisku wymaga dostosowanego pliku środowiska, aby zdefiniować między innymi ustawienia połączenia z bazą danych, opcje debugowania, adres URL aplikacji i inne elementy, które mogą się różnić w zależności od środowiska, w którym działa aplikacja.

Ostrzeżenie: plik konfiguracyjny środowiska zawiera poufne informacje o serwerze, w tym poświadczenia bazy danych i klucze bezpieczeństwa. Z tego powodu nigdy nie należy udostępniać tego pliku publicznie.

Teraz dokonamy edycji pliku .env, aby dostosować opcje konfiguracji dla bieżącego środowiska aplikacji.

Otwórz plik .env za pomocą wybranego edytora wiersza poleceń. Tutaj użyjemy nano:

nano .env

Mimo że w tym pliku znajduje się wiele zmiennych konfiguracyjnych, nie musisz teraz konfigurować ich wszystkich. Poniższa lista zawiera przegląd zmiennych, które wymagają natychmiastowej uwagi:

  • APP_NAME: nazwa aplikacji, używana do powiadomień i wiadomości.
  • APP_ENV: bieżące środowisko aplikacji.
  • APP_KEY: Używany do generowania soli i skrótów, ten unikalny klucz jest tworzony automatycznie podczas instalacji Laravela przez Composer, więc nie musisz go zmieniać.
  • APP_DEBUG: Czy wyświetlać informacje debugowania po stronie klienta.
  • APP_URL: Podstawowy adres URL aplikacji, używany do generowania łączy aplikacji.
  • DB_DATABASE: nazwa bazy danych.
  • DB_USERNAME: nazwa użytkownika, aby połączyć się z bazą danych.
  • DB_PASSWORD: Hasło do połączenia z bazą danych.

Domyślnie te wartości są skonfigurowane dla lokalnego środowiska programistycznego korzystającego z Homestead, dostarczonego przez Laravela. Zmienimy te wartości, aby odzwierciedlały bieżące ustawienia środowiska naszej przykładowej aplikacji.

Jeśli instalujesz Laravel w środowisku programistycznym lub testowym, możesz pozostawić włączoną opcję APP_DEBUG, ponieważ da to ważne informacje debugowania podczas testowania aplikacji z przeglądarki. W tym przypadku zmienną APP_ENV należy ustawić na “development” lub “testing”.

Jeśli instalujesz Laravela w środowisku produkcyjnym, powinieneś wyłączyć opcję APP_DEBUG, ponieważ pokazuje ona użytkownikom końcowym poufne informacje o twojej aplikacji. APP_ENV w tym przypadku należy ustawić na “production“.

Poniższy plik .env konfiguruje naszą przykładową aplikację do programowania:

Uwaga: zmienna APP_KEY zawiera unikalny klucz, który został wygenerowany automatycznie podczas instalacji Laravela za pomocą Composera. Nie musisz zmieniać tej wartości. Jeśli chcesz wygenerować nowy bezpieczny klucz, możesz użyć polecenia php artisan key:generate.

APP_NAME=ListaMiast
APP_ENV=development
APP_KEY=KLUCZ_APLIKACJI_NIE_KOPIOWAC
APP_DEBUG=true
APP_URL=http://domena_lub_IP

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=miasta
DB_USERNAME=podroznik
DB_PASSWORD=password

...

Dostosuj odpowiednio swoje zmienne. Po zakończeniu edycji zapisz i zamknij plik, aby zachować zmiany. Jeśli używasz nano, możesz to zrobić za pomocą CTRL + X, a następnie Y i Enter, aby potwierdzić.

Twoja aplikacja Laravel jest już skonfigurowana, ale nadal musimy skonfigurować serwer WWW, aby uzyskać dostęp do niego z przeglądarki. W następnym kroku skonfigurujemy Nginx do obsługi aplikacji Laravel.

Konfiguracja Nginx

Zainstalowaliśmy Laravela w lokalnym folderze katalogu domowego zdalnego użytkownika i chociaż działa to dobrze w lokalnych środowiskach programistycznych, nie jest to zalecana praktyka dla serwerów internetowych, które są otwarte dla publicznego Internetu. Przeniesiemy folder aplikacji do katalogu /var/www, który jest zwykle lokalizacją aplikacji internetowych działających na Nginx.

Najpierw użyj komendy mv, aby przenieść folder aplikacji z całą zawartością do /var/www/miasta:

sudo mv ~/miasta /var/www/miasta

Teraz musimy dać użytkownikowi serwera dostęp do zapisu w folderach pamięci i pamięci podręcznej, w których Laravel przechowuje pliki generowane przez aplikację:

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

Pliki aplikacji są teraz w porządku, ale nadal musimy skonfigurować Nginx do obsługi zawartości. W tym celu utworzymy nowy plik konfiguracyjny hosta wirtualnego w /etc/nginx/sites-available:

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

Poniższy plik konfiguracyjny zawiera zalecane ustawienia aplikacji Laravel na Nginx:

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

Skopiuj tę zawartość do pliku /etc/nginx/sites-available/miasta i, jeśli to konieczne, dostosuj wyróżnione wartości, aby dostosować je do własnej konfiguracji. Zapisz i zamknij plik po zakończeniu edycji.

Aby aktywować nowy plik konfiguracyjny hosta wirtualnego, utwórz dowiązanie symboliczne do miasta w sites-enabled:

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

Uwaga: Jeśli masz inny plik hosta wirtualnego, który został wcześniej skonfigurowany dla tej samej nazwy serwera, który został użyty w hoście wirtualnym podróżnika, być może trzeba będzie dezaktywować starą konfigurację, usuwając odpowiednie łącze symboliczne w pliku /etc/nginx/sites-enabled/.

Aby potwierdzić, że konfiguracja nie zawiera żadnych błędów składniowych, możesz użyć polecenia:

sudo nginx -t

Otrzymasz rezultat podobny do tego:

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

Aby zastosować zmiany, załaduj ponownie Nginx za pomocą:

sudo systemctl reload nginx

Teraz przejdź do przeglądarki i uzyskaj dostęp do aplikacji przy użyciu nazwy domeny lub adresu IP serwera, zgodnie z definicją zawartą w dyrektywie server_name w pliku konfiguracyjnym:

http://domena_lub_IP

Zobaczysz stronę podobną do poniższej:

laravel[1]

Potwierdza to, że Twój serwer Nginx jest poprawnie skonfigurowany do obsługi Laravela. Od tego momentu możesz rozpocząć tworzenie aplikacji na szkielecie zapewnianym przez domyślną instalację.

W następnym kroku zmodyfikujemy główną ścieżkę aplikacji, aby wyszukiwać dane w bazie danych przy użyciu fasady DB Laravela.

Dostosowanie strony głównej

Zakładając, że do tej pory wykonałeś wszystkie czynności opisane w tym przewodniku, powinieneś mieć działającą aplikację Laravel i tabelę bazy danych nazwaną “miejsca”, zawierającą przykładowe dane.

Zmienimy teraz główną ścieżkę aplikacji, aby wyszukać bazę danych i zwrócić jej zawartość do widoku aplikacji.

Otwórz plik głównej ścieżki, routes/web.php:

nano routes/web.php

Ten plik ma domyślnie następującą treść:

<?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');
});

Ścieżki są definiowane w tym pliku przy użyciu statycznej metody Route::get, która jako argument przyjmuje ścieżkę i funkcję zwrotną.

Poniższy kod zastępuje funkcję zwrotną głównej ścieżki. Wykonuje 2 zapytania do bazy danych, używając flagi odwiedzone do filtrowania wyników. Zwraca wyniki do widoku o nazwie lista_podrozy, który utworzymy w następnej kolejności. Skopiuj tę zawartość do pliku routes/web.php, zastępując już istniejący kod:

<?php

use Illuminate\Support\Facades\DB;

Route::get('/', function () {
  $visited = DB::select('select * from miejsca where visited = ?', [1]);
  $togo = DB::select('select * from miejsca where visited = ?', [0]);

  return view('miasta', ['visited' => $visited, 'togo' => $togo ] );
});

Zapisz i zamknij plik po zakończeniu edycji. Utworzymy teraz widok, który wyświetli wyniki bazy danych użytkownikowi. Utwórz nowy plik widoku w resources/views:

nano resources/views/miasta.blade.php

Poniższy szablon tworzy dwie listy miejsc na podstawie zmiennych “visited” i “togo”. Skopiuj tę treść do nowego pliku resources/views/miasta/blade.php:

<html>
<head>
    <title>Lista Miast</title>
</head>

<body>
    <h1>Lista Miast z Bazy Danych</h1>
    <h2>Miejsca ktore chcialbym odwiedziec</h2>
    <ul>
      @foreach ($togo as $newplace)
        <li>{{ $newplace->name }}</li>
      @endforeach
    </ul>

    <h2>Miejsca gdzie juz bylem</h2>
    <ul>
          @foreach ($visited as $place)
                <li>{{ $place->name }}</li>
          @endforeach
    </ul>
</body>
</html>

Po zakończeniu zapisz i zamknij plik. Teraz przejdź do przeglądarki i ponownie załaduj aplikację.

Masz teraz funkcjonującą aplikację Laravel, która pobiera zawartość z bazy danych MySQL.

Podsumowanie

W tym artykule skonfigurowaliśmy nową aplikację Laravel w zestawie LEMP (Linux, Nginx, MySQL i PHP), działającą na serwerze Ubuntu 20.04. Dostosowałeś również swoją domyślną ścieżkę tak, aby pytać o zawartość bazy danych i wyświetlać wyniki w widoku niestandardowym.