Konfiguracja serwera Apache i PHP na VPS z Ubuntu


Na przykładzie serwera VPS w DigitalOcean z systemem Ubuntu. VPS (Virtual Private Server) to wirtualny serwer w chmurze, który zapewnia określone zasoby, takie jak pamięć RAM, liczba rdzeni CPU oraz przestrzeń dyskowa. W zależności od potrzeb zasoby te można w prosty sposób skalować.

Połączenie z serwerem VPS z poziomu konsoli

Podczas tworzenia dropletu w DigitalOcean należy wybrać lokalizację serwera, system operacyjny, parametry zasobów oraz metodę uwierzytelniania. Najbezpieczniejszą i zalecaną metodą logowania do serwera jest użycie klucza SSH zamiast hasła.

Klucz SSH generujemy na lokalnej maszynie, z której będziemy łączyć się z serwerem. Składa się on z części prywatnej (pozostaje na naszym komputerze) oraz publicznej, którą dodajemy do konfiguracji serwera podczas tworzenia dropletu.

Po utworzeniu serwera możemy połączyć się z nim z poziomu terminala:

Pierwsze logowanie odbywa się na użytkownika root, który posiada pełne uprawnienia administracyjne.

Dobrą praktyką bezpieczeństwa jest utworzenie nowego użytkownika i wykonywanie codziennych operacji z jego poziomu, korzystając z uprawnień administratora jedynie w razie potrzeby za pomocą polecenia sudo.

Instalacja serwera Apache

Przejdźmy teraz do instalacji serwera Apache oraz interpretera PHP na Ubuntu. Klasyczny stos LAMP obejmuje również bazę danych MySQL, jednak w tym przykładzie nie będzie ona potrzebna, ponieważ skupiamy się wyłącznie na konfiguracji serwera WWW i PHP. Zacznijmy od instalacji serwera Apache. Na początku zaktualizujmy listę pakietów:

następnie instalację uruchamiany komendą:

Po zakończeniu instalacji można sprawdzić status serwera Apache:

Plik apache2.conf zawiera ogólne ustawienia serwera Apache, jednak w praktyce rzadko dokonuje się w nim zmian. Konfiguracja Apache na Ubuntu jest podzielona na kilka katalogów, takich jak sites-available, mods-available oraz conf-available. W dalszej części artykułu będziemy korzystać głównie z konfiguracji VirtualHost w katalogu sites-available.

Po instalacji Apache serwer działa poprawnie lokalnie, jednak zanim sprawdzimy go z poziomu przeglądarki, musimy skonfigurować firewall, aby umożliwić dostęp do portu 80 z zewnątrz.

Konfiguracja firewalla UFW

W systemie Ubuntu narzędzie UFW (Uncomplicated Firewall) jest domyślnie zainstalowane, jednak jego reguły nie są aktywne. Dlatego warto je skonfigurować przed wystawieniem usług na zewnątrz.

Zanim włączymy firewall, należy zezwolić na ruch na portach, z których będziemy korzystać. W naszym przypadku będą to:

  • SSH – port 22 (zdalne logowanie),
  • HTTP – port 80 (serwer Apache),
  • HTTPS – port 443 (po instalacji certyfikatu SSL).

UFW posiada predefiniowane profile dla Apache, które upraszczają konfigurację.

Zezwalamy na ruch SSH:

Zezwalamy na ruch HTTP:

Jeśli planujemy korzystać z certyfikatu SSL (np. Let’s Encrypt), możemy od razu dopuścić ruch zarówno dla HTTP, jak i HTTPS:

Po dodaniu wymaganych reguł możemy włączyć firewall:

Sprawdzenie aktywnych reguł:

Od tego momentu UFW będzie uruchamiany automatycznie wraz ze startem systemu i będzie dopuszczał wyłącznie ruch na zdefiniowanych portach.

Test usługi Apache

Po skonfigurowaniu firewalla możemy sprawdzić, czy serwer Apache działa poprawnie. W tym celu wpisujemy w przeglądarce adres IP naszego serwera:

