W tym wpisie pokażę, jak przygotować środowisko programistyczne dla PHP na Linuxie (LEMP). Zademonstruję krok po kroku, jak wszystko skonfigurować, tak jak ja to robię od paru lat. Dlatego poza samym tutorialem „zainstaluj to, zainstaluj tamto”, będą też praktyczne porady, np. co zrobić, by rozwiązać problemy z uprawnieniami do plików.

Czemu akurat Ubuntu?

Na samym wstępie, chciałbym krótko wytłumaczyć dlaczego ze wszystkich dostępnych dystrybucji, wybrałem właśnie Ubuntu. Można zauważyć, że przecież na DistroWatch, Ubuntu prawdopodobnie nie będzie nawet w pierwszej trójce (w momencie pisania tego wpisu jest w niej: MX Linux, EndeavourOS i Manjaro). Powód wybrania Ubuntu jest czysto subiektywny: jest to moja ulubiona dystrybucja na desktopy. I cokolwiek by nie mówić, to zawsze te najpopularniejsze dystrybucje zostają w końcu zapomniane, a Ubuntu ciągle gdzieś się tam przewija.

Instalacja PHP

Pierwsze co, to musimy uruchomić terminal. Tutaj wychodzę z założenia, że jeśli korzystacie z Linuxa, to obsługa terminala nie powinna być Wam obca. A jeśli wciąż nie obsługujecie płynnie linuxowej konsoli, to akurat będziecie mieli okazję poćwiczyć, wraz z wykonywaniem kolejnych kroków z tego poradnika 😄

Po uruchomieniu terminala, wpisujemy komendę:
sudo apt install php-fpm



Po pomyślnym wykonaniu procesu instalacji, PHP będzie gotowy do użytku, co możemy sprawdzić przez wpisanie komendy php -v.

Instalacja nginx

Podobnie jak w poprzednim kroku, zainstalujemy nginx używając terminala, czyli wpisujemy:
sudo apt install nginx



Po pomyślnym zainstalowaniu, powinniśmy móc w przeglądarce zobaczyć czy nginx działa poprawnie, wpisując adres 127.0.0.1:


Konfiguracja nginx i PHP

Domyślnie nginx serwuje nam zawartość folderu /var/www/html. Jest to rozwiązanie dobrze sprawdzające się na serwerach, gdyż w pozwala wydzielić część odpowiedzialną za stronę internetową od reszty systemu, a to pozwala zapobiegać nieautoryzowanym dostępom. W przypadku lokalnego środowiska deweloperskiego, uważam, że takie zabezpieczenie będzie nam tylko przeszkadzało, gdyż chcielibyśmy mieć pełny dostęp do projektu nad którym pracujemy. Dlatego skonfigurujemy PHP i nginx tak, by pozwalało serwować projekt z naszego katalogu domowego.

  1. Uruchamiamy terminal i w naszym katalogu domowym (w moim przypadku /home/luklew/), tworzymy folder Sites (przez np. komendę mkdir Sites). Czyli tak, że pod ścieżką /home/luklew/Sites będziemy mieć wszystkie nasze projekty.
  2. W folderze „Sites” tworzymy nasz testowy projekt, ja go nazwałem website. Czyli najpierw wchodzimy w folder Sites (cd Sites) a następnie tworzymy folder website (mkdir website).
  3. Wewnątrz folderu website, tworzymy plik index.html, a jako treść pliku wpisujemy dowolną np. „Hello World HTML”. Możemy sobie ułatwić zadanie i otworzyć nasz pusty projekt „website” przez nasz ulubiony edytor. Ja użyłem Sublime Text.

Wszystkie powyższe trzy kroki są widoczne na poniższym zrzucie ekranu:



Na tym etapie mamy już gotowy bardzo prosty, testowy projekt HTML. Musimy teraz skonfigurować nginx by serwował treść z folderu /home/luklew/Sites/website a nie z /var/www/html.

W tym celu modyfikujemy plik /etc/nginx/sites-available/default. Ja do tego celu używam nano i jeśli jeszcze tego edytora nie znacie, to warto się go nauczyć. Ale równie dobrze, możecie użyć dowolnego innego narzędzia do edycji tekstu (pamiętajmy wtedy tylko o tym, że potrzebne będą uprawnienia roota).

W celu edycji pliku przez nano, wpisuję w terminalu:
sudo nano /etc/nginx/sites-available/default

Znajdujemy fragment zawierający root /var/www/html i zamieniamy go na root /home/[twoja nazwa uzytkownika]/Sites/website. Parę linii niżej mamy linię zaczynającą się od słowa index. Dodajemy index.php między index a index.html, tak jak na poniższym zrzucie:



To jeszcze nie wszystko. Musimy przewinąć ciut niżej by znaleźć komentarz „# pass PHP scripts to FastCGI server”. Musimy odkomentować niektóre z linii, tak jak na poniższym zrzucie ekranu:



Odkomentowanie tych linii, to skonfigurowanie nginxa tak, że gdy napotka plik *.php, powinien przekazać jego wykonanie pod adres 127.0.0.1:9000, gdzie będzie nasłuchiwał nasz PHP-FPM.
Po tych zmianach, możemy zapisać plik (Ctrl+X w nano).

Teraz czas na jeszcze jedną zmianę, dotyczącą uprawnień. Nginx domyślnie uruchamiany jest jako użytkownik www-data. W kontekście bezpieczeństwa, jest to bardzo dobry krok. Ja jednak uważam, że na naszych deweloperskich maszynach, nie będzie nic złego, jeśli nginx będziemy uruchamiać z poziomu użytkownika. Oszczędzi to masę czasu i problemów, związanych z uprawnieniami do plików, zwłaszcza, jeśli jesteśmy jeszcze na etapie nauki. Żeby tego dokonać, wchodzimy w edycje pliku /etc/nginx/nginx.conf:
sudo nano /etc/nginx/nginx.conf

I zaraz na początku pliku, zamieniamy user www-data na user [twoja nazwa uzytkownika]:



Zapisujemy plik. Teraz robimy to samo dla PHP, czyli edytujemy plik /etc/php/[wersja PHP]/fpm/pool.d/www.conf.

Wpisuję więc komendę:
sudo nano /etc/php/8.0/fpm/pool.d/www.conf

Zamieniam:
user = www-data
group = www-data


na:
user = [nazwa uzytkownika]
group = [nazwa uzytkownika]


Oraz parę linii niżej znajdujemy fragment zaczynający się na listen =. Zamieniamy go tak, by wyglądał tak:
listen = 127.0.0.1:9000

Tak to wygląda po zmianach u mnie:



Zapisujemy plik. Następnie restartujemy PHP oraz nginx komendami:
/etc/init.d/php8.0-fpm restart
/etc/init.d/nginx reload



Jeśli wszystko zrobiliśmy dobrze, to po odświeżeniu naszej strony 127.0.0.1 w przeglądarce, powinniśmy zobaczyć nasz testowy tekst „Hello World HTML”:



Zanim się ucieszymy, że wszystko zadziałało jak powinno, to powinniśmy jeszcze przetestować czy kod PHP również wykonuje się prawidłowo na naszej stronie. W tym celu folderze naszego projektu (~Sites/website), tworzymy plik index.php w którym wkleimy treść:
<?php

phpinfo();




Po zapisaniu odświeżamy naszą stronę w przeglądarce i powinniśmy zobaczyć taki widok:



Jeśli wszystko zadziałało jak u mnie, to możemy sobie pogratulować! Najtrudniejszą część mamy za sobą! Teraz zostało jedynie zainstalować nam niezbędne dodatki.

Instalacja composera

Composer to „menadżer zależności” dla PHP. Jest on niezbędnym narzędziem dla każdego projektu, gdyż można powiedzieć, że skleja projekty w całość, m.in. pozwala na instalowanie bibliotek do naszych projektów oraz zajmuje się obsługą przestrzeni nazw. Jako, że composer niesamowicie ułatwia pracę, to również powinniśmy go zainstalować.

Najprościej będzie, jeśli uruchomimy terminal i wpiszemy komendę:
sudo apt install composer



Jest to o tyle dobre rozwiązanie, gdyż poza composerem, zainstaluje nam również parę przydatnych rozszerzeń do PHP, takich jak np. „intl”. Po zainstalowaniu możemy sprawdzić czy działa i jaką mamy wersję przez:
composer -v


Alternatywna instalacja (lub aktualizacja) composera

Możemy chcieć zaktualizować composera zainstalowanego przez apt lub zainstalować go, bez instalacji pobocznych bibliotek, które apt nam mimowolnie doinstalował. Jest to również bardzo prosty proces.
1. Ściągamy zadowalającą nas wersję z oficjalnej strony composera
2. Przechodzimy do folderu, gdzie pobraliśmy composera i nadajemy mu uprawnienia wykonawcze:
chmod +x composer.phar
3. Przenosimy composera do /usr/local/bin przez komendę:
sudo mv composer.phar /usr/local/bin/composer

