Освоение конфигурации Nginx: Объяснение основных директив

Поймите директивы Nginx, которые вы используете чаще всего: http, server, location, proxy_pass, try_files, gzip, TLS и перезагрузка сервиса.

Освоение конфигурации Nginx: объяснение основных директив

Конфигурация Nginx становится намного понятнее, когда вы понимаете, где может находиться каждая директива. Если ваше правило proxy_pass, root или try_files находится в неправильном контексте, Nginx может отклонить конфигурацию или обрабатывать запросы не так, как вы ожидали.

Это руководство описывает основные директивы, которые вы будете использовать при обслуживании статических файлов, обратном проксировании приложения, включении сжатия и безопасной перезагрузке изменений.

Структура конфигурации Nginx

Файлы конфигурации Nginx обычно находятся в /etc/nginx/ в Linux-пакетах. Основной файл — это обычно /etc/nginx/nginx.conf, и он часто включает файлы из /etc/nginx/conf.d/. Пакеты Debian и Ubuntu обычно используют sites-available/ и sites-enabled/; многие другие дистрибутивы этого не делают.

Конфигурация иерархична, организована в блоки или директивы. Ключевые блоки включают:

  • events: Настраивает обработку соединений.
  • http: Содержит настройки HTTP и виртуальные серверы.
  • server: Определяет виртуальный сервер для порта и имени хоста.
  • location: Определяет, как обрабатывать соответствующие URI запросов.

Директивы — это пары ключ-значение, которые управляют поведением Nginx. Они могут быть глобальными или вложенными в блоки.

Объяснение основных директив

Блок http

