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

1.  [Strona główna](/) ›
2.  [Baza wiedzy](/baza-wiedzy/) ›
3.  Nginx - konfiguracja virtual hosts na VPS

# Nginx - konfiguracja virtual hosts na VPS

Ostatnia aktualizacja: 8 kwietnia 2026

⚡ W skrócie · 9 min czytania

-   Dobry na tani lab, staging i mniejsze wdrożenia.
-   Podstawowa konfiguracja virtual host.
-   Konfiguracja WordPress z Nginx.
-   Optymalizacja: gzip, timeouts, rate limiting.
-   Diagnostyka i debugowanie.

**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 "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 "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 "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/)
-   [Jaki VPS wybrać?](/jaki-vps-wybrac/)

Autor: [Redakcja HostGrade.pl](/autorzy/) Zespół redakcyjny · Aktualizacja: 8 kwietnia 2026

Artykuły HostGrade.pl przygotowuje i aktualizuje redakcja serwisu. Ceny startowe, ceny odnowienia i warunki planów sprawdzamy w cennikach i regulaminach dostawców, a potem liczymy całkowity koszt za 2 lata (cena startowa plus odnowienia). Zasady zbierania danych i liczenia kosztów opisujemy na stronie Metodologia. Linki partnerskie oznaczamy jako #reklama.

[O redakcji i metodologii →](/autorzy/)