Generator Nginx PHP-FPM
Blok server dla Laravel, WordPress lub zwykłego PHP: gniazdo FPM, HTTPS, limity i polecenia wdrożenia.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
Typowe wartości, wstaw jednym kliknięciem:
Zmieniono dane. Kliknij „Generuj blok”, aby odświeżyć wynik.
Domena
HTTPS
Nagłówki bezpieczeństwa
Bloków location
Linii
Rozmiar
Blok server dla nginx
- Uwaga: Konfiguracja bez HTTPS. Na stronie dostępnej publicznie włącz HTTPS.
Jak wdrożyć (Debian / Ubuntu)
Ściąga: co robią dyrektywy w tej konfiguracji
| Dyrektywa | Do czego służy |
|---|---|
| server_name | Nazwy domen obsługiwane przez ten blok; kilka nazw oddzielasz spacją. |
| root | Katalog z plikami strony. Laravel: katalog public, WordPress: katalog z wp-config.php. |
| try_files $uri $uri/ /index.php?$query_string | Najpierw plik, potem katalog, na końcu przekazanie żądania do index.php (ładne adresy URL). W trybie „Zwykły PHP” zamiast tego jest =404. |
| try_files $uri =404 (w bloku PHP) | Zwraca 404 dla nieistniejących plików .php zamiast przekazywać je do PHP-FPM. |
| fastcgi_pass | Adres PHP-FPM: unix:/ścieżka.sock albo adres:port. Musi się zgadzać z parametrem listen w puli PHP-FPM. |
| fastcgi_param SCRIPT_FILENAME | Pełna ścieżka skryptu przekazywana do PHP. Zły root kończy się komunikatem „File not found.” |
| client_max_body_size | Maksymalny rozmiar żądania, np. wysyłanego pliku. Po przekroczeniu nginx zwraca błąd 413. |
| fastcgi_read_timeout | Jak długo nginx czeka na odpowiedź PHP. Po przekroczeniu zwraca błąd 504. |
| location ~ /\.(?!well-known) | Blokuje pliki i katalogi zaczynające się od kropki (.env, .git). Wyjątek .well-known jest potrzebny m.in. do weryfikacji domeny przy Let’s Encrypt. |
Typowe błędy nginx z PHP-FPM
| Objaw | Zwykła przyczyna | Co sprawdzić |
|---|---|---|
| 502 Bad Gateway | nginx nie łączy się z PHP-FPM | Czy usługa PHP-FPM działa i czy fastcgi_pass zgadza się z parametrem listen w puli (Debian/Ubuntu: /etc/php/<wersja>/fpm/pool.d/www.conf). |
| 502 i „permission denied” w error.log | brak uprawnień do gniazda | Parametry listen.owner i listen.group w puli powinny wskazywać użytkownika, na którym działa nginx (często www-data). |
| „File not found.” | zły root lub nazwa skryptu | Czy root wskazuje katalog z index.php i czy użytkownik PHP-FPM ma do niego dostęp. |
| 404 z nginx na podstronach | brak przekazania do index.php | Czy blok location / ma try_files z /index.php na końcu (nie dotyczy trybu „Zwykły PHP”). |
| Przeglądarka pobiera plik .php | blok PHP nie jest używany | Czy konfiguracja jest włączona i przeładowana oraz czy nginx -t nie zgłasza błędów. |
| 413 Request Entity Too Large | za mały client_max_body_size | Zwiększ też upload_max_filesize i post_max_size w php.ini, bo PHP ma własne limity. |
| 504 Gateway Time-out | skrypt działa dłużej niż fastcgi_read_timeout | Zwiększ timeout oraz max_execution_time w PHP albo przenieś zadanie do kolejki. |
Gniazdo unix czy TCP
Gniazdo unix (unix:/ścieżka.sock) działa tylko na tym samym serwerze i nie otwiera portu sieciowego. Adres TCP (127.0.0.1:9000) wybierz, gdy PHP-FPM działa w innym kontenerze lub na innej maszynie. Wartość musi być identyczna z parametrem listen w puli PHP-FPM.
Nagłówki add_header i dziedziczenie
Jeśli blok location ma własną dyrektywę add_header, nginx nie dziedziczy nagłówków z poziomu server. Dlatego przy włączonej pamięci podręcznej plików statycznych nagłówki bezpieczeństwa są powtórzone w tym bloku.
Certyfikat przed przeładowaniem
Konfiguracja z HTTPS odwołuje się do plików certyfikatu. Jeśli ich nie ma, nginx -t zgłosi błąd i konfiguracji nie da się przeładować. Wystaw certyfikat przed włączeniem bloku z HTTPS.
Parametr http2 w listen
W nowszych wersjach nginx (od 1.25.1) parametr http2 w dyrektywie listen jest oznaczony jako przestarzały i zastępuje go osobna dyrektywa http2 on. Starsze wersje jej nie znają, dlatego generator używa składni działającej wszędzie.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator Nginx dla PHP-FPM
Nginx z PHP-FPM to najczęstsza konfiguracja aplikacji PHP na VPS-ie. Nginx serwuje pliki statyczne, a żądania do skryptów .php przekazuje przez FastCGI do procesu PHP-FPM. Generator buduje gotowy blok server dla trzech typów aplikacji: Laravel, WordPress i zwykły PHP, razem z nazwą pliku .conf i poleceniami wdrożenia dla Debiana i Ubuntu.
Najważniejsze dyrektywy
| Element | Rola | Wartość w generatorze |
|---|---|---|
| try_files | kierowanie żądań do front controllera | /index.php?$query_string (Laravel, WordPress) lub =404 (zwykły PHP) |
| fastcgi_pass | przekazanie PHP do gniazda FPM | domyślnie unix:/run/php/php8.3-fpm.sock |
| client_max_body_size | limit rozmiaru żądania, np. uploadu | domyślnie 64m, 0 wyłącza limit |
| fastcgi_read_timeout | czas oczekiwania na odpowiedź PHP | od 1 do 3600 s, domyślnie 60 |
| Cache statyków | długie nagłówki dla CSS, JS, obrazów i fontów | expires 365d i Cache-Control „public, immutable” |
Laravel, WordPress i zwykły PHP
Laravel używa katalogu public jako root, a wszystkie adresy bez istniejącego pliku trafiają do public/index.php. WordPress działa na katalogu z wp-config.php i również potrzebuje przekazania do index.php, inaczej ładne permalinki zwracają 404. Tryb „Zwykły PHP” (root /var/www/html) nie ma front controllera: nieistniejący adres kończy się błędem 404 zamiast przekierowania do index.php.
Bezpieczeństwo
- Generator domyślnie blokuje pliki ukryte (
.git,.env), z wyjątkiem.well-knownpotrzebnego do weryfikacji domeny. - Opcjonalnie dodaje nagłówki X-Content-Type-Options, X-Frame-Options i Referrer-Policy, a przy HTTPS także HSTS na rok.
- Dostęp do
xmlrpc.phpw WordPressie i zakaz wykonywania PHP w katalogu uploadów musisz dopisać ręcznie (przykłady niżej).
Jak działa generator Nginx PHP-FPM
Generator buduje statyczny fragment konfiguracji Nginx na podstawie wybranych opcji: typu aplikacji, domen (do 10, oddzielonych spacją), katalogu głównego, adresu gniazda FPM, limitu uploadu i timeoutu. Nie łączy się z serwerem i nie uruchamia usług. Wynikiem jest blok server do skopiowania lub pobrania jako plik nazwany od pierwszej domeny, np. example.com.conf, który wklejasz do sites-available i włączasz przez symlink.
Mechanizm opiera się na podziale ról. Nginx najpierw sprawdza dopasowania dokładne (location = /favicon.ico), potem bloki z wyrażeniami regularnymi w kolejności zapisu, a gdy żaden nie pasuje, używa location /. Dla pliku statycznego zwraca go bezpośrednio z dysku z nagłówkami cache. Dla adresu, który nie wskazuje istniejącego pliku, reguła try_files kieruje żądanie do index.php. Dopiero wtedy działa blok PHP z fastcgi_pass, który przekazuje je do PHP-FPM przez gniazdo Unix lub TCP. Linia try_files $uri =404 wewnątrz bloku PHP zwraca 404 dla nieistniejących skryptów, zamiast przekazywać je do FPM.
Najczęstsze źródło problemów to niespójność dwóch wartości: root oraz SCRIPT_FILENAME. Generator składa SCRIPT_FILENAME z $document_root$fastcgi_script_name, więc wystarczy poprawny root. W Laravel root wskazuje katalog public; jeśli podasz inny, narzędzie pokaże ostrzeżenie. W WordPress root to katalog z wp-config.php, a front controller to index.php w tym samym miejscu.
Przykład konfiguracji krok po kroku
- Wybierz tryb i root. Kliknięcie presetu ustawia root: Laravel /var/www/app/public, WordPress /var/www/wordpress, zwykły PHP /var/www/html. Domena w przykładzie to example.com z zaznaczoną opcją „Dodaj też www”, więc server_name to example.com www.example.com.
- Ustal gniazdo PHP-FPM. Dla PHP 8.3 na Debianie i Ubuntu typowy adres to unix:/run/php/php8.3-fpm.sock, na RHEL i Fedorze unix:/run/php-fpm/www.sock. Sprawdź parametr listen w pliku puli, np. /etc/php/8.3/fpm/pool.d/www.conf. Jeśli PHP-FPM działa w osobnym kontenerze, wpisz adres TCP, np. 127.0.0.1:9000.
- Reguła try_files. Dla Laravel i WordPress generator wstawia try_files $uri $uri/ /index.php?$query_string;. W Nginx zmienne $query_string i $args mają tę samą wartość, więc często spotykany w poradnikach WordPressa wariant z $args działa identycznie.
- Włącz HTTPS. Opcja HTTPS dodaje osobny blok na porcie 80 z przekierowaniem 301 oraz blok na 443 ze ścieżkami /etc/letsencrypt/live/example.com/fullchain.pem i privkey.pem. W poleceniach wdrożenia pojawi się sudo certbot certonly --nginx -d example.com -d www.example.com.
- Ustaw limity. Zwiększ client_max_body_size, jeśli aplikacja przyjmuje duże uploady (format 512k, 64m, 1g). Timeout FastCGI powyżej 300 s narzędzie oznacza ostrzeżeniem, bo długie żądania blokują procesy PHP-FPM.
- Sprawdź i przeładuj. Zapisz plik, wykonaj sudo nginx -t i dopiero potem sudo systemctl reload nginx. Oczekiwany wynik to strona z kodem 200. Jeśli gniazdo FPM jest błędne, pojawi się 502 Bad Gateway, a szczegóły znajdziesz w /var/log/nginx/error.log.
Tabela referencyjna: Laravel, WordPress i zabezpieczenia
| Obszar | Laravel | WordPress |
|---|---|---|
| Katalog główny | public w katalogu projektu | katalog z index.php i wp-config.php |
| Front controller | public/index.php | index.php w root |
| try_files | $uri $uri/ /index.php?$query_string | to samo (wariant z $args jest równoważny) |
| Pliki ukryte | blokuj .env i .git | blokuj .htaccess, .git i inne pliki kropkowe |
| PHP-FPM | fastcgi_pass do gniazda Unix lub TCP | tak samo, z tym samym SCRIPT_FILENAME |
| Uploady | pliki użytkowników trzymaj w storage, poza public | dopisz zakaz wykonywania PHP w wp-content/uploads |
| xmlrpc.php | nie występuje | location = /xmlrpc.php { deny all; }, jeśli nieużywany |
| Cache statyków | pliki z Vite mają hash w nazwie, 365 dni jest bezpieczne | motywy dodają ?ver= do adresu; obrazy podmieniane pod tą samą nazwą mogą się nie odświeżyć |
Praktyczne wskazówki przed wdrożeniem
- Najpierw zweryfikuj gniazdo FPM. Nazwa pliku zależy od wersji PHP i konfiguracji puli. Zamiast zgadywać, otwórz plik pool.d/www.conf i skopiuj wartość listen. Dzięki temu unikniesz 502 Bad Gateway po reloadzie.
- Certyfikat przed blokiem HTTPS. Nginx -t zgłosi błąd, jeśli plików fullchain.pem i privkey.pem jeszcze nie ma. Wdróż najpierw wersję bez HTTPS, wystaw certyfikat przez certbot, a potem podmień konfigurację.
- Nie wystawiaj portu FPM na świat. PHP-FPM nie ma uwierzytelniania. Przy adresie TCP innym niż 127.0.0.1 lub localhost generator pokazuje ostrzeżenie; taki port zamknij w firewallu.
- Zablokuj wykonywanie PHP w katalogach zapisywalnych. W WordPressie dodaj przed blokiem PHP regułę
location ~* /wp-content/uploads/.*\.php$ { deny all; }. Bloki regex działają w kolejności zapisu, więc ta reguła musi stać wyżej niżlocation ~ \.php$. Sam zakaz nie chroni przed wszystkim, ale utrudnia uruchomienie webshella.
Czego generator nie uwzględnia
- Stanu środowiska. Narzędzie nie sprawdza, czy PHP-FPM działa, czy gniazdo istnieje i czy Nginx ma do niego uprawnienia. Te informacje musisz potwierdzić na serwerze.
- Konfiguracji PHP. Limity uploadu, memory_limit, czas wykonania i opcache ustawia się w php.ini lub w puli FPM. Sam client_max_body_size w Nginx nie wystarczy do obsługi dużych plików.
- Certyfikatów spoza Let’s Encrypt i wielu witryn. Ścieżki certyfikatu zakładają certbota. Inny dostawca wymaga ręcznej zmiany ssl_certificate, a każda kolejna aplikacja z innym root potrzebuje osobnego bloku server.
- Zaawansowanego proxy i kontenerów. Jeśli przed Nginx stoi Traefik, load balancer albo CDN, potrzebne są nagłówki X-Forwarded-For, X-Forwarded-Proto i zaufane adresy proxy. Generator nie modeluje całego łańcucha.
Najczęstsze pytania
Jaki socket PHP-FPM wpisać w Nginx?
Na Debianie i Ubuntu zwykle unix:/run/php/phpX.Y-fpm.sock, gdzie X.Y to wersja PHP, na RHEL i Fedorze unix:/run/php-fpm/www.sock. Dokładną wartość znajdziesz w parametrze listen puli, np. /etc/php/8.3/fpm/pool.d/www.conf. W kontenerach częściej używa się TCP, np. 127.0.0.1:9000.
Dlaczego Nginx zwraca 502 Bad Gateway?
Nieprawidłowa ścieżka gniazda FPM, zatrzymana usługa PHP-FPM lub brak uprawnień do gniazda. Przy „permission denied” w error.log sprawdź listen.owner i listen.group w puli: powinny wskazywać użytkownika Nginx, zwykle www-data.
Czy client_max_body_size wystarczy do dużych uploadów?
Nie. Domyślnie Nginx przyjmuje 1 MB, a PHP ma własne limity upload_max_filesize i post_max_size. Ustaw wszystkie trzy spójnie, np. 64m w Nginx i php.ini, inaczej żądanie odrzuci ta warstwa, która ma niższy limit.
Czy generator Nginx PHP-FPM obsługuje Laravel i WordPress?
Tak, ma presety Laravel (root w public), WordPress (root w katalogu z wp-config.php) i zwykły PHP bez front controllera. Konfiguracja nie zależy od wersji frameworka ani CMS.
Dlaczego WordPress zwraca 404 po zmianie permalinków?
Nginx nie czyta pliku .htaccess, więc permalinki działają tylko z regułą try_files kończącą się na /index.php. Sprawdź też, czy root wskazuje katalog z wp-config.php, i przeładuj Nginx.
Jak zablokować dostęp do .env i wp-config.php w Nginx?
Generator domyślnie dodaje regułę deny all dla wszystkich ścieżek zaczynających się od kropki (.env, .git) z wyjątkiem .well-known. Dla wp-config.php możesz dopisać location = /wp-config.php { deny all; }. Po zmianach uruchom nginx -t.