Jeśli instalacja przebiegła prawidłowo, zobaczymy domyślną stronę powitalną Apache – Apache2 Ubuntu Default Page. Oznacza to, że serwer WWW działa i jest dostępny z sieci.

Instalacja PHP

Kolejnym krokiem jest instalacja interpretera PHP, który będzie odpowiedzialny za wykonywanie kodu aplikacji.

W tym przykładzie korzystamy z modułu libapache2-mod-php, który pozwala Apache bezpośrednio obsługiwać pliki PHP. Rozwiązanie to jest w pełni wystarczające dla prostych aplikacji oraz środowisk testowych i znacząco upraszcza konfigurację serwera.

Instalację rozpoczynamy komendą:

W zależności od potrzeb aplikacji można doinstalować dodatkowe rozszerzenia, na przykład:

Po zakończeniu instalacji sprawdzamy zainstalowaną wersję PHP:

Od tego momentu Apache jest gotowy do obsługi plików PHP.

Konfiguracja VirtualHosta i wyświetlenie strony startowej

W katalogu /var/www tworzymy strukturę projektu:

W pliku index.php wpisujemy:

Następnie konfigurujemy VirtualHost w /etc/apache2/sites-available. Tworzymy plik:

i wklejamy:

Wyjaśnienie:

  • DocumentRoot – wskazuje katalog strony startowej,
  • AllowOverride All – pozwala plikom .htaccess nadpisywać ustawienia Apache w katalogu projektu,
  • Options -Indexes – uniemożliwia przeglądanie katalogów przez przeglądarkę.

Włączamy nowy VirtualHost i wyłączamy domyślny:

Domyślnie katalog utworzony przez użytkownika root nie jest dostępny dla Apache. Dlatego musimy zmienić właściciela katalogu na użytkownika www-data oraz nadać odpowiednie prawa dostępu, aby serwer mógł poprawnie odczytywać pliki aplikacji:

Restartujemy Apache, aby zastosować zmiany:

Po wpisaniu w przeglądarce:

powinna wyświetlić się wiadomość:

Plik konfiguracyjny php.ini

Plik php.ini odpowiada za globalne ustawienia interpretera PHP. Znajduje się on w lokalizacji:

(Wersja katalogu może się różnić w zależności od zainstalowanej wersji PHP).

W kontekście przesyłania plików przez formularze HTTP warto zwrócić uwagę na kilka istotnych parametrów:

Są to przykładowe, domyślne wartości. Jeśli planujemy przesyłać pliki o większych rozmiarach, pozostawienie tych ustawień może spowodować, że aplikacja nie będzie otrzymywać danych wysyłanych z frontendu.

Warto dostosować te parametry do potrzeb aplikacji oraz możliwości serwera VPS. Należy pamiętać, że:

  • post_max_size powinno być większe niż upload_max_filesize,
  • memory_limit powinno być większe niż post_max_size.

Po wprowadzeniu zmian należy zrestartować Apache:

Uruchamianie aplikacji PHP zawierającej własny routing

Zakładamy, że aplikacja posiada własny mechanizm routingu, a plik public/index.php obsługuje wszystkie żądania HTTP.

Aby Apache przekazywał żądania do tego pliku, wykorzystamy mechanizm mod_rewrite oraz plik .htaccess.

Najpierw włączamy moduł rewrite:

Następnie w katalogu public tworzymy plik .htaccess:

i dodajemy do niego:

Wyjaśnienie:

  • RewriteEngine On – włącza mechanizm przepisywania adresów,
  • RewriteCond %{REQUEST_FILENAME} !-f – reguła zadziała, jeśli żądanie nie wskazuje na istniejący plik,
  • RewriteCond %{REQUEST_FILENAME} !-d – reguła zadziała, jeśli żądanie nie wskazuje na istniejący katalog,
  • RewriteRule – przekierowuje wszystkie pozostałe żądania do index.php, który obsługuje routing aplikacji.

Dzięki temu możemy korzystać z przyjaznych adresów URL, np.:

zamiast: