Wyszukiwanie w witrynie

Jak zainstalować Linux, Nginx, MySQL, PHP (stos LEMP) na Ubuntu


Wprowadzenie

Stos oprogramowania LEMP obsługuje dynamiczne strony internetowe i aplikacje internetowe napisane w PHP. Jest to akronim opisujący system operacyjny Linux z serwerem www Nginx (wymawiany jak „Engine-X”). Dane backendowe przechowywane są w bazie danych MySQL, a przetwarzanie dynamiczne obsługiwane jest przez PHP.

Ten przewodnik pokazuje, jak zainstalować stos LEMP na serwerze Ubuntu. System operacyjny Ubuntu obsługuje część stosu związaną z Linuksem. Opiszemy, jak uruchomić pozostałe komponenty.

Uwaga: Ten poradnik jest głównie przeznaczony dla Ubuntu 22.04 LTS z PHP 8.1. Dla użytkowników Ubuntu 24.04 LTS należy zmienić odniesienia do wersji PHP z php8.1-fpm na php8.3-fpm we wszystkich poleceniach. Upewnij się również, że zaktualizujesz wszystkie ścieżki gniazd PHP-FPM w konfiguracji Nginx (np. użyj /run/php/php8.3-fpm.sock dla Ubuntu 24.04).

Jak zainstalować Linux, Nginx, MySQL, PHP (stos LEMP) na Ubuntu

  1. Instalacja serwera internetowego Nginx
  2. Instalowanie MySQL
  3. Instalowanie PHP
  4. Konfigurowanie Nginx do korzystania z procesora PHP
  5. Testowanie PHP z Nginx
  6. Testowanie połączenia z bazą danych z PHP

Wymagania wstępne

Użyj użytkownika sudo niebędącego rootem w Ubuntu z włączoną zaporą UFW. Skorzystaj z naszego przewodnika po wstępnej konfiguracji serwera dla Ubuntu, aby go skonfigurować.

Krok 1 – Instalacja serwera internetowego Nginx

Aby wyświetlać strony internetowe odwiedzającym, będziesz korzystać z Nginx, wydajnego serwera WWW. Do uzyskania tego oprogramowania użyjesz menedżera pakietów APT.

Zaktualizuj indeks pakietów swojego serwera, a następnie zainstaluj Nginx:

sudo apt update

Następnie uruchom apt install, aby zainstalować Nginx:

sudo apt install nginx

Gdy pojawi się monit, naciśnij Y i ENTER, aby potwierdzić, że chcesz zainstalować Nginx. Po zakończeniu instalacji serwer WWW Nginx będzie aktywny i działał na twoim serwerze Ubuntu.

Sprawdź, czy Nginx działa:

sudo systemctl status nginx

Powinieneś zobaczyć wynik wskazujący, że Nginx jest aktywny:

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since...

W systemie Ubuntu Nginx jest skonfigurowany tak, aby uruchamiał się po instalacji.

Zezwól na ruch HTTP przez zaporę ufw. Nginx rejestruje kilka profili aplikacji UFW podczas instalacji. Sprawdź dostępne profile:

sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH

Włącz najbardziej restrykcyjny profil, który pozwala na wymagany ruch. Ponieważ SSL nie jest jeszcze skonfigurowany, zezwól tylko na ruch HTTP na porcie 80:

Włącz to, wykonując następujące polecenie:

sudo ufw allow 'Nginx HTTP'

Zweryfikuj zmianę w zaporze sieciowej:

sudo ufw status

Ten wynik pokazuje, że ruch HTTP jest teraz dozwolony:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Nginx HTTP (v6)            ALLOW       Anywhere (v6)

Aby przetestować funkcjonalność domeny serwera Nginx, otwórz w przeglądarce internetowej adres http://your_domain.

Jeżeli nie masz nazwanej domeny skierowanej na Twój serwer i nie znasz publicznego adresu IP swojego serwera, możesz go znaleźć, uruchamiając jedno z następujących poleceń:

ip addr show
hostname -I

To wydrukuje kilka adresów IP. Możesz wypróbować każdy z nich kolejno w swojej przeglądarce internetowej.

Alternatywnie możesz sprawdzić, który adres IP jest dostępny, widziany z innych lokalizacji w internecie:

