 Autor: [Adam Nadolny](/autorzy/adam-nadolny) Ekspert DevOps i infrastruktury · Zweryfikowano Kwiecień 2026

1.  [Strona główna](/)
2.  /
3.  [Baza wiedzy](/baza-wiedzy/)
4.  /
5.  Nginx konfiguracja 

# Nginx — konfiguracja virtual hosts na VPS

Ostatnia aktualizacja: kwiecień 2026

**TL;DR:** Utwórz plik w `/etc/nginx/sites-available/domena.pl`, dodaj blok `server` z `server_name`, `root` i przekazaniem PHP do FPM. Aktywuj symlinkiem do `sites-enabled/`. Dodaj SSL przez `certbot --nginx -d domena.pl`. Test: `nginx -t`, przeładuj: `systemctl reload nginx`.

## Podstawowa konfiguracja virtual host

Utwórz plik: `/etc/nginx/sites-available/domena.pl.conf`

\# HTTP — przekierowanie na HTTPS (po instalacji SSL przez Certbot)
server {
    listen 80;
    listen \[::\]:80;
    server\_name domena.pl www.domena.pl;

    # Certbot doda tutaj blok ACME challenge automatycznie
    return 301 https://$host$request\_uri;
}

# HTTPS — główny virtual host
server {
    listen 443 ssl http2;
    listen \[::\]:443 ssl http2;
    server\_name domena.pl www.domena.pl;

    # === SSL (uzupełni Certbot) ===
    ssl\_certificate /etc/letsencrypt/live/domena.pl/fullchain.pem;
    ssl\_certificate\_key /etc/letsencrypt/live/domena.pl/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl\_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # === Pliki ===
    root /var/www/domena.pl/public;
    index index.php index.html;

    # === Logi ===
    access\_log /var/log/nginx/domena.pl.access.log;
    error\_log  /var/log/nginx/domena.pl.error.log warn;

    # === PHP-FPM ===
    location ~ \\.php$ {
        try\_files $uri =404;
        fastcgi\_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi\_index index.php;
        include fastcgi\_params;
        fastcgi\_param SCRIPT\_FILENAME $document\_root$fastcgi\_script\_name;
        fastcgi\_param PHP\_VALUE "upload\_max\_filesize=64M \\n post\_max\_size=64M";
        fastcgi\_read\_timeout 300;
    }

    # === Static files cache ===
    location ~\* \\.(css|js|png|jpg|jpeg|gif|ico|svg|woff2|woff|ttf)$ {
        expires 1y;
        add\_header Cache-Control "public, immutable";
        log\_not\_found off;
        access\_log off;
    }

    # === Security headers ===
    add\_header X-Frame-Options "SAMEORIGIN" always;
    add\_header X-Content-Type-Options "nosniff" always;
    add\_header Referrer-Policy "strict-origin-when-cross-origin" always;

    location / {
        try\_files $uri $uri/ =404;
    }
}

\# Aktywacja virtual host
sudo ln -s /etc/nginx/sites-available/domena.pl.conf /etc/nginx/sites-enabled/

# Test konfiguracji (ZAWSZE przed przeładowaniem!)
sudo nginx -t

# Przeładowanie bez downtime
sudo systemctl reload nginx

# Instalacja SSL przez Certbot (zmodyfikuje konfigurację automatycznie)
sudo certbot --nginx -d domena.pl -d www.domena.pl

## Konfiguracja WordPress z Nginx

WordPress wymaga specjalnej konfiguracji `try_files` dla permalinków i blokowania dostępu do wrażliwych plików:

server {
    # ... (ssl, server\_name, root jak wyżej) ...

    # WordPress: przekaż nieznalezione URL do index.php
    location / {
        try\_files $uri $uri/ /index.php?$args;
    }

    # Zablokuj dostęp do .htaccess, .git, wp-config.php
    location ~ /\\. {
        deny all;
        return 404;
    }
    location ~\* /(?:uploads|files)/.\*\\.php$ {
        deny all;
    }
    location = /wp-config.php {
        deny all;
    }
    location ~\* /xmlrpc.php {
        deny all;  # blokuj XML-RPC (częsty cel ataków brute-force)
    }

    # PHP-FPM
    location ~ \\.php$ {
        try\_files $uri =404;
        fastcgi\_pass unix:/run/php/php8.2-fpm.sock;
        include fastcgi\_params;
        fastcgi\_param SCRIPT\_FILENAME $document\_root$fastcgi\_script\_name;
    }
}

## Optymalizacja: gzip, timeouts, rate limiting

Te ustawienia wstaw do bloku `http {}` w `/etc/nginx/nginx.conf`:

http {
    # === GZIP ===
    gzip on;
    gzip\_vary on;
    gzip\_min\_length 1000;
    gzip\_comp\_level 6;
    gzip\_types
        text/plain text/css text/xml text/javascript
        application/javascript application/json application/xml
        application/rss+xml image/svg+xml;

    # === TIMEOUTS ===
    client\_body\_timeout   12;
    client\_header\_timeout 12;
    keepalive\_timeout     15;
    send\_timeout          10;
    client\_max\_body\_size  64m;

    # === RATE LIMITING (anty-DDoS) ===
    # Limit 10 żądań/s per IP dla ogólnego ruchu
    limit\_req\_zone $binary\_remote\_addr zone=general:10m rate=10r/s;

    # Surowy limit dla wp-login.php (anty brute-force)
    limit\_req\_zone $binary\_remote\_addr zone=login:10m rate=1r/s;

    # W bloku server {} dodaj:
    # limit\_req zone=general burst=20 nodelay;
    # location = /wp-login.php {
    #     limit\_req zone=login burst=3;
    #     # ... fastcgi\_pass ...
    # }
}

## Diagnostyka i debugowanie

\# Test konfiguracji
sudo nginx -t

# Sprawdzenie błędów w logach (ostatnie 50 linii)
sudo tail -50 /var/log/nginx/error.log
sudo tail -50 /var/log/nginx/domena.pl.error.log

# Aktywne połączenia i status Nginx
sudo systemctl status nginx
sudo nginx -V  # wersja + moduły kompilacji

# Sprawdzenie czy port 443 nasłuchuje
sudo ss -tlnp | grep nginx

# Przeładowanie konfiguracji (zero downtime)
sudo systemctl reload nginx

# Pełny restart (przerywa aktywne połączenia — unikaj na produkcji)
sudo systemctl restart nginx

## Najczęstsze pytania

Gdzie są pliki konfiguracyjne Nginx na Ubuntu? +

Główny plik: /etc/nginx/nginx.conf. Konfiguracje witryn: /etc/nginx/sites-available/ (zapis) i /etc/nginx/sites-enabled/ (symlinki do aktywnych). Logi: /var/log/nginx/access.log i /var/log/nginx/error.log. Pliki WWW domyślnie: /var/www/. Polecenie test konfiguracji: sudo nginx -t. Przeładowanie bez downtime: sudo systemctl reload nginx.

Czym różni się Nginx od Apache w obsłudze PHP? +

Apache z mod\_php obsługuje PHP wewnątrz procesu serwera — każdy worker Apache może wykonywać PHP. Nginx nie ma wbudowanej obsługi PHP — deleguje żądania .php do zewnętrznego PHP-FPM przez FastCGI. Nginx jest wydajniejszy przy obsłudze wielu równoczesnych połączeń (event-driven, non-blocking), Apache jest prostszy w konfiguracji (.htaccess). Na VPS z Nginx + PHP-FPM zazwyczaj osiąga się lepsze wyniki niż Apache + mod\_php przy tym samym sprzęcie.

Jak skonfigurować Nginx dla wielu domen na jednym VPS? +

Stwórz osobny plik w /etc/nginx/sites-available/ dla każdej domeny (np. domena1.pl.conf, domena2.pl.conf). Każdy plik zawiera blok server {} z własnym server\_name i root. Aktywuj przez symlink: sudo ln -s /etc/nginx/sites-available/domena.pl.conf /etc/nginx/sites-enabled/. Po dodaniu każdej domeny: sudo nginx -t && sudo systemctl reload nginx. Dla SSL użyj certbot --nginx -d domena.pl (certbot sam doda blok https do konfiguracji).

Jak włączyć kompresję gzip w Nginx? +

W /etc/nginx/nginx.conf w bloku http {}: gzip on; gzip\_vary on; gzip\_min\_length 1000; gzip\_proxied expired no-cache no-store private auth; gzip\_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss; gzip\_comp\_level 6; Sprawdź czy gzip działa: curl -H "Accept-Encoding: gzip" -I https://twoja-domena.pl/ — szukaj nagłówka Content-Encoding: gzip. Gzip zmniejsza rozmiar odpowiedzi HTML/CSS/JS o 60-80%.

## Do testów Nginx najlepiej nada się VPS z pełnym dostępem

Poniższe oferty mają sens, jeśli chcesz samodzielnie skonfigurować server blocki, SSL i PHP-FPM.

Mikrus

Dobry na tani lab, staging i mniejsze wdrożenia.

VPS

[Aktywuj rabat →](/out/mikrus)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/mikrus)

Contabo

Opcja do porównania większej ilości RAM i vCPU.

Zasoby

[Aktywuj rabat →](/out/contabo)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/contabo)

ProSerwer.pl

Polski punkt odniesienia dla własnej konfiguracji systemu.

PL VPS

[Aktywuj rabat →](/out/proserwer-pl)

#Reklama · link partnerski

[Zobacz kod rabatowy →](/kody-rabatowe/proserwer)

## Powiązane strony

-   [PHP-FPM — konfiguracja i optymalizacja](/baza-wiedzy/php-fpm-konfiguracja-optymalizacja)
-   [SSL Let's Encrypt — automatyzacja](/baza-wiedzy/ssl-lets-encrypt-automatyzacja)
-   [Docker na VPS](/baza-wiedzy/docker-na-vps)
-   [LiteSpeed vs Apache vs Nginx](/baza-wiedzy/litespeed-vs-apache-vs-nginx)
-   [Porównanie VPS](/vps/)
-   [Baza wiedzy](/baza-wiedzy/)