Menu
Szybki wybór
Hosting Domeny VPS SSL Kalkulator Porównania FAQ
Aktywne kody
Wszystkie kody rabatowe

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.