
Содержание
1. Введение: Nginx как современный веб-сервер2. Установка Nginx на различных системах
3. Базовая конфигурация и структура файлов
4. Виртуальные хосты и server blocks
5. Безопасность Nginx: основные принципы
6. SSL/TLS настройка и HTTPS
7. Оптимизация производительности
8. Кэширование контента
9. Балансировка нагрузки и проксирование
10. Мониторинг и логирование
11. Продвинутые техники конфигурации
12. Troubleshooting и решение проблем
13. Часто задаваемые вопросы
14. Заключение
Введение: Nginx как современный веб-сервер
Nginx (произносится как "engine-x") - это высокопроизводительный веб-сервер и обратный прокси-сервер с открытым исходным кодом, который стал стандартом для современных веб-приложений. Разработанный Игорем Сысоевым в 2004 году, Nginx изначально создавался для решения проблемы C10K (обслуживание 10,000 одновременных соединений) и с тех пор стал одним из самых популярных веб-серверов в мире.
Почему Nginx популярен
По данным W3Techs на 2026 год, Nginx используется на более чем 33% всех веб-серверов в интернете, уступая только Apache. Популярность Nginx объясняется несколькими ключевыми преимуществами:
Производительность:
- Асинхронная архитектура событийного цикла
- Эффективная обработка статического контента
- Низкое потребление памяти даже при высокой нагрузке
- Способность обрабатывать десятки тысяч одновременных соединений
Гибкость:
- Модульная архитектура
- Возможность использования как веб-сервера, обратного прокси, балансировщика нагрузки
- Поддержка различных протоколов (HTTP, HTTPS, HTTP/2, WebSocket)
- Легкая интеграция с различными бэкенд-приложениями
Надежность:
- Стабильная работа под высокой нагрузкой
- Эффективная обработка ошибок
- Поддержка graceful reload без простоя
- Активное сообщество и регулярные обновления
Статистика использования Nginx
Согласно последним исследованиям:
- 33.1% всех веб-сайтов используют Nginx
- Более 500 миллионов сайтов работают на Nginx
- Топ-1000 сайтов: 40% используют Nginx
- Рост популярности: +5% за последний год
Основные сценарии использования
Nginx применяется в различных сценариях:
Веб-сервер:
- Обслуживание статического контента (HTML, CSS, JavaScript, изображения)
- Обработка запросов к динамическим приложениям через FastCGI
- Поддержка современных протоколов (HTTP/2, WebSocket)
Обратный прокси:
- Распределение нагрузки между несколькими бэкенд-серверами
- Кэширование ответов для повышения производительности
- SSL/TLS терминация
- Защита бэкенд-серверов от прямого доступа
Балансировщик нагрузки:
- Распределение трафика между серверами
- Различные алгоритмы балансировки (round-robin, least connections, IP hash)
- Health checks для определения доступности серверов
API Gateway:
- Маршрутизация запросов к микросервисам
- Аутентификация и авторизация
- Rate limiting и защита от DDoS
Проблемы безопасности веб-серверов
Современные веб-серверы сталкиваются с множеством угроз безопасности:
Распространенные атаки:
- DDoS атаки и перегрузка сервера
- SQL injection через неправильную конфигурацию
- XSS атаки и инъекции кода
- Утечки информации через заголовки
- SSL/TLS уязвимости
- Directory traversal атаки
Статистика инцидентов:
- 73% веб-приложений имеют уязвимости безопасности
- Средний ущерб от компрометации веб-сервера: $4.45 млн
- 43% атак направлены на малый бизнес
- Среднее время обнаружения компрометации: 197 дней
Производительность как критический фактор
Производительность веб-сервера напрямую влияет на бизнес-метрики:
Влияние на пользовательский опыт:
- Задержка в 1 секунду снижает конверсию на 7%
- 53% пользователей покидают сайт, если загрузка занимает более 3 секунд
- Каждая дополнительная секунда загрузки снижает удовлетворенность на 16%
Экономические последствия:
- Медленный сайт может стоить до $2.6 млн потерянного дохода в год
- Оптимизация производительности может увеличить конверсию на 20-30%
- Эффективное кэширование снижает нагрузку на сервер на 60-80%
Что вы узнаете из этого руководства
В этом руководстве вы получите комплексные знания по:
Установке и настройке:
- Установка Nginx на различных операционных системах
- Базовая конфигурация и понимание структуры
- Настройка виртуальных хостов
Безопасности:
- Принципы безопасной конфигурации
- Настройка SSL/TLS и HTTPS
- Защита от распространенных атак
- Безопасные заголовки и настройки
Производительности:
- Оптимизация для высокой нагрузки
- Кэширование статического и динамического контента
- Настройка сжатия и минификации
- Мониторинг и профилирование
Продвинутым техникам:
- Балансировка нагрузки
- Обратное проксирование
- WebSocket поддержка
- HTTP/2 и современные протоколы
Это руководство предназначено как для начинающих администраторов, так и для опытных специалистов, желающих углубить свои знания в области конфигурации и оптимизации Nginx.
Установка Nginx на различных системах
Правильная установка Nginx - первый шаг к созданию надежного и производительного веб-сервера. В этом разделе рассмотрим установку на различных операционных системах и варианты установки.
Установка на Ubuntu/Debian
Ubuntu и Debian используют пакетный менеджер apt для управления пакетами. Установка Nginx здесь наиболее проста.
Обновление системы:
bash
sudo apt update
sudo apt upgrade -y
Установка Nginx:
bash
sudo apt install nginx -y
Проверка версии:
bash
nginx -v
Запуск и автозапуск:
bash
<h2 id="zapusk-servisa">Запуск сервиса</h2>
sudo systemctl start nginx
<h2 id="vklyuchenie-avtozapuska">Включение автозапуска</h2>
sudo systemctl enable nginx
<h2 id="proverka-statusa">Проверка статуса</h2>
sudo systemctl status nginx
Проверка работы:
После установки Nginx должен быть доступен по адресу http://your-server-ip. Если вы видите страницу приветствия Nginx, установка прошла успешно.
Установка из официального репозитория:
Для получения последней версии можно добавить официальный репозиторий:
bash
<h2 id="ustanovka-zavisimostey">Установка зависимостей</h2>
sudo apt install curl gnupg2 ca-certificates lsb-release
<h2 id="dobavlenie-klyucha-repozitoriya">Добавление ключа репозитория</h2>
curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
<h2 id="dobavlenie-repozitoriya">Добавление репозитория</h2>
echo "deb http://nginx.org/packages/ubuntu $(lsb_release -cs) nginx" | sudo tee /etc/apt/sources.list.d/nginx.list
<h2 id="obnovlenie-spiska-paketov">Обновление списка пакетов</h2>
sudo apt update
<h2 id="ustanovka-nginx">Установка Nginx</h2>
sudo apt install nginx -y
Установка на CentOS/RHEL
CentOS и RHEL используют пакетный менеджер yum (или dnf в новых версиях).
Установка через EPEL репозиторий:
bash
<h2 id="ustanovka-epel-repozitoriya">Установка EPEL репозитория</h2>
sudo yum install epel-release -y
<h2 id="ustanovka-nginx">Установка Nginx</h2>
sudo yum install nginx -y
<h2 id="zapusk-i-avtozapusk">Запуск и автозапуск</h2>
sudo systemctl start nginx
sudo systemctl enable nginx
Установка из официального репозитория:
bash
<h2 id="sozdanie-fayla-repozitoriya">Создание файла репозитория</h2>
sudo vi /etc/yum.repos.d/nginx.repo
Добавить содержимое:
ini
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
bash
<h2 id="ustanovka">Установка</h2>
sudo yum install nginx -y
Установка на Fedora
Fedora использует dnf как пакетный менеджер:
bash
<h2 id="ustanovka-nginx">Установка Nginx</h2>
sudo dnf install nginx -y
<h2 id="zapusk-i-avtozapusk">Запуск и автозапуск</h2>
sudo systemctl start nginx
sudo systemctl enable nginx
Установка на Arch Linux
Arch Linux использует pacman:
bash
<h2 id="obnovlenie-sistemy">Обновление системы</h2>
sudo pacman -Syu
<h2 id="ustanovka-nginx">Установка Nginx</h2>
sudo pacman -S nginx
<h2 id="zapusk-i-avtozapusk">Запуск и автозапуск</h2>
sudo systemctl start nginx
sudo systemctl enable nginx
Установка из исходников
Установка из исходников дает больше контроля над конфигурацией и модулями.
Подготовка окружения:
bash
<h2 id="ustanovka-zavisimostey-dlya-kompilyatsii">Установка зависимостей для компиляции</h2>
sudo apt install build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev -y
Скачивание исходников:
bash
cd /usr/src
sudo wget http://nginx.org/download/nginx-1.25.3.tar.gz
sudo tar -xzf nginx-1.25.3.tar.gz
cd nginx-1.25.3
Конфигурация и компиляция:
bash
<h2 id="konfiguratsiya-s-optsiyami">Конфигурация с опциями</h2>
./configure \
--prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--user=nginx \
--group=nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-http_auth_request_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-threads \
--with-stream \
--with-stream_ssl_module \
--with-stream_ssl_preread_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-http_slice_module \
--with-file-aio \
--with-http_v2_module
<h2 id="kompilyatsiya">Компиляция</h2>
make
<h2 id="ustanovka">Установка</h2>
sudo make install
Установка через Docker
Docker позволяет быстро развернуть Nginx в изолированном контейнере:
Базовый запуск:
bash
docker run -d -p 80:80 --name nginx nginx
С кастомной конфигурацией:
bash
<h2 id="sozdanie-direktorii-dlya-konfiguratsii">Создание директории для конфигурации</h2>
mkdir -p ~/nginx-config
<h2 id="kopirovanie-konfiguratsii">Копирование конфигурации</h2>
docker cp nginx:/etc/nginx/nginx.conf ~/nginx-config/
<h2 id="zapusk-s-montirovaniem-konfiguratsii">Запуск с монтированием конфигурации</h2>
docker run -d \
-p 80:80 \
-p 443:443 \
-v ~/nginx-config:/etc/nginx/conf.d \
--name nginx \
nginx
Docker Compose:
yaml
version: '3.8'
services:
nginx:
image: nginx:latest
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./conf.d:/etc/nginx/conf.d
- ./ssl:/etc/nginx/ssl
restart: unless-stopped
Проверка установки
После установки необходимо проверить корректность работы:
Проверка версии:
bash
nginx -v
<h2 id="vyvod-nginx-version-nginx-1-25-3">Вывод: nginx version: nginx/1.25.3</h2>Проверка конфигурации:
bash
nginx -t
<h2 id="dolzhno-vyvesti-syntax-is-ok-configuration-file-test-is-successful">Должно вывести: syntax is ok, configuration file test is successful</h2>Проверка статуса:
bash
sudo systemctl status nginx
Проверка портов:
bash
sudo netstat -tlnp | grep nginx
<h2 id="ili">или</h2>
sudo ss -tlnp | grep nginx
Проверка через браузер:
Откройте http://your-server-ip в браузере. Должна отобразиться страница приветствия Nginx.
Расположение файлов после установки
Основные директории:
Конфигурация:
- `/etc/nginx/nginx.conf` - главный конфигурационный файл
- `/etc/nginx/conf.d/` - дополнительные конфигурационные файлы
- `/etc/nginx/sites-available/` - доступные конфигурации сайтов (Debian/Ubuntu)
- `/etc/nginx/sites-enabled/` - активные конфигурации сайтов (Debian/Ubuntu)
Логи:
- `/var/log/nginx/access.log` - лог доступа
- `/var/log/nginx/error.log` - лог ошибок
Веб-контент:
- `/usr/share/nginx/html/` - стандартная директория для веб-контента (RHEL/CentOS)
- `/var/www/html/` - стандартная директория для веб-контента (Debian/Ubuntu)
Исполняемые файлы:
- `/usr/sbin/nginx` - исполняемый файл Nginx
- `/usr/lib/nginx/modules/` - модули Nginx
Создание пользователя для Nginx
Для безопасности рекомендуется запускать Nginx от отдельного пользователя:
bash
<h2 id="sozdanie-polzovatelya-i-gruppy">Создание пользователя и группы</h2>
sudo useradd -r -s /bin/false -d /var/cache/nginx -M nginx
<h2 id="ustanovka-prav-na-direktorii">Установка прав на директории</h2>
sudo chown -R nginx:nginx /var/cache/nginx
sudo chown -R nginx:nginx /var/log/nginx
Правильная установка - основа для дальнейшей настройки и оптимизации Nginx. В следующем разделе рассмотрим базовую конфигурацию и структуру файлов.
Базовая конфигурация и структура файлов
Понимание структуры конфигурационных файлов Nginx критически важно для эффективного управления веб-сервером. Nginx использует модульную систему конфигурации с иерархической структурой директив.
Структура главного конфигурационного файла
Главный конфигурационный файл `/etc/nginx/nginx.conf` состоит из нескольких основных блоков:
Блоки конфигурации:
1. Main (глобальный) - директивы верхнего уровня
2. Events - настройки обработки соединений
3. HTTP - настройки HTTP сервера
4. Server - конфигурация виртуальных хостов
5. Location - настройки для конкретных URI
Базовая структура nginx.conf
nginx
<h2 id="osnovnoy-blok-main-context">Основной блок (Main context)</h2>
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
<h2 id="blok-events">Блок Events</h2>
events {
worker_connections 1024;
use epoll;
multi_accept on;
}
<h2 id="blok-http">Блок HTTP</h2>
http {
# Базовые настройки MIME типов
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Логирование
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# Основные настройки производительности
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
client_max_body_size 20M;
# Gzip сжатие
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types text/plain text/css text/xml text/javascript
application/json application/javascript application/xml+rss;
# Включение конфигураций виртуальных хостов
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Основные директивы Main блока
user:
nginx
user nginx;
Определяет пользователя и группу, от имени которых работает Nginx. Рекомендуется использовать непривилегированного пользователя.
worker_processes:
nginx
worker_processes auto;
Количество рабочих процессов. `auto` автоматически определяет оптимальное значение на основе количества CPU ядер.
error_log:
nginx
error_log /var/log/nginx/error.log warn;
Путь к файлу логов ошибок и уровень логирования (debug, info, notice, warn, error, crit, alert, emerg).
pid:
nginx
pid /var/run/nginx.pid;
Путь к файлу, содержащему PID главного процесса Nginx.
Директивы Events блока
worker_connections:
nginx
events {
worker_connections 1024;
}
Максимальное количество одновременных соединений на один рабочий процесс. Общее максимальное количество = worker_processes × worker_connections.
use:
nginx
use epoll;
Метод обработки соединений. Для Linux рекомендуется `epoll`, для FreeBSD - `kqueue`.
multi_accept:
nginx
multi_accept on;
Разрешает рабочему процессу принимать несколько новых соединений за раз.
Основные HTTP директивы
include:
nginx
include /etc/nginx/mime.types;
Включает другой конфигурационный файл. Позволяет модульно организовывать конфигурацию.
default_type:
nginx
default_type application/octet-stream;
MIME-тип по умолчанию для файлов, тип которых не определен.
sendfile:
nginx
sendfile on;
Использует системный вызов sendfile() для эффективной передачи файлов без копирования в пользовательское пространство.
tcp_nopush и tcp_nodelay:
nginx
tcp_nopush on;
tcp_nodelay on;
Оптимизация TCP соединений. `tcp_nopush` отправляет заголовки и начало файла в одном пакете, `tcp_nodelay` отключает алгоритм Nagle.
keepalive_timeout:
nginx
keepalive_timeout 65;
Время в секундах, в течение которого сервер будет держать соединение открытым.
client_max_body_size:
nginx
client_max_body_size 20M;
Максимальный размер тела запроса. Важно для загрузки файлов.
Структура Server блока
Server блок определяет конфигурацию виртуального хоста:
nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.htm;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Основные директивы Server блока:
listen:
nginx
listen 80;
listen 443 ssl http2;
listen [::]:80 ipv6only=on;
Порт и опции прослушивания. Поддерживает IPv4 и IPv6.
server_name:
nginx
server_name example.com www.example.com;
Имена доменов, для которых этот server блок обрабатывает запросы. Поддерживает wildcards и регулярные выражения.
root:
nginx
root /var/www/example.com;
Корневая директория для файлов сайта.
index:
nginx
index index.html index.htm index.php;
Файлы, которые используются как индексные при запросе директории.
Структура Location блока
Location блок определяет обработку конкретных URI:
Типы location:
1. Точное совпадение:
nginx
location = /exact {
# Обрабатывает только /exact
}
2. Префикс (без модификатора):
nginx
location /prefix {
# Обрабатывает /prefix и все подпути
}
3. Регулярное выражение (~):
nginx
location ~ \.php$ {
# Обрабатывает все .php файлы (регистрозависимо)
}
4. Регулярное выражение (~*):
nginx
location ~* \.(jpg|jpeg|png|gif)$ {
# Обрабатывает изображения (регистронезависимо)
}
5. Приоритетный префикс (^~):
nginx
location ^~ /images {
# Префикс с приоритетом над регулярными выражениями
}
Приоритет location блоков:
1. Точное совпадение (=)
2. Приоритетный префикс (^~)
3. Регулярное выражение (в порядке появления)
4. Префикс (самый длинный совпадающий)
Переменные Nginx
Nginx поддерживает множество встроенных переменных:
Переменные запроса:
- `$request_method` - метод HTTP запроса (GET, POST, etc.)
- `$request_uri` - полный URI запроса
- `$args` - аргументы запроса (query string)
- `$query_string` - то же что $args
- `$request_filename` - путь к файлу запроса
Переменные заголовков:
- `$http_host` - значение заголовка Host
- `$http_user_agent` - User-Agent браузера
- `$http_referer` - Referer заголовок
- `$http_x_forwarded_for` - IP клиента через прокси
Переменные ответа:
- `$status` - код статуса HTTP ответа
- `$body_bytes_sent` - размер тела ответа в байтах
- `$bytes_sent` - общий размер ответа
Переменные времени:
- `$time_local` - локальное время в формате лога
- `$time_iso8601` - время в формате ISO 8601
- `$msec` - время в секундах с миллисекундами
Примеры использования переменных
Кастомный лог формат:
nginx
log_format detailed '$remote_addr - $remote_user [$time_iso8601] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log detailed;
Условная логика:
nginx
location / {
if ($request_method = POST) {
access_log /var/log/nginx/post.log;
}
# Более предпочтительный способ - использовать map
}
Использование map для условной логики
Map директивы позволяют создавать переменные на основе значений других переменных:
nginx
map $http_user_agent $is_mobile {
default 0;
~*mobile 1;
~*android 1;
~*iphone 1;
}
server {
root /var/www;
location / {
if ($is_mobile) {
root /var/www/mobile;
}
}
}
Организация конфигурационных файлов
Рекомендуемая структура:
text
/etc/nginx/
├── nginx.conf # Главный конфигурационный файл
├── mime.types # MIME типы
├── fastcgi.conf # FastCGI параметры
├── proxy.conf # Прокси параметры
├── ssl.conf # SSL настройки
├── gzip.conf # Gzip настройки
├── conf.d/ # Дополнительные конфигурации
│ ├── default.conf
│ └── security.conf
└── sites-available/ # Доступные сайты
├── example.com.conf
└── another-site.com.conf
└── sites-enabled/ # Активные сайты (симлинки)
└── example.com.conf -> ../sites-available/example.com.conf
Разделение конфигурации:
nginx
<h2 id="nginx-conf">nginx.conf</h2>
http {
include /etc/nginx/conf.d/security.conf;
include /etc/nginx/conf.d/gzip.conf;
include /etc/nginx/sites-enabled/*;
}
<h2 id="conf-d-security-conf">conf.d/security.conf</h2>
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
<h2 id="conf-d-gzip-conf">conf.d/gzip.conf</h2>
gzip on;
gzip_vary on;
gzip_comp_level 6;
gzip_types text/plain text/css application/json application/javascript;
Проверка и применение конфигурации
Проверка синтаксиса:
bash
nginx -t
Проверка с выводом конфигурации:
bash
nginx -T
Перезагрузка конфигурации:
bash
<h2 id="graceful-reload-bez-razryva-soedineniy">Graceful reload (без разрыва соединений)</h2>
sudo nginx -s reload
<h2 id="ili-cherez-systemctl">Или через systemctl</h2>
sudo systemctl reload nginx
Перезапуск:
bash
sudo systemctl restart nginx
Понимание структуры конфигурации - основа для эффективной работы с Nginx. В следующем разделе рассмотрим настройку виртуальных хостов.
Виртуальные хосты и server blocks
Виртуальные хосты (server blocks) позволяют обслуживать несколько доменов на одном сервере. Это одна из самых важных функций Nginx для хостинга множественных сайтов.
Основы виртуальных хостов
Один физический сервер может обслуживать множество доменов, каждый со своей конфигурацией. Nginx определяет, какой server block использовать, на основе заголовка Host в HTTP запросе.
Базовая конфигурация виртуального хоста
Простой статический сайт:
nginx
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
access_log /var/log/nginx/example.com.access.log;
error_log /var/log/nginx/example.com.error.log;
location / {
try_files $uri $uri/ =404;
}
}
Создание директории и файлов:
bash
<h2 id="sozdanie-direktorii">Создание директории</h2>
sudo mkdir -p /var/www/example.com
<h2 id="sozdanie-testovogo-fayla">Создание тестового файла</h2>
sudo tee /var/www/example.com/index.html > /dev/null <<EOF
<!DOCTYPE html>
<html>
<head>
<title>Example.com</title>
</head>
<body>
<h1>Welcome to Example.com</h1>
</body>
</html>
EOF
<h2 id="ustanovka-prav">Установка прав</h2>
sudo chown -R www-data:www-data /var/www/example.com
sudo chmod -R 755 /var/www/example.com
Множественные виртуальные хосты
Пример конфигурации для нескольких сайтов:
nginx
<h2 id="etc-nginx-sites-available-example-com-conf">/etc/nginx/sites-available/example.com.conf</h2>
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
<h2 id="etc-nginx-sites-available-another-site-com-conf">/etc/nginx/sites-available/another-site.com.conf</h2>
server {
listen 80;
server_name another-site.com;
root /var/www/another-site.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Активация сайтов (Debian/Ubuntu):
bash
<h2 id="sozdanie-simlinkov">Создание симлинков</h2>
sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/another-site.com.conf /etc/nginx/sites-enabled/
<h2 id="proverka-konfiguratsii">Проверка конфигурации</h2>
sudo nginx -t
<h2 id="perezagruzka">Перезагрузка</h2>
sudo systemctl reload nginx
Server блок по умолчанию
Server блок по умолчанию обрабатывает запросы, которые не соответствуют ни одному server_name:
nginx
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
return 444; # Закрывает соединение без ответа
}
Или можно показать информационную страницу:
nginx
server {
listen 80 default_server;
server_name _;
root /var/www/default;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Обработка www и non-www версий
Редирект с www на non-www:
nginx
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
}
server {
listen 80;
server_name example.com;
root /var/www/example.com;
# ... остальная конфигурация
}
Редирект с non-www на www:
nginx
server {
listen 80;
server_name example.com;
return 301 http://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
root /var/www/example.com;
# ... остальная конфигурация
}
Использование wildcards в server_name
Поддомены:
nginx
server {
listen 80;
server_name *.example.com;
root /var/www/example.com;
# Использование переменной для определения поддомена
set $subdomain "";
if ($host ~* ^([^.]+)\.example\.com$) {
set $subdomain $1;
}
location / {
root /var/www/example.com/$subdomain;
}
}
Обработка различных типов контента
Статические файлы:
nginx
server {
listen 80;
server_name example.com;
root /var/www/example.com;
# Кэширование статических файлов
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
# Обработка HTML
location / {
try_files $uri $uri/ /index.html;
}
}
PHP приложение:
nginx
server {
listen 80;
server_name example.com;
root /var/www/example.com;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Безопасность
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp";
}
# Запрет доступа к скрытым файлам
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
}
Python приложение (Django/Flask):
nginx
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
location /static/ {
alias /var/www/example.com/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}
location /media/ {
alias /var/www/example.com/media/;
expires 7d;
}
}
Обработка ошибок
Кастомные страницы ошибок:
nginx
server {
listen 80;
server_name example.com;
root /var/www/example.com;
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /404.html {
internal;
root /var/www/example.com/errors;
}
location = /50x.html {
internal;
root /var/www/example.com/errors;
}
}
Ограничение доступа
По IP адресу:
nginx
server {
listen 80;
server_name example.com;
# Разрешить доступ только с определенных IP
allow 192.168.1.0/24;
allow 10.0.0.0/8;
deny all;
location /admin {
allow 192.168.1.100;
deny all;
}
}
HTTP Basic Authentication:
bash
<h2 id="sozdanie-fayla-paroley">Создание файла паролей</h2>
sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd username
nginx
server {
listen 80;
server_name example.com;
location /admin {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
}
}
Оптимизация для производительности
Буферизация:
nginx
server {
listen 80;
server_name example.com;
# Буферы для чтения клиентских заголовков
client_body_buffer_size 128k;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# Таймауты
client_body_timeout 12;
client_header_timeout 12;
keepalive_timeout 15;
send_timeout 10;
}
Правильная настройка виртуальных хостов - основа для эффективного хостинга множественных сайтов. В следующем разделе рассмотрим вопросы безопасности Nginx.
Безопасность Nginx: основные принципы
Безопасность веб-сервера критически важна для защиты от различных типов атак. Nginx предоставляет множество механизмов защиты, которые необходимо правильно настроить.
Скрытие информации о сервере
Отключение отображения версии:
nginx
http {
server_tokens off;
}
Это скрывает версию Nginx в заголовках ответов и страницах ошибок.
Безопасные заголовки HTTP
Основные заголовки безопасности:
nginx
server {
# Защита от clickjacking
add_header X-Frame-Options "SAMEORIGIN" always;
# Защита от MIME sniffing
add_header X-Content-Type-Options "nosniff" always;
# Защита от XSS атак
add_header X-XSS-Protection "1; mode=block" always;
# Strict Transport Security (для HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Content Security Policy
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
# Referrer Policy
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Permissions Policy
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
}
Защита от DDoS атак
Rate limiting:
nginx
http {
# Определение зоны для rate limiting
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
server {
# Общий rate limit
limit_req zone=general burst=20 nodelay;
location /login {
# Строгий rate limit для логина
limit_req zone=login burst=3 nodelay;
}
}
}
Ограничение количества соединений:
nginx
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
limit_conn addr 10; # Максимум 10 соединений с одного IP
}
}
Защита от распространенных атак
Защита от directory traversal:
nginx
server {
# Запрет доступа к скрытым файлам
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# Запрет доступа к конфигурационным файлам
location ~ \.(conf|config|ini|log|sql|bak)$ {
deny all;
}
}
Защита от SQL injection и XSS:
nginx
server {
# Блокировка подозрительных запросов
if ($request_uri ~* "(union|select|insert|delete|update|drop|create|alter|exec|script)") {
return 403;
}
# Более предпочтительный способ через map
}
Использование map для фильтрации:
nginx
map $request_uri $block_uri {
default 0;
~* (union|select|insert|delete|update|drop|create|alter|exec|script) 1;
~* \.\./ 1; # Directory traversal
~* \.\.\\ 1;
}
server {
if ($block_uri) {
return 403;
}
}
Ограничение методов HTTP
Разрешение только безопасных методов:
nginx
server {
if ($request_method !~ ^(GET|HEAD|POST|PUT|DELETE|OPTIONS)$ ) {
return 405;
}
# Или через map
}
nginx
map $request_method $allowed_method {
default 0;
GET 1;
HEAD 1;
POST 1;
PUT 1;
DELETE 1;
OPTIONS 1;
}
server {
if ($allowed_method = 0) {
return 405;
}
}
Защита от ботов и сканеров
Блокировка известных ботов:
nginx
map $http_user_agent $block_bot {
default 0;
~* (bot|crawler|spider|scraper) 1;
~* (curl|wget|python|java|perl|ruby) 1;
}
server {
if ($block_bot) {
return 403;
}
}
Более гибкий подход с whitelist:
nginx
map $http_user_agent $allowed_bot {
default 1;
~* (Googlebot|Bingbot|Slurp|DuckDuckBot|Baiduspider|YandexBot) 0;
}
server {
if ($allowed_bot = 0) {
return 403;
}
}
Ограничение размера запросов
Защита от больших запросов:
nginx
http {
# Максимальный размер тела запроса
client_max_body_size 10M;
# Буферы для заголовков
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
# Таймауты
client_body_timeout 10s;
client_header_timeout 10s;
}
Безопасная конфигурация для PHP
Защита PHP приложений:
nginx
server {
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Безопасность
fastcgi_param PHP_VALUE "open_basedir=$document_root:/tmp";
fastcgi_hide_header X-Powered-By;
# Запрет выполнения PHP в загруженных файлах
fastcgi_param PHP_ADMIN_VALUE "disable_functions=exec,passthru,shell_exec,system";
}
# Запрет доступа к PHP файлам напрямую
location ~ \.php$ {
if ($uri !~ ^/index\.php) {
return 403;
}
}
}
Защита от информационных утечек
Скрытие версий и информации:
nginx
http {
server_tokens off;
# Кастомные страницы ошибок без информации о сервере
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
Удаление заголовков:
nginx
server {
# Удаление заголовка Server
more_clear_headers Server;
# Удаление X-Powered-By (если проксируется)
proxy_hide_header X-Powered-By;
}
Настройка файрвола
Рекомендуемые правила iptables:
bash
<h2 id="razreshit-http-i-https">Разрешить HTTP и HTTPS</h2>
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
<h2 id="zaschita-ot-syn-flood">Защита от SYN flood</h2>
sudo iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
<h2 id="zaschita-ot-ping-flood">Защита от ping flood</h2>
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Использование fail2ban:
ini
<h2 id="etc-fail2ban-jail-local">/etc/fail2ban/jail.local</h2>
[nginx-limit-req]
enabled = true
port = http,https
filter = nginx-limit-req
logpath = /var/log/nginx/error.log
maxretry = 10
findtime = 600
bantime = 3600
Безопасная конфигурация Nginx требует комплексного подхода и постоянного мониторинга. В следующем разделе рассмотрим настройку SSL/TLS для защиты трафика.
SSL/TLS настройка и HTTPS
SSL/TLS шифрование критически важно для защиты данных в передаче. Правильная настройка HTTPS обеспечивает конфиденциальность и целостность данных.
Получение SSL сертификатов
Let's Encrypt (бесплатный):
bash
<h2 id="ustanovka-certbot">Установка Certbot</h2>
sudo apt install certbot python3-certbot-nginx -y
<h2 id="poluchenie-sertifikata">Получение сертификата</h2>
sudo certbot --nginx -d example.com -d www.example.com
<h2 id="avtomaticheskoe-obnovlenie">Автоматическое обновление</h2>
sudo certbot renew --dry-run
Ручная установка сертификата:
bash
<h2 id="sozdanie-direktorii-dlya-sertifikatov">Создание директории для сертификатов</h2>
sudo mkdir -p /etc/nginx/ssl/example.com
<h2 id="kopirovanie-sertifikatov">Копирование сертификатов</h2>
sudo cp example.com.crt /etc/nginx/ssl/example.com/
sudo cp example.com.key /etc/nginx/ssl/example.com/
sudo chmod 600 /etc/nginx/ssl/example.com/example.com.key
sudo chmod 644 /etc/nginx/ssl/example.com/example.com.crt
Базовая HTTPS конфигурация
Простой HTTPS server блок:
nginx
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com/example.com.crt;
ssl_certificate_key /etc/nginx/ssl/example.com/example.com.key;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Оптимизированная SSL конфигурация
Безопасная и производительная конфигурация:
nginx
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
# SSL протоколы (отключение старых версий)
ssl_protocols TLSv1.2 TLSv1.3;
# Современные шифры
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
# SSL сессии (улучшение производительности)
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_session_tickets off;
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/nginx/ssl/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Безопасные заголовки
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
root /var/www/example.com;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Редирект HTTP на HTTPS
Принудительный редирект:
nginx
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;
# ... HTTPS конфигурация
}
HTTP/2 поддержка
HTTP/2 включен автоматически при использовании `http2` в директиве listen:
nginx
server {
listen 443 ssl http2;
# HTTP/2 включен
}
Оптимизация для HTTP/2:
nginx
http {
# Отключение сжатия (HTTP/2 делает это сам)
gzip off;
# Включение HTTP/2 Server Push (опционально)
http2_push_preload on;
server {
listen 443 ssl http2;
# ...
}
}
Множественные SSL сертификаты (SNI)
Nginx поддерживает Server Name Indication (SNI) для обслуживания нескольких доменов с разными сертификатами:
nginx
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;
# ... остальная конфигурация
}
server {
listen 443 ssl http2;
server_name another-site.com;
ssl_certificate /etc/nginx/ssl/another-site.com/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/another-site.com/privkey.pem;
# ... остальная конфигурация
}
Проверка SSL конфигурации
Онлайн инструменты:
- SSL Labs SSL Test: https://www.ssllabs.com/ssltest/
- Security Headers: https://securityheaders.com/
Локальная проверка:
bash
<h2 id="proverka-sertifikata">Проверка сертификата</h2>
openssl s_client -connect example.com:443 -servername example.com
<h2 id="proverka-sroka-deystviya">Проверка срока действия</h2>
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
Правильная настройка SSL/TLS обеспечивает безопасное соединение и защиту данных пользователей.
Оптимизация производительности
Оптимизация производительности Nginx критически важна для обеспечения быстрой загрузки сайтов и эффективного использования ресурсов сервера.
Оптимизация worker процессов
Настройка количества worker процессов:
nginx
<h2 id="avtomaticheskoe-opredelenie-na-osnove-cpu">Автоматическое определение на основе CPU</h2>
worker_processes auto;
<h2 id="ili-yavnoe-ukazanie">Или явное указание</h2>
worker_processes 4;
<h2 id="privyazka-k-cpu-yadram">Привязка к CPU ядрам</h2>
worker_cpu_affinity auto;
Оптимизация worker connections:
nginx
events {
# Максимальное количество соединений на worker
worker_connections 2048;
# Использование epoll для Linux
use epoll;
# Принятие нескольких соединений за раз
multi_accept on;
}
Расчет максимальных соединений:
Максимальное количество одновременных соединений = worker_processes × worker_connections
Для 4 процессов и 2048 соединений: 4 × 2048 = 8192 соединений
Оптимизация файловых операций
Sendfile и TCP оптимизация:
nginx
http {
# Использование sendfile для эффективной передачи файлов
sendfile on;
# Оптимизация TCP пакетов
tcp_nopush on;
tcp_nodelay on;
# Keepalive соединения
keepalive_timeout 65;
keepalive_requests 100;
}
Открытые файловые дескрипторы:
bash
<h2 id="proverka-limita">Проверка лимита</h2>
ulimit -n
<h2 id="uvelichenie-limita-v-systemd">Увеличение лимита в systemd</h2>
<h2 id="etc-systemd-system-nginx-service-d-limits-conf">/etc/systemd/system/nginx.service.d/limits.conf</h2>
[Service]
LimitNOFILE=65535
nginx
<h2 id="v-nginx-conf">В nginx.conf</h2>
worker_rlimit_nofile 65535;
Оптимизация Gzip сжатия
Эффективная конфигурация Gzip:
nginx
http {
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 1000;
gzip_types
text/plain
text/css
text/xml
text/javascript
application/json
application/javascript
application/xml+rss
application/atom+xml
image/svg+xml;
# Отключение для старых браузеров
gzip_disable "msie6";
}
Brotli сжатие (требует модуль):
nginx
http {
brotli on;
brotli_comp_level 6;
brotli_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}
Оптимизация буферов
Настройка буферов:
nginx
http {
# Буферы для чтения заголовков
client_header_buffer_size 1k;
large_client_header_buffers 4 8k;
# Буфер для тела запроса
client_body_buffer_size 128k;
# Буферы для прокси
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# Буферы для FastCGI
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
fastcgi_busy_buffers_size 8k;
}
Оптимизация таймаутов
Настройка таймаутов:
nginx
http {
# Таймауты клиента
client_body_timeout 12s;
client_header_timeout 12s;
send_timeout 10s;
# Таймауты прокси
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Таймауты FastCGI
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 60s;
}
Оптимизация статических файлов
Кэширование статических файлов:
nginx
server {
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
# Отключение логирования для статики
log_not_found off;
}
}
Оптимизация отдачи файлов:
nginx
server {
location /static/ {
alias /var/www/static/;
# Отключение доступа к скрытым файлам
location ~ /\. {
deny all;
}
# Оптимизация для больших файлов
sendfile on;
tcp_nopush on;
tcp_nodelay on;
}
}
Оптимизация для высоконагруженных сайтов
Конфигурация для высокой нагрузки:
nginx
http {
# Увеличение worker процессов
worker_processes auto;
worker_rlimit_nofile 65535;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
# Оптимизация соединений
keepalive_timeout 30;
keepalive_requests 1000;
# Отключение access log для производительности (или использование буферизации)
access_log off;
# или
access_log /var/log/nginx/access.log buffer=32k flush=5s;
# Оптимизация файловых операций
sendfile on;
tcp_nopush on;
tcp_nodelay on;
# Gzip
gzip on;
gzip_comp_level 6;
gzip_min_length 1000;
}
Мониторинг производительности
Stub status модуль:
nginx
server {
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
Доступ к статистике:
bash
curl http://127.0.0.1/nginx_status
Вывод показывает:
- Активные соединения
- Принятые соединения
- Обработанные запросы
- Текущие чтения/записи/ожидания
Оптимизация производительности требует баланса между скоростью и использованием ресурсов. В следующем разделе рассмотрим кэширование контента.
Кэширование контента
Кэширование - один из самых эффективных способов повышения производительности веб-сервера. Nginx предоставляет мощные механизмы кэширования для статического и динамического контента.
Кэширование статических файлов
Базовое кэширование:
nginx
server {
location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
access_log off;
}
}
Различные сроки кэширования:
nginx
server {
# Изображения - долгое кэширование
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
# CSS и JS - среднее кэширование
location ~* \.(css|js)$ {
expires 30d;
add_header Cache-Control "public";
}
# Шрифты - долгое кэширование
location ~* \.(woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Прокси кэширование
Настройка прокси кэша:
nginx
http {
# Определение зоны кэша
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g
inactive=60m use_temp_path=off;
# Настройки кэша
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 1m;
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
proxy_cache_bypass $http_upgrade;
proxy_no_cache $http_upgrade;
# Заголовки кэша
add_header X-Cache-Status $upstream_cache_status;
}
}
}
Условное кэширование:
nginx
server {
location / {
proxy_pass http://backend;
proxy_cache my_cache;
# Не кэшировать для авторизованных пользователей
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
# Кэшировать только GET и HEAD запросы
proxy_cache_methods GET HEAD;
# Минимальное время кэширования
proxy_cache_min_uses 1;
# Заголовки
add_header X-Cache-Status $upstream_cache_status;
}
}
FastCGI кэширование
Кэширование для PHP:
nginx
http {
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=php_cache:10m
max_size=1g inactive=60m use_temp_path=off;
server {
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# Кэширование
fastcgi_cache php_cache;
fastcgi_cache_valid 200 60m;
fastcgi_cache_valid 404 1m;
fastcgi_cache_bypass $cookie_nocache $arg_nocache;
fastcgi_no_cache $cookie_nocache $arg_nocache;
# Заголовки
add_header X-FastCGI-Cache $upstream_cache_status;
}
}
}
Очистка кэша
Ручная очистка:
bash
<h2 id="udalenie-vsego-kesha">Удаление всего кэша</h2>
sudo rm -rf /var/cache/nginx/*
<h2 id="perezagruzka-nginx">Перезагрузка Nginx</h2>
sudo systemctl reload nginx
Селективная очистка через purge модуль:
nginx
server {
location ~ /purge(/.*) {
proxy_cache_purge my_cache $scheme$request_method$host$1;
}
}
Оптимизация кэша
Использование tmpfs для кэша:
bash
<h2 id="dobavlenie-v-etc-fstab">Добавление в /etc/fstab</h2>
tmpfs /var/cache/nginx tmpfs defaults,size=1G 0 0
<h2 id="montirovanie">Монтирование</h2>
sudo mount -a
Мониторинг кэша:
nginx
server {
location /cache-stats {
# Статистика кэша (требует модуль)
# или использование сторонних инструментов
}
}
Правильное кэширование может значительно снизить нагрузку на сервер и улучшить время отклика.
Балансировка нагрузки и проксирование
Nginx может использоваться как балансировщик нагрузки для распределения запросов между несколькими бэкенд-серверами.
Базовая балансировка нагрузки
Простая конфигурация:
nginx
http {
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
Алгоритмы балансировки
Round Robin (по умолчанию):
nginx
upstream backend {
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
Least Connections:
nginx
upstream backend {
least_conn;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
IP Hash:
nginx
upstream backend {
ip_hash;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
server 192.168.1.12:8000;
}
Weighted:
nginx
upstream backend {
server 192.168.1.10:8000 weight=3;
server 192.168.1.11:8000 weight=2;
server 192.168.1.12:8000 weight=1;
}
Health Checks
Проверка доступности серверов:
nginx
upstream backend {
server 192.168.1.10:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8000 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8000 backup; # Резервный сервер
}
Активные health checks (требует модуль):
nginx
upstream backend {
zone backend 64k;
server 192.168.1.10:8000;
server 192.168.1.11:8000;
# Health check
match server_ok {
status 200;
header Content-Type ~ "text/html";
}
}
server {
location / {
proxy_pass http://backend;
health_check match=server_ok;
}
}
Продвинутое проксирование
Оптимизация прокси:
nginx
server {
location / {
proxy_pass http://backend;
# Заголовки
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Буферы
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
proxy_busy_buffers_size 8k;
# Таймауты
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# Перезапросы при ошибках
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
}
}
Балансировка нагрузки позволяет распределять трафик и обеспечивать высокую доступность приложений.
Мониторинг и логирование
Мониторинг и логирование критически важны для поддержания работоспособности и диагностики проблем.
Настройка логирования
Кастомные форматы логов:
nginx
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format detailed '$remote_addr - $remote_user [$time_iso8601] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log main;
error_log /var/log/nginx/error.log warn;
}
Раздельное логирование:
nginx
server {
access_log /var/log/nginx/example.com.access.log main;
error_log /var/log/nginx/example.com.error.log warn;
location /api {
access_log /var/log/nginx/api.access.log detailed;
}
}
Ротация логов
Настройка logrotate:
bash
<h2 id="etc-logrotate-d-nginx">/etc/logrotate.d/nginx</h2>
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
Мониторинг производительности
Stub status:
nginx
server {
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
}
Мониторинг через сторонние инструменты:
- Prometheus + nginx_exporter
- Grafana dashboards
- Zabbix templates
- Datadog integration
Мониторинг позволяет своевременно выявлять проблемы и оптимизировать производительность.
Продвинутые техники конфигурации
Продвинутые техники позволяют создавать сложные и гибкие конфигурации.
Использование map для условной логики
Динамическая конфигурация:
nginx
map $http_user_agent $is_mobile {
default 0;
~*mobile 1;
~*android 1;
~*iphone 1;
}
map $request_uri $block_uri {
default 0;
~* (union|select|insert) 1;
}
server {
if ($block_uri) {
return 403;
}
if ($is_mobile) {
root /var/www/mobile;
}
}
Geo модуль
Географическая маршрутизация:
nginx
geo $allowed_country {
default 0;
US 1;
GB 1;
DE 1;
}
server {
if ($allowed_country = 0) {
return 403;
}
}
Rate limiting
Ограничение запросов:
nginx
http {
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
server {
location /api {
limit_req zone=api burst=20 nodelay;
}
}
}
Продвинутые техники открывают новые возможности для оптимизации и безопасности.
Troubleshooting и решение проблем
Диагностика проблем - важный навык для администратора Nginx.
Проверка конфигурации
Тестирование синтаксиса:
bash
nginx -t
Просмотр конфигурации:
bash
nginx -T
Анализ логов
Просмотр логов ошибок:
bash
tail -f /var/log/nginx/error.log
Поиск ошибок:
bash
grep error /var/log/nginx/error.log
Распространенные проблемы
502 Bad Gateway:
- Проверка доступности бэкенд-сервера
- Проверка конфигурации proxy_pass
- Проверка прав доступа
504 Gateway Timeout:
- Увеличение proxy_read_timeout
- Проверка производительности бэкенда
403 Forbidden:
- Проверка прав доступа к файлам
- Проверка индексов
- Проверка конфигурации location
Правильная диагностика позволяет быстро решать проблемы.
Часто задаваемые вопросы
Общие вопросы
Как проверить конфигурацию Nginx?
Используйте команду `nginx -t` для проверки синтаксиса конфигурации перед применением изменений.
Как перезагрузить Nginx без разрыва соединений?
Используйте `nginx -s reload` или `systemctl reload nginx` для graceful reload.
Где находятся конфигурационные файлы?
Основной файл: `/etc/nginx/nginx.conf`. Дополнительные конфигурации: `/etc/nginx/conf.d/` и `/etc/nginx/sites-available/`.
Безопасность
Как настроить SSL сертификат?
Используйте Let's Encrypt с Certbot: `certbot --nginx -d example.com` или установите сертификат вручную в блоке server с директивами ssl_certificate.
Как защититься от DDoS атак?
Используйте rate limiting через limit_req_zone, ограничение соединений через limit_conn_zone, и настройте файрвол.
Как скрыть версию Nginx?
Добавьте `server_tokens off;` в блок http.
Производительность
Как оптимизировать Nginx для высокой нагрузки?
Настройте worker_processes, worker_connections, включите sendfile, оптимизируйте кэширование и используйте HTTP/2.
Как настроить кэширование?
Используйте proxy_cache_path для прокси кэша, fastcgi_cache_path для FastCGI, и expires для статических файлов.
Как включить Gzip сжатие?
Добавьте директивы gzip в блок http с указанием типов файлов для сжатия.
Конфигурация
Как настроить виртуальные хосты?
Создайте server блоки с разными server_name в файлах конфигурации и включите их через include или симлинки.
Как настроить редирект?
Используйте директиву return с кодом 301 для постоянного редиректа или rewrite для более сложных случаев.
Как настроить балансировку нагрузки?
Создайте upstream блок с несколькими серверами и используйте proxy_pass для перенаправления запросов.
Заключение
Nginx - мощный и гибкий веб-сервер, правильная конфигурация которого критически важна для безопасности и производительности. В этом руководстве мы рассмотрели:
Установку и базовую настройку:
- Установку на различных системах
- Понимание структуры конфигурации
- Настройку виртуальных хостов
Безопасность:
- Принципы безопасной конфигурации
- Настройку SSL/TLS
- Защиту от распространенных атак
Производительность:
- Оптимизацию worker процессов
- Кэширование контента
- Балансировку нагрузки
Мониторинг и диагностику:
- Настройку логирования
- Мониторинг производительности
- Troubleshooting проблем
Ключевые выводы
1. Безопасность и производительность идут рука об руку
2. Правильная конфигурация критически важна для эффективной работы
3. Мониторинг позволяет своевременно выявлять проблемы
4. Постоянное обучение необходимо для поддержания актуальных знаний
Рекомендации
- Регулярно обновляйте Nginx до последней версии
- Тестируйте конфигурацию перед применением
- Используйте мониторинг для отслеживания производительности
- Документируйте изменения конфигурации
- Делайте резервные копии конфигурационных файлов
Правильная настройка Nginx обеспечивает безопасную, быструю и надежную работу веб-сервера.
---
**⚠️ Дисклеймер:** Статья носит информационно-образовательный характер и не содержит инструкций для совершения противоправных действий.