WordPress su Nginx: La Configurazione Completa per Performance Massima
Apache con .htaccess è il default WordPress. Nginx è il default per chi vuole performance. Nginx serve file statici 2-3x più velocemente di Apache, usa meno RAM per connessione, e gestisce più connessioni concorrenti.
Questo articolo è la configurazione Nginx completa per WordPress: dal server block base alle ottimizzazioni avanzate, pronta da copiare.
Server Block Base
server {
listen 80;
server_name tuosito.com www.tuosito.com;
return 301 https://tuosito.com$request_uri;
}
server {
listen 443 ssl http2;
server_name tuosito.com;
root /var/www/tuosito;
index index.php;
# SSL
ssl_certificate /etc/letsencrypt/live/tuosito.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/tuosito.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# Security headers
include snippets/security-headers.conf;
# WordPress permalink
location / {
try_files $uri $uri/ /index.php?$args;
}
# PHP processing
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
}
# Static files
location ~* \.(css|js|jpg|jpeg|png|gif|ico|webp|avif|woff2|svg)$ {
expires 365d;
add_header Cache-Control "public, immutable";
access_log off;
}
# Block sensitive files
location ~* /\.(htaccess|htpasswd|ini|log|sh|sql)$ { deny all; }
location = /xmlrpc.php { deny all; }
location ~* /wp-content/uploads/.*\.php$ { deny all; }
# Block wp-admin for non-allowed IPs (opzionale)
# location /wp-admin { allow 203.0.113.0/24; deny all; }
# Gzip
gzip on;
gzip_comp_level 5;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml text/javascript image/svg+xml;
}
FastCGI Cache (Aggiunta Raccomandata)
La configurazione completa è nel nostro articolo su velocizzare WordPress senza plugin. In sintesi: aggiungi una cache zone nel nginx.conf e le regole di bypass nel server block.
Rate Limiting per wp-login.php
# In nginx.conf (fuori dal server block)
limit_req_zone $binary_remote_addr zone=wplogin:10m rate=3r/s;
# Nel server block
location = /wp-login.php {
limit_req zone=wplogin burst=5 nodelay;
include fastcgi_params;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
Multisite WordPress su Nginx
# Per WordPress Multisite con subdirectory
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) $2 last;
rewrite ^(/[^/]+)?(/.*\.php) $2 last;
}
Checklist Post-Configurazione
- ☐
nginx -tpassa senza errori - ☐ Homepage carica in HTTPS
- ☐ Redirect HTTP → HTTPS funziona
- ☐ Permalink WordPress funzionano (non 404 sulle pagine)
- ☐ wp-admin accessibile
- ☐ Upload media funziona
- ☐ xmlrpc.php restituisce 403
- ☐ File PHP in uploads restituisce 403
FAQ
Devo migrare da Apache a Nginx?
Se le performance contano (e contano sempre), sì. La migrazione è un evento una tantum. Il beneficio è permanente: meno RAM, più velocità, configurazione più pulita. L’unica complicazione: i file .htaccess non funzionano su Nginx (devi convertire le regole nella config Nginx).
Nginx e WooCommerce?
Funziona perfettamente. L’unica attenzione: escludi /cart/, /checkout/ e /my-account/ dalla FastCGI cache. Il resto del sito beneficia enormemente della cache.