Для обработки PHP-запросов в Nginx используйте блок location с директивой fastcgi_pass. Укажите путь к сокету или адресу PHP-FPM. Например, если PHP-FPM работает на сокете /var/run/php/php7.4-fpm.sock, добавьте в конфигурацию:
location ~ .php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
Убедитесь, что файл snippets/fastcgi-php.conf существует и содержит базовые настройки для обработки PHP. Это упрощает поддержку и минимизирует ошибки.
Для повышения безопасности ограничьте доступ к PHP-файлам. Добавьте проверку на существование файла перед передачей его в PHP-FPM:
location ~ .php$ { try_files $uri =404; include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
Это предотвратит выполнение произвольного кода, если запрошенный PHP-файл отсутствует на сервере.
Оптимизация маршрутизации запросов для PHP
Используйте точные location-блоки для обработки PHP-запросов. Например, вместо location ~ .php$
уточните правила, добавив проверку на существование файла:
location ~ ^/.+.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
include fastcgi_params;
}
Этот подход предотвращает выполнение произвольного кода, если запрошенный PHP-файл отсутствует.
- Настройте кэширование статических файлов, чтобы снизить нагрузку на PHP. Используйте location-блок для обработки статики:
location ~* .(jpg|jpeg|png|gif|ico|css|js|woff|woff2)$ {
expires 30d;
add_header Cache-Control "public, no-transform";
}
Для повышения производительности настройте параметры FastCGI. Увеличьте значения fastcgi_buffers
и fastcgi_buffer_size
:
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
Эти параметры помогают эффективнее обрабатывать большие объемы данных, передаваемых между Nginx и PHP-FPM.
- Используйте
try_files
для маршрутизации запросов. Например, если у вас есть единая точка входа (например, index.php), настройте location-блок следующим образом: - Этот подход упрощает маршрутизацию и уменьшает количество правил в конфигурации.
location / {
try_files $uri $uri/ /index.php?$query_string;
}
Настройте обработку ошибок для PHP-запросов. Добавьте location-блок для кастомных страниц ошибок:
location ~ .php$ {
error_page 500 502 503 504 /custom_50x.html;
fastcgi_intercept_errors on;
}
Это улучшает пользовательский опыт и помогает быстрее диагностировать проблемы.
Как настроить блок location для обработки PHP файлов
Для обработки PHP-файлов в Nginx создайте блок location
с использованием регулярного выражения, которое будет захватывать файлы с расширением .php
. Добавьте следующий код в конфигурацию вашего сервера:
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
Убедитесь, что путь к сокету PHP-FPM (/var/run/php/php8.1-fpm.sock
) соответствует вашей версии PHP. Если используется TCP-соединение, замените unix:/var/run/php/php8.1-fpm.sock
на 127.0.0.1:9000
.
Добавьте директиву include snippets/fastcgi-php.conf
, чтобы включить стандартные параметры FastCGI. Это упрощает конфигурацию и обеспечивает корректную обработку запросов.
Проверьте синтаксис конфигурации с помощью команды nginx -t
. Если ошибок нет, перезагрузите Nginx:
sudo systemctl reload nginx
Для повышения безопасности ограничьте доступ к PHP-файлам, которые не должны выполняться напрямую. Например, добавьте блок location
для защиты конфигурационных файлов:
location ~* /(.ht|config|logs|temp).php$ {
deny all;
}
Эти настройки обеспечат корректную обработку PHP-файлов и защиту от несанкционированного доступа.
Использование регулярных выражений для более гибкого маршрута
Применяйте регулярные выражения в директиве location
для обработки сложных URL-шаблонов. Например, чтобы обрабатывать все запросы, начинающиеся с /api/
, используйте конструкцию location ~ ^/api/
. Это позволяет гибко настраивать маршрутизацию без необходимости прописывать каждый путь вручную.
Для работы с динамическими параметрами в URL, такими как идентификаторы или имена, используйте группы захвата. Например, location ~ ^/user/(d+)$
извлечёт числовой идентификатор пользователя из URL. Полученное значение можно передать в PHP-скрипт через переменную $1
.
Если нужно обрабатывать только определённые расширения файлов, добавьте соответствующий шаблон. Например, location ~ .php$
будет перехватывать все запросы к PHP-файлам. Для большей точности можно указать location ~ .(php|html)$
, чтобы обрабатывать как PHP, так и HTML-файлы.
Используйте модификаторы для уточнения поведения регулярных выражений. Модификатор ~*
делает сравнение регистронезависимым, что полезно для обработки URL в разных форматах. Например, location ~* .(jpg|jpeg|png|gif)$
будет обрабатывать изображения независимо от регистра их расширений.
Для исключения определённых путей из обработки используйте отрицательные регулярные выражения. Например, location !~ ^/static/
пропустит все запросы, начинающиеся с /static/
, и передаст их другим блокам location
.
Помните, что регулярные выражения могут замедлить обработку запросов, если они слишком сложны. Оптимизируйте шаблоны, избегая избыточных конструкций, и тестируйте их производительность.
Настройка дополнительных заголовков для PHP ответов
Для добавления пользовательских заголовков в ответы PHP используйте директиву add_header в конфигурации Nginx. Например, чтобы включить заголовок X-Content-Type-Options: nosniff, добавьте строку в блок location:
location ~ .php$ {
add_header X-Content-Type-Options "nosniff";
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
Если нужно добавить несколько заголовков, перечислите их последовательно. Например, для включения заголовков безопасности добавьте:
location ~ .php$ {
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
Убедитесь, что заголовки применяются только к успешным ответам. Если требуется добавить их для всех типов ответов, используйте параметр always:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
Проверьте конфигурацию на ошибки с помощью команды nginx -t и перезапустите сервер для применения изменений.
Безопасность и производительность: Как Nginx влияет на PHP приложения
Настройте Nginx для обработки PHP через FastCGI, чтобы снизить нагрузку на сервер и ускорить выполнение запросов. Используйте директиву fastcgi_pass
для перенаправления запросов к PHP-FPM, что позволяет эффективно распределять ресурсы и обрабатывать больше одновременных подключений.
Ограничьте доступ к конфиденциальным файлам, таким как .env
или config.php
, с помощью блоков location
в конфигурации Nginx. Например, добавьте правило location ~ /.env { deny all; }
, чтобы предотвратить несанкционированный доступ.
Включите кэширование статических ресурсов, таких как CSS, JavaScript и изображения, чтобы уменьшить время загрузки страниц. Используйте директивы expires
и add_header Cache-Control
для настройки сроков хранения кэша.
Настройте ограничение скорости запросов с помощью модуля limit_req
, чтобы защитить сервер от DDoS-атак и перегрузки. Например, добавьте limit_req_zone
для определения зоны и limit_req
для применения ограничений к конкретным location-блокам.
Используйте SSL/TLS для шифрования данных между клиентом и сервером. Настройте Nginx на использование современных протоколов, таких как TLS 1.3, и отключите устаревшие версии для повышения безопасности.
Регулярно обновляйте Nginx и PHP до последних стабильных версий, чтобы устранить уязвимости и улучшить производительность. Убедитесь, что конфигурационные файлы соответствуют новым требованиям после обновления.
Минимизируйте использование регулярных выражений в location-блоках, так как они могут замедлять обработку запросов. Вместо этого используйте точные совпадения или префиксы, где это возможно.
Проверяйте логи ошибок Nginx (error_log
) и PHP-FPM для своевременного выявления проблем. Настройте мониторинг сервера, чтобы отслеживать производительность и реагировать на инциденты.
Защита конфиденциальных файлов и директорий
Ограничьте доступ к файлам конфигурации и служебным скриптам, добавив в блок location
директиву deny all;
. Например, для защиты файла wp-config.php
в WordPress используйте следующий код:
location ~ /wp-config.php {
deny all;
return 403;
}
Для скрытия директорий с критически важными данными настройте блокировку доступа через регулярные выражения. Например, чтобы закрыть доступ к папке /uploads/private/
, добавьте:
location ~ ^/uploads/private/ {
deny all;
return 404;
}
Используйте аутентификацию через .htpasswd
для дополнительной защиты. Создайте файл с паролями и укажите его в конфигурации:
location /admin/ {
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}
Настройте SSL/TLS для шифрования передаваемых данных. Убедитесь, что конфиденциальные файлы доступны только по HTTPS, добавив в конфигурацию:
location /secure/ {
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}
Регулярно проверяйте права доступа к файлам и директориям. Убедитесь, что владельцем является веб-сервер, а права установлены на уровне 644
для файлов и 755
для директорий.
Кэширование ответов PHP для повышения скорости
Настройте кэширование ответов PHP на уровне Nginx, чтобы уменьшить нагрузку на сервер и ускорить загрузку страниц. Используйте директиву fastcgi_cache
для хранения результатов выполнения PHP-скриптов. Это особенно полезно для страниц с динамическим контентом, которые редко изменяются.
Создайте конфигурацию кэша в основном файле Nginx. Добавьте следующие строки в блок http
:
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=phpcache:100m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
Укажите путь для хранения кэша, задайте зону памяти и время жизни неактивных данных. Затем настройте кэширование для конкретного location:
location ~ .php$ {
fastcgi_cache phpcache;
fastcgi_cache_valid 200 60m;
fastcgi_cache_use_stale error timeout updating;
fastcgi_cache_bypass $no_cache;
fastcgi_no_cache $no_cache;
include fastcgi_params;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
Здесь fastcgi_cache_valid
определяет время хранения кэша для успешных ответов (код 200). Установите значение, которое соответствует частоте обновления вашего контента.
Для управления кэшированием через заголовки HTTP добавьте в PHP-скрипт следующие строки:
header("Cache-Control: public, max-age=3600");
header("X-Accel-Expires: 3600");
Это позволит Nginx учитывать ваши предпочтения при кэшировании. Используйте переменные $no_cache
и $cache_bypass
для гибкого управления процессом.
Пример таблицы с рекомендуемыми настройками:
Параметр | Рекомендуемое значение | Описание |
---|---|---|
fastcgi_cache_path | /var/cache/nginx | Путь для хранения кэша |
fastcgi_cache_valid | 200 60m | Время хранения успешных ответов |
fastcgi_cache_use_stale | error timeout updating | Использование устаревшего кэша при ошибках |
Регулярно проверяйте производительность и корректируйте настройки в зависимости от нагрузки и изменения контента. Используйте инструменты вроде nginx_cache_status
для мониторинга эффективности кэширования.
Лимитация запросов и защита от DDoS атак
Используйте модуль ngx_http_limit_req_module
для ограничения частоты запросов. Это предотвращает перегрузку сервера и защищает от атак типа DDoS. Добавьте в конфигурацию Nginx следующие строки:
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; server { location / { limit_req zone=one burst=5; } }
Здесь zone=one:10m
создает зону для хранения IP-адресов с лимитом в 10 МБ, а rate=1r/s
ограничивает частоту запросов до одного в секунду. Параметр burst=5
позволяет временно превышать лимит на 5 запросов.
Для дополнительной защиты включите модуль ngx_http_limit_conn_module
, который ограничивает количество соединений с одного IP-адреса:
limit_conn_zone $binary_remote_addr zone=addr:10m; server { location / { limit_conn addr 10; } }
Этот код ограничивает количество соединений с одного IP до 10.
Используйте Fail2ban для автоматической блокировки подозрительных IP-адресов. Установите и настройте Fail2ban, чтобы он мониторил логи Nginx и блокировал IP-адреса, превышающие допустимое количество запросов.
- Установите Fail2ban:
sudo apt-get install fail2ban
. - Создайте конфигурационный файл для Nginx:
/etc/fail2ban/jail.local
. - Добавьте в файл следующие строки:
[nginx-http-auth] enabled = true filter = nginx-http-auth action = iptables[name=HTTP, port=http, protocol=tcp] logpath = /var/log/nginx/error.log bantime = 600 maxretry = 3
Этот конфиг блокирует IP на 10 минут после трех неудачных попыток авторизации.
Для защиты от медленных атак (Slowloris) настройте параметры client_body_timeout
и client_header_timeout
:
server { client_body_timeout 10s; client_header_timeout 10s; }
Эти параметры ограничивают время ожидания данных от клиента до 10 секунд.
Используйте CDN (например, Cloudflare) для распределения нагрузки и фильтрации трафика. CDN автоматически блокирует подозрительные запросы и снижает нагрузку на ваш сервер.
Регулярно обновляйте Nginx и операционную систему, чтобы использовать последние исправления безопасности. Убедитесь, что конфигурация Nginx проверена на отсутствие уязвимостей.