Po całym zabiegu, możemy sprawdzić wersję przez composer -v.

Instalacja i konfiguracja MySQL

Jeśli dotrwaliście aż tutaj, to mam dobre wieści! To już ostatni krok! Instalacja MySQL na szczęście również nie jest skomplikowana, ale niestety nie ogranicza się do jednej komendy.

Zaczynamy klasycznie od:
sudo apt install mysql-server



Po pomyślnym zainstalowaniu, musimy teraz uruchomić wizarda, który przeprowadzi nas przez proces konfiguracji:
sudo mysql_secure_installation

Wizard zada nam parę pytań, na które wspólnie odpowiemy. Pierwszym jest czy chcemy zainstalować „Validate password component”. Jeśli się zgodzimy na jego instalacje, MySQL wprowadzi restrykcje odnośnie ustawianych haseł do bazy danych. W środowisku deweloperskim nie potrzebujemy tego, więc wpisujemy „No”.



Następnie zostaniemy spytani o hasło główne (roota) dla MySQL. Polecam wymyślić hasło, które nie będzie za łatwe, ale jednocześnie takie, którego nie używamy nigdzie indziej. W trakcie tworzenia pierwszych projektów, prawdopodobnie wielokrotnie nasze hasło pojawi się przypadkiem gdzieś jako tekst jawny.

Kolejne pytanie to czy chcemy usunąć anonimowych użytkowników. Zgadzamy się wpisując „y”.



Kolejne pytanie, to czy chcemy zablokować zdalny dostęp do roota (głównego konta) w MySQL. Wpisujemy „y”.
Następne pytanie, to czy chcemy usunąć testową bazę danych. Można ją zostawić, bo może nam pomóc przetestować połączenie z naszym serwerem MySQL. Więc wpisujemy „No”.



Ostatnie pytanie to czy chcemy „przeładować” (ang. reload) uprawnienia. Zgadzamy się, przez wpisanie „y”.



Prawie wszystko gotowe. I teraz tak… są dwie drogi. Jeżeli nie mieliście nigdy styczności z bazami danych i generalnie nie wiecie jak je skonfigurować, to najprościej będzie, jeśli przejdziecie przez kolejne kroki, które umożliwią Wam dostęp do roota z poziomu aplikacji (np. MySQL Workbench). Jeśli jednak jesteście w stanie sprawnie zarządzać użytkownikami i bazami danych, to możecie pominąć resztę kroków i przewinąć od razu do ostatniego akapitu. Piszę o tym, gdyż zdaję sobie sprawę, że danie pełnego dostępu do serwera bazy danych, nie jest czymś, co każdy by chciał robić, zwłaszcza, jak ktoś już potrafi sprawnie tworzyć nowych użytkowników.

Zaczynamy od połączenia się z bazą danych przez terminal, wpisując:
sudo mysql -u root

Następnie wpisujemy poniższe zapytanie, zamieniając w nim frazę „TWOJE_HASLO” na faktyczne hasło, którym chcemy się posługiwać, przy dostępie do głównego konta naszej bazy danych:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'TWOJE_HASLO';



Następnie wpisujemy:
FLUSH PRIVILEGES;



Wszystko. Możemy wyjść z komend MySQL wpisując exit.
Jeśli wszystko zrobiliśmy dobrze, to możemy przetestować, czy wszystko działa jak należy, czyli czy możemy podłączyć się do naszej bazy danych. Ja do tego celu użyję MySQL Workbench. Wpisujemy w nim host localhost, port 3306, użytkownik root i hasło które ustawiliśmy wcześniej. Gdy cały projekt konfiguracji przebiegł poprawnie, powinniśmy móc się podłączyć bez żadnego komunikatu błędu.

Podsumowanie

Po wszystkich powyższych krokach, Wasze środowisko programistyczne jest już gotowe do pracy. Nie pozostaje więc nic, tylko stworzyć pierwszy projekt w PHP. Niebawem napiszę artykuł, jak taki projekt stworzyć od zera, jednak w międzyczasie zachęcam do samodzielnego eksperymentowania. Gdyż nic tak nie uczy programowania, jak właśnie praktyka 😄

Pamiętajcie też, że powyższy setup jest odzwierciedleniem mojej konfiguracji. Jeśli czujecie się źle z jakąś jej częścią, to powinniście ją dostosować pod siebie. To Wasze środowisko i to Wy powinniście zadbać, by było komfortowe i by można było łatwo i bezproblemowo pracować nad projektami.

Related Posts