Konfiguracja aplikacji PHP na serwerze VPS

Na przykładzie serwera VPS usługodawcy Digital Ocean z systemem operacyjnym Linux Ubuntu. VPS to inaczej prywatny serwer wirtualny w chmurze, który gwarantuje nam określone zasoby np. pamięć RAM, ilość wątków procesora i przestrzeń dyskową. Parametry te można dowolnie wirtualnie zwiększać.

Spis treści

Połączenie z serwerem VPS z poziomu konsoli

Przy zakupie dropletu należy dobrać odpowiednie parametry takie jak: lokalizacja zdalnego serwera, typ systemu operacyjnego, wybór zasobów oraz metoda autentykacji. Z VPS można połączyć się za pomocą logowania hasłem lub klucza SSH. Jeśli wybierzemy zwykłe logowanie to zostaniemy poproszeni o wpisanie hasła, które będzie przypisane użytkownikowi root (administratorowi). Z kolei jeśli wybierzemy logowanie za pomocą klucza SSH to należy na lokalnej maszynie – z której będziemy się logować – wygenerować unikalny klucz (publiczny i prywatny), przy czym dzielimy się kluczem publicznym. Następnie ustalamy hasło dla użytkownika root.

Przy pierwszym logowaniu zostajemy zalogowani jako użytkownik root, który posiada władzę nad wszystkimi operacjami. Dobrą praktyką jest utworzenie nowego użytkownika i wykonywać wszelkie operacje jako użytkownik o mniejszej władzy niż root, z możliwością podniesienia uprawnień za pomocą aliasu „sudo”. Jeśli logowaliśmy się jako root poprzez klucz SSH, to folder .ssh użytkownika root musimy przekopiować do folderu nowego użytkownika, aby móc się zalogować również jako nowy użytkownik.

Instalacja serwera Apache

Przejdźmy teraz do instalacji pakietu LAMP (Linux, Apache, MySQL, PHP). System Linux Ubuntu mamy już zainstalowany na droplecie, ponadto załóżmy, że projektowana aplikacja testowa nie będzie wykorzystywała bazy danych, dlatego pominiemy instalację MySQL. Pozostaje Apache i PHP. Zacznijmy od serwera Apache. Na początku aktualizacja pamięci podręcznej menadżera pakietów:

sudo apt update

i następnie instalację uruchamiany komendą:

sudo apt install apache2

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

sudo systemctl status apache2

Głównym plikiem konfiguracyjnym jest plik apache2.conf, zatem jeśli chcemy wpłynąć na globalne ustawienia serwera to należy tam odszukać odpowiednią dyrektywę i wprowadzić ewentualne zmiany. Cześć zmian można dokonać za pomocą innych plików konfiguracyjnych, o których w dalszej części artykułu.

Aby przetestować czy wszystko działa poprawnie, należy wpisać publiczne IP serwera w przeglądarce internetowej. Jednak tym razem strona startowa Apache jeszcze się nie wyświetli. Musimy najpierw skonfigurować firewalla.

Konfiguracja firewalla ufw

Domyślnie firewall (ściana ogniowa, zapora) nie jest ustawiony, czyli wszystkie porty są otwarte. Aby zabezpieczyć się przed przeszukiwaniem przez boty otwartych portów na danym adresie IP serwera, należy włączyć zabezpieczenie firewall. Zanim to zrobimy należy najpierw zezwolić na ruch na konkretnych portach.

Ruch odbywający się poprzez protokół http serwowany jest na porcie 80, natomiast domyślnym portem sieciowym dla serwerów korzystających z protokołu https jest port 443.

Zatem mając zainstalowany serwer Apache domyślną stronę Apache wyświetlimy poprzez protokół http. Odblokujmy go komendą:

sudo ufw allow in "Apache"

Gdybyśmy poszli o krok dalej i wygenerowali certyfikat np. Let’s Encrypt dla domeny wskazującej na adres IP naszego VPS, wtedy ruch odbywałby się protokołem https i aby zezwolić na taki ruch użylibyśmy komendy:

sudo ufw allow in "Apache Secure"

lub zezwalając od razu na oba protokoły:

sudo ufw allow in "Apache Full"

Dodatkowo logując się do serwera za pomocą klucza SSH należy zezwolić na tą komunikację komendą:

sudo ufw allow OpenSSH

Dopiero teraz zamykamy wszystkie pozostałe porty:

sudo ufw enable

Od teraz firewall jest aktywowany i będzie uruchamiany domyślnie przy włączaniu systemu. Podsumowanie otwartych portów możemy sprawdzić komendą:

sudo ufw status

Test usługi Apache

Teraz dopiero przetestujmy czy serwer Apache został poprawnie zainstalowany wpisując w przeglądarce internetowej adres:

http://publiczne_ip_serwera

w tym momencie na ekranie powinna pojawić się domyślna strona Apache – Apache2 Ubuntu Default Page.

Instalacja PHP

Teraz przejdźmy do instalacji ostatniego składnika pakietu LAMP, czyli PHP. Instalację rozpoczynamy komendą:

sudo apt install php libapache2-mod-php

