sendfile

Директива `sendfile` включает или отключает использование системного вызова `sendfile()` для передачи файлов в ответ на запросы клиентов. — NGINX HTTP Core

sendfile
httpserverlocationif in location
Синтаксисsendfile on | off;
По умолчаниюoff
Контекстhttp, server, location, if in location
МодульNGINX HTTP Core
Аргументыflag

Описание

Директива `sendfile` является частью основного HTTP-модуля NGINX и оптимизирует передачу файлов, позволяя серверу отправлять файлы непосредственно с диска в сетевое соединение без необходимости копирования данных между ядром и пользовательским пространством. Это приводит к повышению производительности и снижению загрузки CPU, особенно при отдаче статических файлов, таких как изображения, таблицы стилей или JavaScript-файлы. Эта директива принимает один аргумент — `on` или `off`. При установке в `on` NGINX будет использовать функцию `sendfile()` для передачи файлов клиенту, что особенно полезно при работе с большими файлами. Соответственно, установка в `off` отключает использование этой функциональности и возвращает к более традиционным методам отправки файлов, которые могут быть менее эффективными. Директиву `sendfile` можно включать в разных контекстах, таких как `http`, `server` и `location`, а также внутри директив `if` в контекстах location. Обратите внимание, что хотя включение `sendfile` обычно даёт лучшую производительность, важно убедиться, что конфигурация сервера и логика приложения корректно работают при использовании этой директивы, поскольку это может вызвать сложности в некоторых конфигурациях, например при работе с TLS или в отдельных сценариях логирования.

Пример конфига

http {
    sendfile on;

    server {
        listen 80;
        server_name example.com;

        location / {
            root /var/www/html;
            index index.html;
        }
    }
}

Использование `sendfile` с неблокирующим вводом-выводом может привести к неожиданному поведению из-за способа передачи данных.

Некоторые конфигурации, такие как проксирование или определённые модули (например, HTTP/2), могут некорректно взаимодействовать с `sendfile`, поэтому обязательно протестируйте производительность соответствующим образом.