WordPress na własnym VPS: nginx, PHP-FPM i MariaDB krok po kroku
WordPress na Ubuntu 24.04: nginx, PHP 8.3-FPM, MariaDB 10.11, certyfikat Let's Encrypt, bezpieczne uprawnienia plików, WP-CLI, kopie bazy i aktualizacje.
Redakcja serwisu Dealownia · ceny i fakty ze stron dostawców, jak sprawdzamy
WordPress pod adresem https://example.pl, na nginx, PHP-FPM i MariaDB, bez panelu hostingowego. Pliki strony należą do Twojego użytkownika, a serwer WWW może zapisywać tylko w katalogu z mediami, więc podatna wtyczka nie podmieni Ci rdzenia WordPressa. Aktualizacje i kopie robi WP-CLI z crona. Komendy są dla Ubuntu 24.04 LTS, bo jego pakiety spełniają wymagania WordPressa bez dodatkowych repozytoriów.
Czego potrzebujesz
- VPS z Ubuntu 24.04 LTS przygotowany jak w poradniku od zera: użytkownik
deployz sudo, klucz SSH, ufw z otwartymi portami 80 i 443. Docker do WordPressa nie jest potrzebny. - Minimum: 1 vCPU, 1 GB RAM z plikiem swap, 15–20 GB dysku. WordPress nie podaje wymagań sprzętowych; podręcznik dla hostingów zaleca
memory_limit256 MB dla typowej strony i 512 MB lub więcej dla sklepu WooCommerce czy page buildera. Przy sklepie albo kilku stronach na jednym serwerze weź 2 GB RAM. - Domenę
example.plz rekordami A (i AAAA) dlaexample.pliwww.example.plwskazującymi serwer. Jak je ustawić, opisuje poradnik o DNS.
Debian 12 ma PHP 8.2, czyli poniżej zalecanej wersji. Na Debianie wybierz wersję 13 – ma PHP 8.4 (gniazdo php8.4-fpm.sock, katalog /etc/php/8.4) i MariaDB 11.8; reszta komend jest taka sama.
Na ten zestaw wybierz plan z co najmniej 1 GB RAM (z plikiem swap), a wygodniej 2 GB.
Pełne porównanie planów jest w rankingu VPS.
Krok 1. Pakiety
Aktualne wymagania WordPressa to PHP 8.3 lub nowszy oraz MariaDB 10.11 lub MySQL 8.0. Ubuntu 24.04 ma dokładnie PHP 8.3 i MariaDB 10.11.
Rozszerzenia pochodzą z listy „wymagane i mocno zalecane” w podręczniku dla hostingów: mysqli, curl, dom/xml, mbstring, zip, intl, imagick, opcache. json, hash, exif i fileinfo są już w pakiecie podstawowym PHP.
Krok 2. Baza danych
Na Ubuntu root bazy loguje się przez gniazdo systemowe (sudo mariadb), więc na pytanie o zmianę na unix_socket możesz odpowiedzieć „n”, a na usunięcie anonimowych kont, testowej bazy i zdalnego logowania roota – „Y”. Potem utwórz bazę i osobnego użytkownika:
Zapisz hasło – za chwilę trafi do wp-config.php. MariaDB z Ubuntu słucha tylko na 127.0.0.1, więc portu 3306 nie otwieraj w ufw.
Krok 3. Ustawienia PHP
Własne ustawienia trzymaj w osobnym pliku, żeby aktualizacja pakietu ich nie nadpisała:
Domyślne upload_max_filesize w PHP to 2 MB, czyli za mało na zwykłe zdjęcie z telefonu. cgi.fix_pathinfo = 0 zaleca dokumentacja WordPressa dla nginx.
Krok 4. WP-CLI i pliki WordPressa
WP-CLI instalujesz jednym plikiem:
Pobierz WordPressa jako deploy, nie jako root:
DISALLOW_FILE_EDIT wyłącza edytor plików w panelu, a DISALLOW_FILE_MODS – instalowanie i aktualizowanie z panelu. To świadomy wybór: wtyczki i aktualizacje robisz przez WP-CLI (krok 8), a proces PHP nie musi mieć prawa zapisu do kodu. Ta stała wyłącza też automatyczne aktualizacje w tle, dlatego w kroku 8 zastępuje je cron. Jeśli wolisz klikać w panelu, pomiń drugą linię i nadaj www-data zapis do całego katalogu – wygodniej, ale włamanie przez wtyczkę może wtedy zmienić każdy plik.
Krok 5. Uprawnienia plików
Dokumentacja WordPressa zaleca katalogi 755 lub 750, pliki 644 lub 640, a wp-config.php 440 lub 400. Właścicielem jest deploy, grupą www-data (użytkownik PHP-FPM i nginx):
PHP czyta kod, ale zapisuje tylko w uploads. wp-config.php z hasłem do bazy czyta wyłącznie właściciel i grupa www-data. Wybraliśmy 755/644 zamiast 750/640, bo pliki z aktualizacji robionych przez WP-CLI powstają z grupą deploy, a nie www-data – przy 640 nginx przestałby je widzieć. Jeśli jakaś wtyczka potrzebuje własnego katalogu z zapisem (cache, logi), daj go jej tak samo jak uploads, a nie cały wp-content.
Krok 6. nginx
Plik /etc/nginx/sites-available/example.pl:
Kolejność ma znaczenie: nginx sprawdza lokalizacje z wyrażeniami regularnymi w kolejności zapisu i bierze pierwszą pasującą. Blokada PHP w uploads musi stać przed ogólnym \.php$, inaczej wrzucony tam skrypt by się wykonał. snippets/fastcgi-php.conf z pakietu Ubuntu zawiera try_files $fastcgi_script_name =404, więc nieistniejące pliki .php nie trafiają do PHP.
Krok 7. Certyfikat i instalacja
Najpierw HTTPS, potem instalacja – wtedy WordPress od początku zapisze adresy z https://:
Bez --admin_password WP-CLI wygeneruje losowe hasło i wypisze je na ekranie. Nie używaj loginu admin – to pierwsze, co próbują boty. Sprawdź, czy przekierowanie z www i z HTTP działa: curl -sI http://www.example.pl | head -3.
Krok 8. Kopie i aktualizacje z crona
Skrypt /home/deploy/wp-maint.sh:
Katalog kopii ma prawa 700, bo zrzut bazy zawiera m.in. skróty haseł użytkowników – nie ustawiamy tu umask 077 dla całego skryptu, bo pliki z aktualizacji wtyczek musi czytać PHP. Kopia jest robiona przed aktualizacją, więc po nieudanej aktualizacji wtyczki masz bazę z tej samej nocy. --minor aktualizuje automatycznie tylko wydania poprawkowe; nową główną wersję (wp core update) instaluj ręcznie po przeczytaniu informacji o wydaniu. Pakiety systemowe, w tym PHP, aktualizuje unattended-upgrades opisany w liście kontrolnej zabezpieczeń. Kopia na tym samym dysku nie chroni przed awarią serwera – wyślij ją poza VPS, jak w poradniku o restic i rclone.
Najczęstsze problemy
- WordPress prosi o dane FTP przy instalacji wtyczki. Tak reaguje, gdy nie może zapisywać plików. Przy układzie z tego poradnika to oczekiwane – instaluj przez
wp plugin install nazwa --activate. Jeśli przycisk w panelu w ogóle się pokazuje, brakujeDISALLOW_FILE_MODS. - 502 Bad Gateway. nginx nie znajduje gniazda PHP-FPM: sprawdź
ls /run/php/i czy wersja wfastcgi_passzgadza się z zainstalowaną (na Debianie 13 tophp8.4-fpm.sock). Logi:sudo tail /var/log/nginx/error.log. - „Błąd podczas nawiązywania połączenia z bazą danych”. Literówka w haśle w
wp-config.phpalbo użytkownik utworzony dla innego hosta. Sprawdźmariadb -u wp -p wordpress -e 'SELECT 1'. - Pętla przekierowań po włączeniu HTTPS. Adres w ustawieniach ma
http://albo wtyczka wymusza inną domenę. Popraw:wp option update home https://example.pli to samo dlasiteurl. - Nie da się wgrać większego pliku (413 albo błąd w panelu).
client_max_body_sizew nginx iupload_max_filesize/post_max_sizew PHP muszą być co najmniej tak duże jak plik. Po zmianie PHP zrestartujphp8.3-fpm.
Co dalej
Przenosisz istniejącą stronę? Migracja z hostingu współdzielonego opisuje kolejność: kopia, przeniesienie, zmiana DNS. Dołóż monitoring dostępności z Uptime Kuma, żeby wiedzieć o awarii przed czytelnikami. Jeśli wahasz się, czy WordPress na VPS ma sens, porównaj koszty w poradniku hosting współdzielony czy VPS.