curl -4 icanhazip.com

Wpisz adres, który otrzymujesz w przeglądarce internetowej, a zostaniesz przeniesiony na domyślną stronę startową Nginx:

http://<server_domain_or_IP>

Jeśli otrzymujesz tę stronę, oznacza to, że pomyślnie zainstalowałeś Nginx i włączyłeś ruch HTTP na swoim serwerze WWW.

Krok 2 — Instalacja MySQL

Zainstaluj MySQL, aby przechowywać i zarządzać danymi witryny. MySQL jest standardowym systemem zarządzania bazami danych w środowiskach PHP.

Ponownie użyj apt, aby pobrać i zainstalować to oprogramowanie:

sudo apt install mysql-server

Gdy pojawi się monit, potwierdź instalację, naciskając Y, a następnie ENTER.

Po instalacji uruchom skrypt zabezpieczający, aby usunąć niebezpieczne ustawienia domyślne i zabezpieczyć dostęp do bazy danych:

sudo mysql_secure_installation

Pojawi się pytanie, czy chcesz skonfigurować VALIDATE PASSWORD PLUGIN.

Uwaga: Włączenie tej funkcji wymaga pewnej oceny. Jeśli jest włączona, hasła, które nie spełniają określonych kryteriów, zostaną odrzucone przez MySQL z błędem. Bezpieczne jest pozostawienie weryfikacji wyłączonej, ale zawsze należy używać silnych, unikalnych haseł do danych uwierzytelniających bazy danych.

Odpowiedz Y na tak, lub cokolwiek innego, aby kontynuować bez włączania:

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 

Jeśli odpowiesz „tak”, zostaniesz poproszony o wybranie poziomu weryfikacji hasła. Pamiętaj, że jeśli wpiszesz 2 dla najsilniejszego poziomu, otrzymasz błędy podczas próby ustawienia hasła, które nie zawiera liczb, liter wielkich i małych oraz znaków specjalnych:

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary              file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: 1

Niezależnie od tego, czy zdecydujesz się na skonfigurowanie VALIDATE PASSWORD PLUGIN, Twój serwer poprosi Cię o wybranie i potwierdzenie hasła dla użytkownika MySQL root. Nie należy tego mylić z systemowym root. Użytkownik root bazy danych jest administracyjnym użytkownikiem z pełnymi uprawnieniami do systemu baz danych. Chociaż domyślna metoda uwierzytelniania dla użytkownika root MySQL nie wymaga użycia hasła, nawet jeśli zostało ono ustawione, powinieneś tutaj zdefiniować silne hasło jako dodatkowy środek bezpieczeństwa. Omówimy to za chwilę.

Jeśli włączyłeś walidację hasła, zostanie wyświetlona siła hasła dla podanego hasła roota, a twój serwer zapyta, czy chcesz kontynuować z tym hasłem. Jeśli jesteś zadowolony ze swojego obecnego hasła, naciśnij Y dla „tak” w wyświetlonym zapytaniu:

Estimated strength of the password: 100 
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : y

Dla pozostałych pytań naciśnij Y i wciśnij klawisz ENTER przy każdym monicie. Spowoduje to usunięcie niektórych anonimowych użytkowników i bazy testowej, wyłączenie logowania zdalnego dla użytkownika root oraz załadowanie tych nowych reguł, dzięki czemu MySQL od razu uwzględni wprowadzone zmiany.

Po zakończeniu sprawdź, czy możesz zalogować się do konsoli MySQL:

sudo mysql

To połączy się z serwerem MySQL jako administracyjny użytkownik bazy danych root, co wynika z użycia sudo podczas uruchamiania tego polecenia. Powinieneś otrzymać następujący wynik:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.28-0ubuntu4 (Ubuntu)

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

Aby wyjść z konsoli MySQL, wpisz następujące polecenie:

exit

Zauważ, że nie musiałeś podawać hasła, aby połączyć się jako użytkownik root, mimo że ustawiłeś je podczas uruchamiania skryptu mysql_secure_installation. Wynika to z faktu, że przy instalacji na Ubuntu domyślną metodą uwierzytelniania dla administracyjnego użytkownika MySQL jest auth_socket, a nie metoda wykorzystująca hasło. Może wydawać się to początkowo problemem bezpieczeństwa, ale w rzeczywistości zwiększa to bezpieczeństwo serwera bazy danych, ponieważ jedynymi użytkownikami, którzy mają prawo zalogować się jako użytkownik MySQL root, są użytkownicy systemowi z uprawnieniami sudo, logujący się z konsoli lub za pomocą aplikacji działającej z tymi samymi uprawnieniami. W praktyce oznacza to, że nie będziesz mógł używać administracyjnego użytkownika bazy danych root, aby połączyć się z poziomu swojej aplikacji PHP.

Dla zwiększenia bezpieczeństwa najlepiej jest utworzyć dedykowane konta użytkowników z mniejszymi uprawnieniami dla każdej bazy danych, szczególnie jeśli planujesz hostować na swoim serwerze wiele baz danych.

Uwaga: Niektóre starsze wydania natywnej biblioteki PHP MySQL mysqlnd nie obsługują caching_sha2_authentication, domyślnej metody uwierzytelniania dla użytkowników tworzonych w MySQL 8. Z tego powodu, tworząc użytkowników baz danych dla aplikacji PHP na MySQL 8, może być konieczne upewnienie się, że są skonfigurowani do używania mysql_native_password. Pokażemy, jak to zrobić w Kroku 6.

Twój serwer MySQL jest teraz zainstalowany i zabezpieczony. Następnie zainstalujesz PHP, ostatni element stosu LEMP.

Krok 3 – Instalowanie PHP

Zainstaluj PHP, aby przetwarzać kod i generować dynamiczną zawartość. Nginx wymaga zewnętrznego programu do obsługi PHP.

PHP-FPM („menedżer procesów fastCGI”) obsługuje przetwarzanie PHP w sposób wydajny z dodatkowymi funkcjami bezpieczeństwa, zapewniając lepszą wydajność dla stron opartych na PHP. Zainstaluj php-fpm, aby kierować żądania PHP z Nginx, oraz php-mysql, aby umożliwić komunikację PHP z MySQL. Podstawowe pakiety PHP instalują się automatycznie jako zależności.

Aby zainstalować pakiety php8.1-fpm i php-mysql, uruchom:

sudo apt install php8.1-fpm php-mysql

Gdy pojawi się monit, naciśnij Y i ENTER, aby potwierdzić instalację.

Sprawdź, czy PHP-FPM działa:

sudo systemctl status php8.1-fpm

Powinieneś zobaczyć komunikat, że PHP-FPM jest aktywny:

● php8.1-fpm.service - The PHP 8.1 FastCGI Process Manager
     Loaded: loaded
     Active: active (running)

Możesz również sprawdzić wersję PHP:

php -v
PHP 8.1.x (cli) (built: ...)
Copyright (c) The PHP Group
Zend Engine v4.1.x

Skonfiguruj Nginx, aby korzystał z tych komponentów PHP.

Krok 4 — Konfigurowanie Nginx do korzystania z procesora PHP

Twórz bloki serwera Nginx (podobne do wirtualnych hostów Apache), aby zamknąć konfigurację i obsługiwać wiele domen na jednym serwerze. Ten przewodnik używa your_domain jako przykładowej nazwy domeny.

Informacja: Aby dowiedzieć się więcej o konfigurowaniu nazwy domeny z Linux-Console.net, przeczytaj nasze wprowadzenie do DNS Linux-Console.net.

Na Ubuntu 22.04 Nginx włącza jeden domyślny blok serwera obsługujący dokumenty z /var/www/html. Dla wielu stron utwórz strukturę katalogów w /var/www dla twoja_domena, pozostawiając /var/www/html jako domyślny katalog zapasowy.

Utwórz katalog główny sieci dla your_domain w następujący sposób:

sudo mkdir /var/www/your_domain

Następnie przypisz właściciela katalogu przy użyciu zmiennej środowiskowej $USER, która odnosi się do bieżącego użytkownika systemu:

sudo chown -R $USER:$USER /var/www/your_domain

Następnie otwórz nowy plik konfiguracyjny w katalogu sites-available Nginx, używając swojego ulubionego edytora wiersza poleceń. Tutaj użyjemy nano:

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

To utworzy nowy pusty plik. Wstaw następującą podstawową konfigurację:

server {
    listen 80;
    server_name your_domain www.your_domain;
    root /var/www/your_domain;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ =404;
    }

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

    location ~ /\.ht {
        deny all;
    }

}

Oto, co robi każdy z tych dyrektyw i bloków lokalizacji:

  • listen — Określa, na którym porcie Nginx będzie nasłuchiwał. W tym przypadku będzie nasłuchiwał na porcie 80, domyślnym porcie dla HTTP.
  • root — Określa katalog główny dokumentu, w którym przechowywane są pliki udostępniane przez tę stronę internetową.
  • index — Określa, w jakiej kolejności Nginx będzie priorytetowo traktować pliki indeksu dla tej witryny. Powszechną praktyką jest umieszczanie plików index.html wyżej w hierarchii niż pliki index.php, aby umożliwić szybkie ustawienie strony konserwacyjnej w aplikacjach PHP. Możesz dostosować te ustawienia, aby lepiej odpowiadały potrzebom Twojej aplikacji.
  • server_name — Określa, na które nazwy domen i/lub adresy IP powinien odpowiadać ten blok serwera. Wskaż w tej dyrektywie nazwę domeny swojego serwera lub jego publiczny adres IP.
  • location / — Pierwszy blok location zawiera dyrektywę try_files, która sprawdza istnienie plików lub katalogów odpowiadających żądaniu URL. Jeśli Nginx nie znajdzie odpowiedniego zasobu, zwróci błąd 404.
  • location ~ \.php$ — Ten blok lokalizacji obsługuje rzeczywiste przetwarzanie PHP, wskazując Nginx na plik konfiguracyjny fastcgi-php.conf oraz plik php8.1-fpm.sock, który określa, jaki socket jest powiązany z php8.1-fpm.
  • location ~ /\.ht — Ostatni blok location dotyczy plików .htaccess, które Nginx nie przetwarza. Dodając dyrektywę deny all, jeśli jakiekolwiek pliki .htaccess znajdą się w katalogu głównym dokumentów, nie będą one udostępniane odwiedzającym.

Po zakończeniu edytowania zapisz i zamknij plik. Jeśli używasz nano, możesz to zrobić, naciskając CTRL+X, a następnie Y i ENTER, aby potwierdzić.

Aktywuj swoją konfigurację, łącząc ją z plikiem konfiguracyjnym z katalogu sites-enabled Nginx:

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

Następnie odłącz domyślny plik konfiguracyjny z katalogu /sites-enabled/:

sudo unlink /etc/nginx/sites-enabled/default

Uwaga: Jeśli kiedykolwiek będziesz musiał przywrócić domyślną konfigurację, możesz to zrobić, ponownie tworząc dowiązanie symboliczne, jak poniżej:

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

To spowoduje, że Nginx użyje tej konfiguracji przy następnym przeładowaniu. Możesz sprawdzić swoją konfigurację pod kątem błędów składni, uruchamiając następujące polecenie:

sudo nginx -t

Jeśli zgłoszone zostaną jakiekolwiek błędy, wróć do swojego pliku konfiguracyjnego, aby sprawdzić jego zawartość przed kontynuowaniem.

Gdy będziesz gotowy, przeładuj Nginx, aby zastosować zmiany:

sudo systemctl reload nginx

Twoja nowa strona internetowa jest teraz aktywna, ale katalog główny /var/www/twoja_domena wciąż jest pusty. Utwórz w tym miejscu plik index.html, aby móc przetestować, czy nowy blok serwera działa zgodnie z oczekiwaniami:

nano /var/www/your_domain/index.html

Dołącz następującą zawartość do tego pliku:

<html>
  <head>
    <title>your_domain website</title>
  </head>
  <body>
    <h1>Hello World!</h1>

    <p>This is the landing page of <strong>your_domain</strong>.</p>
  </body>
</html>

Teraz przejdź do przeglądarki i uzyskaj dostęp do nazwy domeny lub adresu IP serwera, jak podano w dyrektywie server_name w pliku konfiguracyjnym bloku serwera:

http://server_domain_or_IP

Otrzymasz stronę podobną do następującej:

Jeśli otrzymujesz tę stronę, oznacza to, że blok serwera Nginx działa zgodnie z oczekiwaniami.

Możesz pozostawić ten plik na miejscu jako tymczasową stronę startową dla swojej aplikacji, dopóki nie utworzysz pliku index.php, aby go zastąpić.

Ostrzeżenie: Po dodaniu pliku index.php upewnij się, że usuniesz lub zmienisz nazwę pliku index.html w katalogu głównym dokumentów. Jeśli oba pliki istnieją, Nginx domyślnie będzie serwować index.html, a Twoja strona PHP nie zostanie wyświetlona — jest to częste źródło zamieszania dla nowych użytkowników.

Twój stos LEMP jest teraz w pełni skonfigurowany. W następnym kroku utworzysz skrypt PHP, aby przetestować, czy Nginx faktycznie potrafi obsługiwać pliki .php na Twojej nowo skonfigurowanej stronie internetowej.

Krok 5 – Testowanie PHP z Nginx

Twój stos LEMP powinien być teraz w pełni skonfigurowany. Możesz go przetestować, aby upewnić się, że Nginx prawidłowo przekazuje pliki .php do Twojego procesora PHP.

Możesz to zrobić, tworząc plik testowy PHP w katalogu głównym dokumentów. Otwórz nowy plik o nazwie info.php w katalogu głównym dokumentów w preferowanym edytorze tekstu:

nano /var/www/your_domain/info.php

Dodaj następujące linie do nowego pliku. To jest prawidłowy kod PHP, który zwróci informacje o Twoim serwerze:

<?php
phpinfo();

Kiedy skończysz, zapisz plik i go zamknij.

Teraz możesz uzyskać dostęp do tej strony w swojej przeglądarce internetowej, odwiedzając nazwę domeny lub publiczny adres IP, który ustawiłeś w pliku konfiguracyjnym Nginx, a następnie wpisując /info.php:

http://server_domain_or_IP/info.php

Otrzymasz stronę internetową zawierającą szczegółowe informacje o swoim serwerze:

Po sprawdzeniu odpowiednich informacji o Twoim serwerze PHP za pośrednictwem tej strony, najlepiej jest usunąć utworzony plik, ponieważ zawiera on wrażliwe informacje o Twoim środowisku PHP i serwerze Ubuntu. Możesz użyć rm, aby usunąć ten plik:

sudo rm /var/www/your_domain/info.php

Zawsze możesz ponownie wygenerować ten plik, jeśli będziesz go potrzebować później.

Krok 6 — Testowanie połączenia z bazą danych z PHP (opcjonalnie)

Jeżeli chcesz przetestować, czy PHP potrafi połączyć się z MySQL i wykonywać zapytania do bazy danych, możesz utworzyć tabelę testową z przykładowymi danymi i zapytać o jej zawartość z poziomu skryptu PHP. Zanim to zrobisz, musisz utworzyć bazę danych testową oraz nowego użytkownika MySQL odpowiednio skonfigurowanego do uzyskania do niej dostępu.

Uwaga: Niektóre starsze wersje natywnej biblioteki PHP dla MySQL mysqlnd nie obsługują caching_sha2_authentication, domyślnej metody uwierzytelniania dla MySQL 8. Może być konieczne upewnienie się, że są skonfigurowane do używania mysql_native_password.

Utworzymy bazę danych o nazwie example_database oraz użytkownika o nazwie example_user, ale możesz zastąpić te nazwy innymi wartościami.

Najpierw połącz się z konsolą MySQL używając konta root:

sudo mysql

Aby utworzyć nową bazę danych, uruchom następujące polecenie w konsoli MySQL:

CREATE DATABASE example_database;

Teraz możesz utworzyć nowego użytkownika i nadać mu pełne uprawnienia do niestandardowej bazy danych, którą utworzyłeś.

Następujące polecenie tworzy nowego użytkownika o nazwie example_user, używając mysql_native_password jako domyślnej metody uwierzytelniania. Ustawiamy hasło tego użytkownika na password, ale powinieneś zastąpić tę wartość bezpiecznym hasłem według własnego wyboru.

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