Można opcjonalnie zainstalować dodatkowe rozszerzenia np. php-mysql, php-mbstring, php-curl, …, w zależności od potrzeb.
Po zakończeniu instalacji, komendą:

php -v

sprawdzamy zainstalowaną wersję PHP.

Konfiguracja VirtualHosta i wyświetlenie strony startowej

W katalogu /var/www utwórzmy folder naszego projektu o nazwie projekt-testowy, a w nim kolejny folder o nazwie public, z kolei w folderze public plik o nazwie index.php. Będąc w katalogu www można to zrobić za pomocą komendy:

sudo mkdir projekt-testowy
sudo mkdir projekt-testowy/public
sudo nano projekt-testowy/public/index.php

a w pliku index.php wpiszmy:

<?php
echo "Cześć, tutaj Twoja aplikacja php.";

Pora na skonfigurowanie VirtualHosta dla naszego projektu, zatem w lokalizacji /etc/apache2/sites-available tworzymy nowy plik konfiguracyjny o nazwie naszego projektu z rozszerzeniem .conf:

sudo nano projekt-startowy.conf

gdzie w utworzonym pliku wpisujemy następujące dyrektywy:

<VirtualHost *:80>
    DocumentRoot /var/www/projekt-startowy/public

    <Directory /var/www/projekt-startowy/public>
        AllowOverride All
        Options -Indexes
    </Directory>
</VirtualHost>

DocumentRoot wskazuje serwerowi na lokalizację strony startowej. Ustawienie AllowOverride określa czy pliki .htaccess mogą nadpisywać ustawienia z głównej konfiguracji Apache, gdzie All zezwala na tą czynność. Ustawienie Options -Indexes uniemożliwia wyświetlanie plików lub katalogów z zewnątrz, a jednocześnie pozwala mieć do nich dostęp przez bezpośrednie linki. To nie jedyne ustawienia, które można/należy wprowadzić, inne to m. in. ServerName, ServerAlias czy ServerAdmin, jednak te informacje uzupełnilibyśmy mając już wykupioną domenę. Wtedy też utworzony plik konfiguracyjny nazwalibyśmy nasza_domena.conf.

Aby wprowadzić w życie nową konfigurację, należy użyć komendy:

sudo a2ensite projekt-testowy.conf

następnie wyłączyć domyślny plik konfiguracyjny:

sudo a2dissite 000-default.conf

Po dokonanych modyfikacjach należy zrestartować usługę apache2:

sudo systemctl reload apache2

i sprawdzić jej status:

sudo systemctl status apache2

Jeżeli wszystko przebiegło pomyślnie to po wpisaniu w przeglądarce internetowej poniższy adres URL:

http://publiczne_ip_serwera

powinno się wyświetlić echo, które zamieściliśmy w pliku index.php, czyli „Cześć, tutaj Twoja aplikacja PHP.”.

Plik konfiguracyjny php.ini

Plik konfiguracyjny php.ini jest odpowiedzialny za globalne ustawienia PHP. Ustawień jest naprawdę sporo, ale chciałbym zwrócić uwagę na kilka poniższych:

post_max_size = 8M
upload_max_filesize=2M
max_file_uploads=20

Powyżej przedstawiłem ustawienia domyślne. Jeśli planujemy przesyłać metodą POST pliki znacznych rozmiarów to pozostawiając ustawienia domyślne może okazać się, że backend (api) nie będzie otrzymywać przesyłanych plików z frontendu. Wiedząc jakie rozmiary plików będziemy przesyłać warto dostosować ustawienia pod swoje wymagania i oczywiście możliwości serwera VPS. Zmienna post_max_size powinna być większa od zmiennej upload_max_filesize.

Aby zapisać zmiany należy zrestartować serwer Apache komendą:

sudo systemctl restart apache2

Uruchamianie aplikacji PHP zawierającej własny routing

Zakładamy, że aplikacja posiada własny routing i publiczny index.php obsługuje wszystkie żądania, czyli te, które występują i te które nie występują.

Posiadając już zezwolenie na używanie pliku .htaccess możemy przejść do wprowadzenia dyrektywy pozwalającej na korzystanie z własnego routingu w aplikacji PHP. Za pomocą poniższych zdań przekazujemy serwerowi Apache, że będziemy obsługiwać routing poprzez kod PHP.

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^ /index.php [L]

Powyższe ustawienia zapisujemy w pliku VirtualHost wskazującym na katalog projektu lub w pliku .htaccess znajdującym się w publicznym folderze projektu, bo nie chcemy stosować tych zmian na całym serwerze – jest to dodatkowy środek bezpieczeństwa.

Najpierw włączamy moduł RewriteEngine On, dzięki czemu serwer Apache wie, że ma poszukać odpowiedniego pliku na podstawie adresu URL.

Następnie dodajemy warunki RewriteCond, gdzie pierwszy sprawdza czy istnieje dana ścieżka, a drugi dany katalog. Oba warunki mają znak „!”, czyli jeśli serwer nie znajdzie żądanej ścieżki lub katalogu w folderze projektu to spełnia się ostatni warunek RewriteRule. Ostatni warunek przekierowuje na publiczny index.php, który obsługuje wszystkie żądania.

 

Scroll to Top