- Home »

Основы Nginx: установка, настройка и устранение неполадок
Если вы хотите разобраться с веб-сервером, который крутится на половине интернета, эта статья для вас. Nginx (произносится “engine-x”) — это не просто ещё один веб-сервер, это швейцарский нож в мире HTTP. Он может работать как реверс-прокси, балансировщик нагрузки, кеширующий сервер и многое другое. И да, он съедает в разы меньше памяти, чем Apache, при этом обрабатывая тысячи одновременных подключений без проблем.
Здесь мы разберём всё с нуля: от установки до тонкой настройки и решения проблем, которые обязательно возникнут. Будет много практики, реальных примеров конфигов и советов из окопов. Готовы? Поехали!
Как работает Nginx: архитектура и принципы
Nginx использует event-driven архитектуру, что принципиально отличается от process-based подхода Apache. Вместо создания отдельного процесса или потока для каждого соединения, Nginx использует асинхронную обработку событий. Один worker-процесс может обрабатывать тысячи соединений одновременно.
Основные компоненты:
- Master process — управляет worker-процессами, читает конфигурацию
- Worker processes — обрабатывают HTTP-запросы
- Cache loader — загружает кеш в память при старте
- Cache manager — управляет размером кеша
Интересный факт: Nginx может обслуживать статические файлы в 10 раз быстрее Apache благодаря использованию системного вызова sendfile(), который позволяет передавать файлы напрямую из kernel space в сетевой сокет, минуя user space.
Установка Nginx: быстрый старт
Начнём с установки. Для продакшена рекомендую использовать VPS или выделенный сервер с Ubuntu/CentOS.
Ubuntu/Debian:
sudo apt update
sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
CentOS/RHEL:
sudo yum install epel-release
sudo yum install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
Компиляция из исходников (для гиков):
wget http://nginx.org/download/nginx-1.24.0.tar.gz
tar -xzf nginx-1.24.0.tar.gz
cd nginx-1.24.0
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf
make
sudo make install
Почему компиляция из исходников? Вы можете включить только нужные модули, что уменьшит размер бинарника и увеличит безопасность.
Базовая настройка: первые шаги
Основной файл конфигурации находится в /etc/nginx/nginx.conf
. Вот минимальный рабочий конфиг:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
events {
worker_connections 1024;
use epoll;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
gzip on;
gzip_vary on;
gzip_min_length 1000;
gzip_types text/plain application/xml text/css application/javascript;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
Настройка виртуального хоста
Создаём файл /etc/nginx/sites-available/example.com
:
server {
listen 80;
server_name example.com www.example.com;
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
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;
}
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
}
Активируем сайт:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Продвинутые настройки и оптимизация
Настройка SSL/TLS
Современный веб без HTTPS — это дурной тон. Вот конфиг с SSL:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
location / {
root /var/www/example.com;
index index.html;
}
}
server {
listen 80;
server_name example.com;
return 301 https://$server_name$request_uri;
}
Reverse Proxy и Load Balancing
Nginx отлично работает как обратный прокси. Вот конфиг для проксирования на Node.js приложение:
upstream backend {
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name api.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;
proxy_connect_timeout 30;
proxy_send_timeout 30;
proxy_read_timeout 30;
}
}
Мониторинг и логирование
Настраиваем подробное логирование:
log_format detailed '$remote_addr - $remote_user [$time_local] '
'"$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;
Включаем модуль status для мониторинга:
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
Сравнение с конкурентами
Параметр | Nginx | Apache | Caddy |
---|---|---|---|
Потребление памяти | Низкое (2-4 МБ) | Высокое (8-20 МБ) | Среднее (5-10 МБ) |
Одновременные соединения | 100,000+ | 1,000-10,000 | 10,000+ |
Автоматический SSL | Нет | Нет | Да |
Сложность настройки | Средняя | Высокая | Низкая |
Статические файлы | Отлично | Хорошо | Хорошо |
Решение типовых проблем
Ошибка 502 Bad Gateway
Самая частая проблема. Причины и решения:
- PHP-FPM не запущен:
sudo systemctl start php8.1-fpm
- Неверный путь к сокету: проверьте
/etc/php/8.1/fpm/pool.d/www.conf
- Timeout: увеличьте
fastcgi_read_timeout
Ошибка 413 Request Entity Too Large
Добавьте в конфиг:
client_max_body_size 100M;
Проблемы с производительностью
Настройки для высоконагруженных сайтов:
worker_processes auto;
worker_connections 4096;
worker_rlimit_nofile 8192;
keepalive_timeout 30;
keepalive_requests 100;
open_file_cache max=1000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
Полезные команды для диагностики
# Проверка синтаксиса конфигурации
nginx -t
# Перезагрузка без остановки
nginx -s reload
# Просмотр активных соединений
ss -tuln | grep :80
# Анализ логов
tail -f /var/log/nginx/access.log | grep "error"
# Тест производительности
ab -n 1000 -c 100 http://example.com/
# Просмотр статуса процессов
ps aux | grep nginx
Автоматизация и интеграция
Nginx отлично интегрируется с системами автоматизации. Вот пример Ansible плейбука:
---
- name: Install and configure Nginx
hosts: webservers
become: yes
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Copy configuration
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
notify: restart nginx
- name: Enable and start Nginx
systemd:
name: nginx
enabled: yes
state: started
handlers:
- name: restart nginx
systemd:
name: nginx
state: restarted
Интеграция с Docker
Простой Dockerfile для Nginx:
FROM nginx:alpine
COPY nginx.conf /etc/nginx/nginx.conf
COPY sites/ /etc/nginx/sites-enabled/
COPY www/ /var/www/
EXPOSE 80 443
CMD ["nginx", "-g", "daemon off;"]
Нестандартные способы использования
Nginx как API Gateway
Nginx может работать как полноценный API Gateway с rate limiting:
http {
limit_req_zone $binary_remote_addr zone=api:10m rate=1r/s;
server {
location /api/v1/ {
limit_req zone=api burst=5;
proxy_pass http://backend;
}
}
}
Geo-блокировка
geo $blocked_country {
default 0;
include /etc/nginx/blocked_countries.conf;
}
server {
if ($blocked_country) {
return 403;
}
}
Безопасность
Базовые настройки безопасности:
server_tokens off;
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
location ~ /\. {
deny all;
}
location ~* \.(sql|log|htaccess)$ {
deny all;
}
# Rate limiting
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/m;
location /login {
limit_req zone=login burst=3;
}
Мониторинг и метрики
Для серьёзного мониторинга используйте nginx-prometheus-exporter. Он экспортирует метрики в формате Prometheus:
docker run -p 9113:9113 nginx/nginx-prometheus-exporter:0.11.0 \
-nginx.scrape-uri=http://nginx:8080/nginx_status
Заключение и рекомендации
Nginx — это мощный инструмент, который может решить множество задач: от простого веб-сервера до сложного балансировщика нагрузки. Основные преимущества:
- Высокая производительность — обрабатывает тысячи соединений с минимальным потреблением ресурсов
- Гибкость настройки — можно настроить под любые задачи
- Стабильность — работает месяцами без перезапуска
- Модульность — огромное количество модулей для расширения функциональности
Когда использовать Nginx:
- Высоконагруженные сайты
- Микросервисная архитектура (как API Gateway)
- Статические сайты
- Reverse proxy для приложений
Когда стоит рассмотреть альтернативы:
- Простые проекты без высоких требований к производительности — можно взять Caddy
- Если нужны специфические модули Apache
- Для разработки может быть избыточен
Помните: правильно настроенный Nginx — это основа быстрого и надёжного веб-сервиса. Не экономьте время на изучение его возможностей, это инвестиция в будущее ваших проектов.
Полезные ссылки для дальнейшего изучения:
В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.
Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.