Teraz musimy nadać temu użytkownikowi uprawnienia do bazy danych example_database:

GRANT ALL ON example_database.* TO 'example_user'@'%';

To nada użytkownikowi example_user pełne uprawnienia do bazy danych example_database, jednocześnie uniemożliwiając mu tworzenie lub modyfikowanie innych baz danych na twoim serwerze.

Teraz wyjdź z powłoki MySQL za pomocą następującego polecenia:

exit

Możesz sprawdzić, czy nowy użytkownik ma odpowiednie uprawnienia, logując się ponownie do konsoli MySQL, tym razem używając danych logowania niestandardowego użytkownika. Zwróć uwagę na flagę -p w tym poleceniu, która spowoduje wyświetlenie monitu o hasło użyte podczas tworzenia użytkownika example_user:

mysql -u example_user -p

Po zalogowaniu się do konsoli MySQL, potwierdź, że masz dostęp do bazy danych example_database:

SHOW DATABASES;

To zwróci następujące dane wyjściowe:

+--------------------+
| Database           |
+--------------------+
| example_database   |
| information_schema |
+--------------------+
2 rows in set (0.000 sec)

Następnie utworzymy testową tabelę o nazwie todo_list. Z konsoli MySQL uruchom następujące polecenie:

CREATE TABLE example_database.todo_list (

 item_id INT AUTO_INCREMENT,

 content VARCHAR(255),

 PRIMARY KEY(item_id)

);

Wstaw kilka wierszy zawartości do testowej tabeli. Możesz chcieć powtórzyć następujące polecenie kilka razy, używając różnych wartości:

INSERT INTO example_database.todo_list (content) VALUES ("My first important item");

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

SELECT * FROM example_database.todo_list;

Twój wynik powinien być wyświetlony w następujący sposób:

+---------+--------------------------+
| item_id | content                  |
+---------+--------------------------+
|       1 | My first important item  |
|       2 | My second important item |
|       3 | My third important item  |
|       4 | and this one more thing  |
+---------+--------------------------+
4 rows in set (0.000 sec)

Po potwierdzeniu, że masz prawidłowe dane w swojej tabeli testowej, możesz opuścić konsolę MySQL:

exit

Teraz możesz stworzyć skrypt PHP, który połączy się z MySQL i wykona zapytanie o twoje treści. Utwórz nowy plik PHP w katalogu głównym swojej witryny za pomocą ulubionego edytora. My użyjemy do tego nano:

nano /var/www/your_domain/todo_list.php

Poniższy skrypt PHP łączy się z bazą danych MySQL i wykonuje zapytanie o zawartość tabeli todo_list, wyświetlając wyniki w formie listy. Jeśli wystąpi problem z połączeniem z bazą danych, zostanie zgłoszony wyjątek.

Dodaj następującą zawartość do swojego skryptu todo_list.php:

<?php
$user = "example_user";
$password = "password";
$database = "example_database";
$table = "todo_list";

try {
  $db = new PDO("mysql:host=localhost;dbname=$database", $user, $password);
  echo "<h2>TODO</h2><ol>"; 
  foreach($db->query("SELECT content FROM $table") as $row) {
    echo "<li>" . $row['content'] . "</li>";
  }
  echo "</ol>";
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}

Zapisz i zamknij plik, gdy skończysz edytować.

Teraz możesz uzyskać dostęp do tej strony w swojej przeglądarce internetowej, odwiedzając nazwę domeny lub publiczny adres IP skonfigurowany dla Twojej strony internetowej, a następnie /todo_list.php:

http://server_domain_or_IP/todo_list.php

Powinieneś otrzymać stronę podobną do poniższej, pokazującą zawartość, którą wstawiłeś do swojej tabeli testowej:

To oznacza, że Twoje środowisko PHP jest gotowe do łączenia się i współpracy z serwerem MySQL.

Najczęściej zadawane pytania

Do czego służy stos LEMP?

Stos LEMP obsługuje dynamiczne strony internetowe i aplikacje oparte na PHP, w tym WordPress, Laravel, Magento, Drupal oraz niestandardowe projekty PHP. Jest szczególnie skuteczny w przypadku witryn o dużym ruchu, które wymagają efektywnego obsługiwania wielu jednoczesnych połączeń.

Jaka jest różnica między stosami LEMP a LAMP?

LEMP używa Nginx, który obsługuje połączenia asynchronicznie w architekturze opartej na zdarzeniach — efektywnej przy wielu jednoczesnych użytkownikach. LAMP używa Apache, który tradycyjnie tworzy wątek na każde żądanie (choć nowoczesny Apache obsługuje tryby oparte na zdarzeniach). LEMP zazwyczaj oferuje lepszą wydajność dla treści statycznych i scenariuszy o wysokiej równoczesności, podczas gdy LAMP zapewnia łatwiejszą konfigurację .htaccess oraz szersze wsparcie dla modułów.

Którą wersję Ubuntu powinienem użyć do LEMP?

Ubuntu 22.04 LTS jest głównym celem tego przewodnika, oferując PHP 8.1, MySQL 8.0 i Nginx z długoterminowym wsparciem. Ubuntu 24.04 LTS (najnowsza wersja) domyślnie zawiera PHP 8.3 i współpracuje z tym przewodnikiem po odpowiednim dostosowaniu ścieżek gniazd PHP-FPM i numerów wersji.

Jak zainstalować stos LEMP na Ubuntu 24.04?

Postępuj według tych podstawowych kroków:

  1. Zainstaluj Nginx: sudo apt install nginx
  2. Zainstaluj MySQL: sudo apt install mysql-server
  3. Uruchom skrypt zabezpieczeń MySQL: sudo mysql_secure_installation
  4. Zainstaluj PHP-FPM: sudo apt install php-fpm php-mysql
  5. Skonfiguruj blok serwera Nginx z integracją PHP-FPM
  6. Test z info.php i połączeniem z bazą danych

Zobacz pełny przewodnik w krokach 1-6 powyżej.

Jaką wersję PHP powinienem zainstalować z Nginx i MySQL?

Użyj domyślnej wersji PHP w swojej dystrybucji Ubuntu dla najlepszej kompatybilności:

  • Ubuntu 22.04: PHP 8.1 (zainstalowany przez php8.1-fpm)
  • Ubuntu 24.04: PHP 8.3 (dostosuj polecenia do php8.3-fpm dla tej wersji)

Obie wersje doskonale współpracują z Nginx i MySQL 8.0, obsługują nowoczesne frameworki i otrzymują regularne aktualizacje bezpieczeństwa.

Jak skonfigurować Nginx, aby obsługiwał pliki PHP?

Dodaj blok location ~ \.php$ do konfiguracji serwera Nginx, który kieruje żądania PHP do PHP-FPM przez gniazdo Unix:

location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
}

Dostosuj ścieżkę gniazda w zależności od wersji PHP, przetestuj za pomocą sudo nginx -t i przeładuj za pomocą sudo systemctl reload nginx.

Dlaczego po zainstalowaniu PHP-FPM otrzymuję błąd „502 Bad Gateway”?

Błędy 502 wskazują, że Nginx nie może komunikować się z PHP-FPM. Typowe przyczyny:

  1. PHP-FPM nie działa: Sprawdź za pomocą sudo systemctl status php8.1-fpm i w razie potrzeby uruchom
  2. Zła ścieżka gniazda: Sprawdź, czy /run/php/php8.1-fpm.sock istnieje i jest zgodna z konfiguracją Nginx
  3. Problem z uprawnieniami: Upewnij się, że użytkownik Nginx (www-data) ma dostęp do gniazda
  4. Błąd konfiguracji PHP-FPM: Sprawdź logi w /var/log/php8.1-fpm.log

Rozwiązanie: Uruchom ponownie obie usługi:

sudo systemctl restart php8.1-fpm nginx

Jak zabezpieczyć MySQL po instalacji?

Uruchom wbudowany skrypt zabezpieczeń:

sudo mysql_secure_installation

Postępuj zgodnie z instrukcjami, aby:

  • Włącz wtyczkę walidacji hasła
  • Ustaw silne hasło root
  • Usuń anonimowych użytkowników
  • Wyłącz zdalne logowanie jako root
  • Usuń bazę danych testową
  • Ponów uprawnienia

Dla baz danych aplikacji utwórz dedykowanych użytkowników z ograniczonymi uprawnieniami zamiast korzystać z konta root.

Czy mogę uruchomić wiele stron internetowych na jednym serwerze LEMP?

Tak, utwórz osobne bloki serwera Nginx dla każdej domeny:

  1. Utwórz katalog: sudo mkdir -p /var/www/second_domain
  2. Utwórz blok serwera: sudo nano /etc/nginx/sites-available/second_domain
  3. Skonfiguruj z unikalnymi dyrektywami server_name i root
  4. Włącz: sudo ln -s /etc/nginx/sites-available/second_domain /etc/nginx/sites-enabled/
  5. Przetestuj i przeładuj: sudo nginx -t && sudo systemctl reload nginx

Każda strona może mieć osobne ustawienia PHP i użytkowników bazy danych.

Jak mogę zaktualizować PHP do nowszej wersji?

Aktualizacje pakietów Ubuntu automatycznie obsługują wersje minor. W przypadku aktualizacji do wersji major:

  1. Dodaj Ondřej PHP PPA (zaufane repozytorium strony trzeciej):

    sudo add-apt-repository ppa:ondrej/php
    sudo apt update
  2. Zainstaluj nową wersję PHP-FPM:

    sudo apt install php8.3-fpm php8.3-mysql -y
  3. Zaktualizuj ścieżkę gniazda w konfiguracji Nginx na /run/php/php8.3-fpm.sock

  4. Przetestuj i przeładuj Nginx

  5. Opcjonalnie usuń starą wersję: sudo apt purge php8.1-fpm

Zawsze testuj na środowisku staging przed aktualizacją systemów produkcyjnych.

Rozwiązywanie typowych problemów

502 Błąd Bramy

Najczęstszym problemem ze stosem LEMP jest sytuacja, gdy Nginx nie może komunikować się z PHP-FPM:

Sprawdź status PHP-FPM:

sudo systemctl status php8.1-fpm

Zweryfikuj ścieżkę gniazda:

ls -la /run/php/

Oczekiwany wynik powinien pokazać plik php8.1-fpm.sock.

Typowe naprawy:

  1. Restart PHP-FPM: sudo systemctl restart php8.1-fpm
  2. Sprawdź, czy ścieżka gniazda w bloku serwera Nginx odpowiada rzeczywistej ścieżce gniazda PHP-FPM
  3. Sprawdź uprawnienia pliku: sudo chown www-data:www-data /run/php/php8.1-fpm.sock

Błędy odmowy dostępu

Napraw uprawnienia katalogu sieciowego:

sudo chown -R www-data:www-data /var/www/your_domain
sudo chmod -R 755 /var/www/your_domain

Problemy z połączeniem MySQL

Zresetuj hasło root MySQL:

sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'new_password';
FLUSH PRIVILEGES;
EXIT;

Sprawdź usługę MySQL:

sudo systemctl status mysql

PHP nie przetwarza

Sprawdź moduły PHP:

php -m | grep -E 'mysql|fpm'

Sprawdź konfigurację PHP-FPM:

sudo nginx -t
sudo php-fpm8.1 -t

Debugowanie błędów 404:

  • Sprawdź, czy index.php jest wymieniony w dyrektywie index Nginx
  • Sprawdź, czy plik istnieje: ls -la /var/www/your_domain/
  • Przejrzyj logi błędów Nginx: sudo tail -f /var/log/nginx/error.log

Wniosek

W tym przewodniku zbudowałeś elastyczne podstawy do obsługi stron internetowych i aplikacji PHP dla swoich odwiedzających, używając Nginx jako serwera WWW oraz MySQL jako systemu bazodanowego. Możesz to zrobić także z serwerem Apache, sprawdź nasz poradnik Jak zainstalować stos Linux, Apache, MySQL, PHP (LAMP) na Ubuntu. Możesz również zabezpieczyć swoją stronę za pomocą Let’s Encrypt, który oferuje darmowe, zaufane certyfikaty. Dowiedz się, jak to zrobić, korzystając z naszego przewodnika Let’s Encrypt dla Apache.

Dziękujemy za naukę z społecznością Linux-Console.net.