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:
ssh root@adres_ip_serwera
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:
sudo apt update
następnie instalację uruchamiany komendą:
sudo apt install apache2
Po zakończeniu instalacji można sprawdzić status serwera Apache:
sudo systemctl status apache2
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:
sudo ufw allow OpenSSH
Zezwalamy na ruch HTTP:
sudo ufw allow in "Apache"
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:
sudo ufw allow in "Apache Full"
Po dodaniu wymaganych reguł możemy włączyć firewall:
sudo ufw enable
Sprawdzenie aktywnych reguł:
sudo ufw status
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:
http://publiczne_ip_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ą:
sudo apt install php libapache2-mod-php
W zależności od potrzeb aplikacji można doinstalować dodatkowe rozszerzenia, na przykład:
sudo apt install php-mysql php-mbstring php-curl
Po zakończeniu instalacji sprawdzamy zainstalowaną wersję PHP:
php -v
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:
sudo mkdir -p /var/www/projekt-testowy/public
sudo nano /var/www/projekt-testowy/public/index.php
W pliku index.php wpisujemy:
<?php
echo "Cześć, tutaj Twoja aplikacja PHP.";
Następnie konfigurujemy VirtualHost w /etc/apache2/sites-available. Tworzymy plik:
sudo nano /etc/apache2/sites-available/projekt-testowy.conf
i wklejamy:
<VirtualHost *:80>
DocumentRoot /var/www/projekt-testowy/public
<Directory /var/www/projekt-testowy/public>
AllowOverride All
Options -Indexes
</Directory>
</VirtualHost>
Wyjaśnienie:
DocumentRoot– wskazuje katalog strony startowej,AllowOverride All– pozwala plikom.htaccessnadpisywać 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:
sudo a2ensite projekt-testowy.conf
sudo a2dissite 000-default.conf
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:
sudo chown -R www-data:www-data /var/www/projekt-testowy
sudo chmod -R 755 /var/www/projekt-testowy
Restartujemy Apache, aby zastosować zmiany:
sudo systemctl restart apache2
sudo systemctl status apache2
Po wpisaniu w przeglądarce:
http://publiczne_ip_serwera
powinna wyświetlić się wiadomość:
Cześć, tutaj Twoja aplikacja PHP.
Plik konfiguracyjny php.ini
Plik php.ini odpowiada za globalne ustawienia interpretera PHP. Znajduje się on w lokalizacji:
/etc/php/WERSJA/apache2/php.ini
(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:
post_max_size = 8M
upload_max_filesize = 2M
max_file_uploads = 20
memory_limit = 128M
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_sizepowinno być większe niżupload_max_filesize,memory_limitpowinno być większe niżpost_max_size.
Po wprowadzeniu zmian należy zrestartować Apache:
sudo systemctl restart apache2
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:
sudo a2enmod rewrite
sudo systemctl restart apache2
Następnie w katalogu public tworzymy plik .htaccess:
sudo nano /var/www/projekt-testowy/public/.htaccess
i dodajemy do niego:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.php [L]
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 doindex.php, który obsługuje routing aplikacji.
Dzięki temu możemy korzystać z przyjaznych adresów URL, np.:
http://adres_ip_serwera/users/15
zamiast:
http://adres_ip_serwera/index.php?route=users&id=15