Блок http содержит конфигурации, которые применяются глобально к HTTP-трафику. Здесь вы будете определять общие настройки для вашего веб-сервера.

  • include: Эта директива позволяет включать другие файлы конфигурации, помогая модуляризировать вашу настройку. Обычно используется для разделения конфигураций для разных веб-сайтов или приложений.

    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        # Включение конфигураций сервера из каталога conf.d
        include /etc/nginx/conf.d/*.conf;
    }
    
  • log_format: Определяет пользовательские форматы журналов для журналов доступа и ошибок 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"';
    
        access_log  /var/log/nginx/access.log  main;
        error_log   /var/log/nginx/error.log;
        # ... другие директивы http
    }
    
  • sendfile: Оптимизирует передачу файлов, позволяя ядру отправлять файлы напрямую с диска клиенту, минуя пользовательское пространство. Установите on для производительности.

    http {
        sendfile        on;
        # ...
    }
    
  • tcp_nopush и tcp_nodelay: Настраивают поведение TCP для HTTP-ответов. tcp_nopush обычно используется с sendfile для оптимизации отправки пакетов, а tcp_nodelay помогает избежать задержек на keepalive-соединениях.

    http {
        tcp_nopush     on;
        tcp_nodelay    on;
        # ...
    }
    

Блок server

Каждый блок server определяет виртуальный сервер, позволяя Nginx обрабатывать запросы для разных доменных имен или IP-адресов на одном сервере.

  • listen: Указывает IP-адрес и/или порт, на котором сервер будет прослушивать входящие соединения.

    server {
        listen 80;
        listen [::]:80;
        server_name example.com www.example.com;
        # ...
    }
    
  • server_name: Определяет имена сервера. Nginx использует это для сопоставления с заголовком Host входящего запроса.

    server {
        listen 80;
        server_name mydomain.org *.mydomain.org;
        # ...
    }
    
  • root: Устанавливает корневой каталог документов. Nginx формирует путь к файлу, добавляя URI запроса к этому каталогу.

    server {
        listen 80;
        server_name localhost;
        root /var/www/html;
        index index.html index.htm;
        # ...
    }
    
  • index: Указывает файл по умолчанию, который будет обслуживаться при запросе каталога.

    server {
        # ...
        index index.html index.htm default.html;
        # ...
    }
    
  • error_page: Определяет пользовательские страницы ошибок для определенных HTTP-статусов.

    server {
        # ...
        error_page 404 /404.html;
        location = /404.html {
            root /usr/share/nginx/html;
            internal;
        }
        # ...
    }
    

Блок location

Блок location используется для сопоставления URI запросов и определения того, как Nginx должен их обрабатывать. Здесь вы настраиваете маршрутизацию для разных частей вашего приложения.

  • Сопоставление URI: Location могут сопоставлять точные строки, префиксы или регулярные выражения. Точные совпадения используют =, регулярные выражения используют ~ или ~*, а простые префиксы сопоставляются по префиксу URI.

    location /images/ {
        # Директивы для запросов, начинающихся с /images/
    }
    
    location = /favicon.ico {
        # Точное совпадение для /favicon.ico
    }
    
    location ~ \.php$ {
        # Совпадение по регулярному выражению для файлов, заканчивающихся на .php
    }
    
  • proxy_pass: Перенаправляет запросы на вышестоящий сервер. Будьте осторожны с завершающим слешем, так как он меняет то, как Nginx переписывает совпавший префикс.

    location /api/ {
        proxy_pass http://backend-service:8080/;
        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;
    }
    
  • alias: Сопоставляет location с путем в файловой системе без добавления полного исходного URI. Часто используется для статических ресурсов, хранящихся вне основного корневого каталога документов.

    location /static/ {
        alias /var/www/app/assets/;
    }
    

    При использовании alias добавляйте завершающий слеш как к location, так и к пути для сопоставления каталогов. alias заменяет совпавший префикс location на путь alias, в то время как root добавляет URI к корневому пути.

  • try_files: Проверяет существование файлов в указанном порядке и обслуживает первый найденный, или возвращает указанный код/URI.

    location / {
        try_files $uri $uri/ /index.html;
    }
    

    Это распространено для одностраничных приложений. Если запрошенный файл или каталог не существует, Nginx обслуживает index.html, чтобы клиентский маршрутизатор мог обработать путь.

Директивы безопасности и производительности

  • ssl_certificate и ssl_certificate_key: Необходимы для настройки HTTPS. Эти директивы указывают на файлы вашего SSL-сертификата и закрытого ключа.

    server {
        listen 443 ssl;
        server_name secure.example.com;
    
        ssl_certificate /etc/letsencrypt/live/secure.example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/secure.example.com/privkey.pem;
    
        # ... другие настройки SSL
    }
    
  • gzip: Включает или отключает сжатие gzip для выбранных типов ответов. Это часто уменьшает размер передачи для текстовых ресурсов, но избегайте сжатия уже сжатых файлов, таких как большинство изображений.

    http {
        gzip on;
        gzip_vary on;
        gzip_proxied any;
        gzip_comp_level 6;
        gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
        # ...
    }
    
  • expires: Управляет заголовками кэширования для статических ресурсов. Используйте длительное время жизни кэша для файлов с отпечатками и более короткое время жизни для файлов, которые сохраняют один и тот же URL при развертываниях.

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 30d;
        add_header Cache-Control "public";
    }
    

Распространенные команды Nginx

Для управления Nginx и применения изменений конфигурации вы будете часто использовать эти команды:

  • Проверка конфигурации: Проверяет синтаксические ошибки в файлах конфигурации Nginx.

    sudo nginx -t
    
  • Перезагрузка конфигурации: Плавно перезагружает конфигурацию Nginx без разрыва активных соединений.

    sudo systemctl reload nginx
    # или
    sudo service nginx reload
    
  • Перезапуск Nginx: Останавливает, а затем запускает службу Nginx.

    sudo systemctl restart nginx
    # или
    sudo service nginx restart
    
  • Проверка статуса: Показывает текущий статус службы Nginx.

    sudo systemctl status nginx
    # или
    sudo service nginx status
    

Минимальный рабочий пример

Этот пример обслуживает одностраничное приложение с диска и проксирует API-запросы на сервер приложения:

server {
    listen 80;
    server_name example.com;

    root /var/www/example.com;
    index index.html;

    location /api/ {
        proxy_pass http://127.0.0.1:3000/;
        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 / {
        try_files $uri $uri/ /index.html;
    }
}

Запускайте sudo nginx -t перед каждой перезагрузкой. Эта привычка ловит синтаксические ошибки до того, как они приведут к простою.

Вывод

Большинство ошибок Nginx связаны с контекстом и обработкой путей. Помещайте общеHTTP-настройки в http, специфичные для хоста правила в server, маршрутизацию URI в location и тестируйте каждое изменение с помощью nginx -t перед перезагрузкой.