NGINX
#nginx#wordpress#php-fpm#cms#fastcgi#permalinks

Nginx: конфигурация для WordPress с PHP-FPM

Официальная конфигурация Nginx для WordPress с PHP-FPM, поддержкой pretty permalinks, кеширования и безопасности. Основано на документации WordPress.org.

Конфигурация Nginx для WordPress с PHP-FPM. Основано на официальной документации WordPress.org Advanced Administration Handbook.

Базовая конфигурация (одиночный сайт)

server {
    listen 80;
    server_name example.com www.example.com;
    
    root /var/www/wordpress;
    index index.php index.html;
    
    access_log /var/log/nginx/wordpress-access.log;
    error_log  /var/log/nginx/wordpress-error.log;
    
    # Favicon и robots.txt
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    
    # Защита скрытых файлов
    location ~ /\. {
        deny all;
    }
    
    # Защита PHP в директории uploads
    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }
    
    # Основной location с поддержкой pretty permalinks
    location / {
        # Включаем ?$args для поддержки query string в permalinks
        try_files $uri $uri/ /index.php?$args;
    }
    
    # Обработка PHP
    location ~ \.php$ {
        # ВАЖНО: должно быть cgi.fix_pathinfo = 0 в php.ini
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
    }
    
    # Кеширование статических файлов
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires max;
        log_not_found off;
    }
}

С поддержкой HTTPS

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com www.example.com;
    
    root /var/www/wordpress;
    index index.php index.html;
    
    # SSL сертификаты
    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;
    
    access_log /var/log/nginx/wordpress-access.log;
    error_log  /var/log/nginx/wordpress-error.log;
    
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }
    
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    
    location ~ /\. {
        deny all;
    }
    
    location ~* /(?:uploads|files)/.*\.php$ {
        deny all;
    }
    
    location / {
        try_files $uri $uri/ /index.php?$args;
    }
    
    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        fastcgi_intercept_errors on;
    }
    
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires max;
        log_not_found off;
    }
}

Важные замечания

⚠️ Pretty Permalinks: Директива try_files $uri $uri/ /index.php?$args; критически важна для работы pretty permalinks в WordPress. Без ?$args query string будет потерян.

⚠️ php.ini: В php.ini должно быть установлено cgi.fix_pathinfo = 0; для безопасности. Это стандартная настройка в современных версиях PHP.

⚠️ Защита uploads: WordPress позволяет загружать файлы в директорию uploads. Важно запретить выполнение PHP в этой директории для предотвращения атак.

⚠️ Нет .htaccess: Nginx не поддерживает .htaccess файлы. Вся конфигурация должна быть на уровне сервера.

Источники: