Is there a way to have the master process log to STDOUT STDERR instead of to a file?
It seems that you can only pass a filepath to the access_log directive:
access_log /var/log/nginx/access.log
And the same goes for error_log:
error_log /var/log/nginx/error.log
I understand that this simply may not be a feature of nginx, I’d be interested in a concise solution that uses tail, for example. It is preferable though that it comes from the master process though because I am running nginx in the foreground.
Ankur Loriya
3,2388 gold badges31 silver badges58 bronze badges
asked Mar 20, 2014 at 17:55
2
Edit: it seems nginx now supports error_log stderr;
as mentioned in Anon’s answer.
You can send the logs to /dev/stdout
. In nginx.conf
:
daemon off;
error_log /dev/stdout info;
http {
access_log /dev/stdout;
...
}
edit: May need to run ln -sf /proc/self/fd /dev/ if using running certain docker containers, then use /dev/fd/1
or /dev/fd/2
answered Apr 27, 2014 at 20:15
PatrickPatrick
5,5444 gold badges31 silver badges36 bronze badges
10
If the question is docker related… the official nginx docker images do this by making softlinks towards stdout/stderr
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
REF: https://microbadger.com/images/nginx
answered Feb 21, 2017 at 14:07
BoeboeBoeboe
1,9911 gold badge16 silver badges20 bronze badges
6
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:
error_log logs/error.log error;
Context: main, http, stream, server, location
http://nginx.org/en/docs/ngx_core_module.html#error_log
Don’t use: /dev/stderr
This will break your setup if you’re going to use systemd-nspawn.
timiTao
1,4213 gold badges20 silver badges34 bronze badges
answered Apr 29, 2015 at 18:22
AnonAnon
3013 silver badges2 bronze badges
0
For a debug purpose:
/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"
For a classic purpose
/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"
Require
Under the server bracket on the config file
access_log /dev/stdout;
answered Jan 13, 2020 at 3:20
intikaintika
7,8225 gold badges34 silver badges52 bronze badges
When running Nginx in a Docker container, be aware that a volume mounted over the log dir defeats the purpose of creating a softlink between the log files and stdout/stderr in your Dockerfile, as described in @Boeboe ‘s answer.
In that case you can either create the softlink in your entrypoint (executed after volumes are mounted) or not use a volume at all (e.g. when logs are already collected by a central logging system).
answered May 16, 2017 at 16:54
veuncentveuncent
1,4891 gold badge18 silver badges17 bronze badges
In docker image of PHP-FPM, i’ve see such approach:
# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2
[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
answered Feb 1, 2019 at 8:11
Oleg NeumyvakinOleg Neumyvakin
9,3383 gold badges58 silver badges59 bronze badges
Основная функциональность
Пример конфигурации
user www www; worker_processes 2; error_log /var/log/nginx-error.log info; events { use kqueue; worker_connections 2048; } ...
Директивы
Синтаксис: |
accept_mutex
|
---|---|
Умолчание: |
accept_mutex off; |
Контекст: |
events
|
Если accept_mutex
включён,
рабочие процессы будут принимать новые соединения по очереди.
В противном случае о новых соединениях будет сообщаться сразу всем рабочим
процессам, и при низкой интенсивности поступления новых соединений
часть рабочих процессов может работать вхолостую.
Нет необходимости включать
accept_mutex
на системах, поддерживающих
флаг EPOLLEXCLUSIVE (1.11.3), или
при использовании reuseport.
До версии 1.11.3 по умолчанию использовалось значение
on
.
Синтаксис: |
accept_mutex_delay
|
---|---|
Умолчание: |
accept_mutex_delay 500ms; |
Контекст: |
events
|
При включённом accept_mutex задаёт максимальное время,
в течение которого рабочий процесс вновь попытается начать принимать
новые соединения, если в настоящий момент новые соединения принимает
другой рабочий процесс.
Синтаксис: |
daemon
|
---|---|
Умолчание: |
daemon on; |
Контекст: |
main
|
Определяет, будет ли nginx запускаться в режиме демона.
Используется в основном для разработки.
Синтаксис: |
debug_connection
|
---|---|
Умолчание: |
— |
Контекст: |
events
|
Включает отладочный лог для отдельных клиентских соединений.
Для остальных соединений используется уровень лога, заданный директивой
error_log.
Отлаживаемые соединения задаются IPv4 или IPv6 (1.3.0, 1.2.1)
адресом или сетью.
Соединение может быть также задано при помощи имени хоста.
Отладочный лог для соединений через UNIX-сокеты (1.3.0, 1.2.1)
включается параметром “unix:
”.
events { debug_connection 127.0.0.1; debug_connection localhost; debug_connection 192.0.2.0/24; debug_connection ::1; debug_connection 2001:0db8::/32; debug_connection unix:; ... }
Для работы директивы необходимо сконфигурировать nginx с параметром
--with-debug
,
см. “Отладочный лог”.
Синтаксис: |
debug_points
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Эта директива используется для отладки.
В случае обнаружения внутренней ошибки, например, утечки сокетов в момент
перезапуска рабочих процессов, включение debug_points
приводит к созданию core-файла (abort
)
или остановке процесса (stop
) с целью последующей
диагностики с помощью системного отладчика.
Синтаксис: |
env
|
---|---|
Умолчание: |
env TZ; |
Контекст: |
main
|
По умолчанию nginx удаляет все переменные окружения, унаследованные
от своего родительского процесса, кроме переменной TZ.
Эта директива позволяет сохранить часть унаследованных переменных,
поменять им значения или же создать новые переменные окружения.
Эти переменные затем:
-
наследуются во время
обновления исполняемого файла на лету; -
используются модулем
ngx_http_perl_module; -
используются рабочими процессами.
Следует иметь в виду, что управление поведением системных библиотек
подобным образом возможно не всегда, поскольку зачастую библиотеки используют
переменные только во время инициализации, то есть ещё до того, как их
можно задать с помощью данной директивы.
Исключением из этого является упомянутое выше
обновление исполняемого файла на лету.
Если переменная TZ не описана явно, то она всегда наследуется
и всегда доступна модулю
ngx_http_perl_module.
Пример использования:
env MALLOC_OPTIONS; env PERL5LIB=/data/site/modules; env OPENSSL_ALLOW_PROXY_CERTS=1;
Переменная окружения NGINX используется для внутренних целей nginx
и не должна устанавливаться непосредственно самим пользователем.
Синтаксис: |
error_log
|
---|---|
Умолчание: |
error_log logs/error.log error; |
Контекст: |
main , http , mail , stream , server , location
|
Конфигурирует запись в лог.
На одном уровне конфигурации может использоваться несколько логов (1.5.2).
Если на уровне конфигурации main
запись лога в файл
явно не задана, то используется файл по умолчанию.
Первый параметр задаёт файл
, который будет хранить лог.
Специальное значение stderr
выбирает стандартный файл ошибок.
Запись в syslog настраивается указанием префикса
“syslog:
”.
Запись в
кольцевой буфер в памяти
настраивается указанием префикса “memory:
” и
размера
буфера и как правило используется для отладки (1.7.11).
Второй параметр определяет уровень
лога
и может принимать одно из следующих значений:
debug
, info
, notice
,
warn
, error
, crit
,
alert
или emerg
.
Уровни лога, указанные выше, перечислены в порядке возрастания важности.
При установке определённого уровня в лог попадают все сообщения
указанного уровня и уровней большей важности.
Например, при стандартном уровне error
в лог попадают
сообщения уровней error
, crit
,
alert
и emerg
.
Если этот параметр не задан, используется error
.
Для работы уровня лога
debug
необходимо сконфигурировать
nginx с--with-debug
,
см. “Отладочный лог”.
Директива может быть указана на
уровнеstream
начиная с версии 1.7.11
и на уровне
начиная с версии 1.9.0.
Синтаксис: |
events { ... }
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Предоставляет контекст конфигурационного файла, в котором указываются
директивы, влияющие на обработку соединений.
Синтаксис: |
include
|
---|---|
Умолчание: |
— |
Контекст: |
любой
|
Включает в конфигурацию другой файл
или файлы,
подходящие под заданную маску.
Включаемые файлы должны содержать синтаксически верные директивы и блоки.
Пример использования:
include mime.types; include vhosts/*.conf;
Синтаксис: |
load_module
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Эта директива появилась в версии 1.9.11.
Загружает динамический модуль.
Пример:
load_module modules/ngx_mail_module.so;
Синтаксис: |
lock_file
|
---|---|
Умолчание: |
lock_file logs/nginx.lock; |
Контекст: |
main
|
Для реализации accept_mutex и сериализации доступа к
разделяемой памяти nginx использует механизм блокировок.
На большинстве систем блокировки реализованы с помощью атомарных
операций, и эта директива игнорируется.
Для остальных систем применяется механизм файлов блокировок.
Эта директива задаёт префикс имён файлов блокировок.
Синтаксис: |
master_process
|
---|---|
Умолчание: |
master_process on; |
Контекст: |
main
|
Определяет, будут ли запускаться рабочие процессы.
Эта директива предназначена для разработчиков nginx.
Синтаксис: |
multi_accept
|
---|---|
Умолчание: |
multi_accept off; |
Контекст: |
events
|
Если multi_accept
выключен, рабочий процесс
за один раз будет принимать только одно новое соединение.
В противном случае рабочий процесс
за один раз будет принимать сразу все новые соединения.
Директива игнорируется в случае использования метода обработки соединений
kqueue, т.к. данный метод сам сообщает
число новых соединений, ожидающих приёма.
Синтаксис: |
pcre_jit
|
---|---|
Умолчание: |
pcre_jit off; |
Контекст: |
main
|
Эта директива появилась в версии 1.1.12.
Разрешает или запрещает использование JIT-компиляции (PCRE JIT)
для регулярных выражений, известных на момент парсинга конфигурации.
Использование PCRE JIT способно существенно ускорить обработку
регулярных выражений.
Для работы JIT необходима библиотека PCRE версии 8.20 или выше,
собранная с параметром конфигурации--enable-jit
.
При сборке библиотеки PCRE вместе с nginx (--with-pcre=
),
для включения поддержки JIT необходимо использовать параметр
конфигурации--with-pcre-jit
.
Синтаксис: |
pid
|
---|---|
Умолчание: |
pid logs/nginx.pid; |
Контекст: |
main
|
Задаёт файл
, в котором будет храниться номер (PID) главного процесса.
Синтаксис: |
ssl_engine
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Задаёт название аппаратного SSL-акселератора.
Синтаксис: |
thread_pool
|
---|---|
Умолчание: |
thread_pool default threads=32 max_queue=65536; |
Контекст: |
main
|
Эта директива появилась в версии 1.7.11.
Задаёт имя
и параметры пула потоков,
используемого для многопоточной обработки операций чтения и отправки файлов
без блокирования
рабочего процесса.
Параметр threads
задаёт число потоков в пуле.
Если все потоки из пула заняты выполнением заданий,
новое задание будет ожидать своего выполнения в очереди.
Параметр max_queue
ограничивает число заданий,
ожидающих своего выполнения в очереди.
По умолчанию в очереди может находиться до 65536 заданий.
При переполнении очереди задание завершается с ошибкой.
Синтаксис: |
timer_resolution
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Уменьшает разрешение таймеров времени в рабочих процессах, за счёт
чего уменьшается число системных вызовов gettimeofday()
.
По умолчанию gettimeofday()
вызывается после каждой
операции получения событий из ядра.
При уменьшении разрешения gettimeofday()
вызывается только
один раз за указанный интервал
.
Пример использования:
timer_resolution 100ms;
Внутренняя реализация интервала зависит от используемого метода:
-
фильтр
EVFILT_TIMER
при использованииkqueue
; -
timer_create()
при использованииeventport
; -
и
setitimer()
во всех остальных случаях.
Синтаксис: |
use
|
---|---|
Умолчание: |
— |
Контекст: |
events
|
Задаёт метод
, используемый для
обработки соединений.
Обычно нет необходимости задавать его явно, поскольку по умолчанию
nginx сам выбирает наиболее эффективный метод.
Синтаксис: |
user
|
---|---|
Умолчание: |
user nobody nobody; |
Контекст: |
main
|
Задаёт пользователя и группу, с правами которого будут работать
рабочие процессы.
Если группа
не задана, то используется группа, имя
которой совпадает с именем пользователя.
Синтаксис: |
worker_aio_requests
|
---|---|
Умолчание: |
worker_aio_requests 32; |
Контекст: |
events
|
Эта директива появилась в версиях 1.1.4 и 1.0.7.
При использовании aio
совместно с методом обработки соединений
epoll,
задаёт максимальное число
ожидающих обработки операций
асинхронного ввода-вывода для одного рабочего процесса.
Синтаксис: |
worker_connections
|
---|---|
Умолчание: |
worker_connections 512; |
Контекст: |
events
|
Задаёт максимальное число соединений, которые одновременно
может открыть рабочий процесс.
Следует иметь в виду, что в это число входят все соединения
(в том числе, например, соединения с проксируемыми серверами),
а не только соединения с клиентами.
Стоит также учитывать, что фактическое число одновременных
соединений не может превышать действующего ограничения на
максимальное число открытых файлов,
которое можно изменить с помощью worker_rlimit_nofile.
Синтаксис: |
worker_cpu_affinity worker_cpu_affinity
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Привязывает рабочие процессы к группам процессоров.
Каждая группа процессоров задаётся битовой маской
разрешённых к использованию процессоров.
Для каждого рабочего процесса должна быть задана отдельная группа.
По умолчанию рабочие процессы не привязаны к конкретным процессорам.
Например,
worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000;
привязывает каждый рабочий процесс к отдельному процессору, тогда как
worker_processes 2; worker_cpu_affinity 0101 1010;
привязывает первый рабочий процесс к CPU0/CPU2,
а второй — к CPU1/CPU3.
Второй пример пригоден для hyper-threading.
Специальное значение auto
(1.9.10) позволяет
автоматически привязать рабочие процессы к доступным процессорам:
worker_processes auto; worker_cpu_affinity auto;
С помощью необязательной маски можно ограничить процессоры,
доступные для автоматической привязки:
worker_cpu_affinity auto 01010101;
Директива доступна только на FreeBSD и Linux.
Синтаксис: |
worker_priority
|
---|---|
Умолчание: |
worker_priority 0; |
Контекст: |
main
|
Задаёт приоритет планирования рабочих процессов подобно тому,
как это делается командой nice
: отрицательное
число
означает более высокий приоритет.
Диапазон возможных значений, как правило, варьируется от -20 до 20.
Пример использования:
worker_priority -10;
Синтаксис: |
worker_processes
|
---|---|
Умолчание: |
worker_processes 1; |
Контекст: |
main
|
Задаёт число рабочих процессов.
Оптимальное значение зависит от множества факторов, включая
(но не ограничиваясь ими) число процессорных ядер, число
жёстких дисков с данными и картину нагрузок.
Если затрудняетесь в выборе правильного значения, можно начать
с установки его равным числу процессорных ядер
(значение “auto
” пытается определить его
автоматически).
Параметр
auto
поддерживается только начиная
с версий 1.3.8 и 1.2.5.
Синтаксис: |
worker_rlimit_core
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Изменяет ограничение на наибольший размер core-файла
(RLIMIT_CORE
) для рабочих процессов.
Используется для увеличения ограничения без перезапуска главного процесса.
Синтаксис: |
worker_rlimit_nofile
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Изменяет ограничение на максимальное число открытых файлов
(RLIMIT_NOFILE
) для рабочих процессов.
Используется для увеличения ограничения без перезапуска главного процесса.
Синтаксис: |
worker_shutdown_timeout
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Эта директива появилась в версии 1.11.11.
Задаёт таймаут в секундах для плавного завершения рабочих процессов.
По истечении указанного времени
nginx попытается закрыть все открытые соединения
для ускорения завершения.
Синтаксис: |
working_directory
|
---|---|
Умолчание: |
— |
Контекст: |
main
|
Задаёт каталог, который будет текущим для рабочего процесса.
Основное применение — запись core-файла, в этом случае рабочий
процесс должен иметь права на запись в этот каталог.
Is there a way to have the master process log to STDOUT STDERR instead of to a file?
It seems that you can only pass a filepath to the access_log directive:
access_log /var/log/nginx/access.log
And the same goes for error_log:
error_log /var/log/nginx/error.log
I understand that this simply may not be a feature of nginx, I’d be interested in a concise solution that uses tail, for example. It is preferable though that it comes from the master process though because I am running nginx in the foreground.
Ankur Loriya
3,2388 gold badges31 silver badges58 bronze badges
asked Mar 20, 2014 at 17:55
2
Edit: it seems nginx now supports error_log stderr;
as mentioned in Anon’s answer.
You can send the logs to /dev/stdout
. In nginx.conf
:
daemon off;
error_log /dev/stdout info;
http {
access_log /dev/stdout;
...
}
edit: May need to run ln -sf /proc/self/fd /dev/ if using running certain docker containers, then use /dev/fd/1
or /dev/fd/2
answered Apr 27, 2014 at 20:15
PatrickPatrick
5,5444 gold badges31 silver badges36 bronze badges
10
If the question is docker related… the official nginx docker images do this by making softlinks towards stdout/stderr
RUN ln -sf /dev/stdout /var/log/nginx/access.log && ln -sf /dev/stderr /var/log/nginx/error.log
REF: https://microbadger.com/images/nginx
answered Feb 21, 2017 at 14:07
BoeboeBoeboe
1,9911 gold badge16 silver badges20 bronze badges
6
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:
error_log logs/error.log error;
Context: main, http, stream, server, location
http://nginx.org/en/docs/ngx_core_module.html#error_log
Don’t use: /dev/stderr
This will break your setup if you’re going to use systemd-nspawn.
timiTao
1,4213 gold badges20 silver badges34 bronze badges
answered Apr 29, 2015 at 18:22
AnonAnon
3013 silver badges2 bronze badges
0
For a debug purpose:
/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"
For a classic purpose
/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"
Require
Under the server bracket on the config file
access_log /dev/stdout;
answered Jan 13, 2020 at 3:20
intikaintika
7,8225 gold badges34 silver badges52 bronze badges
When running Nginx in a Docker container, be aware that a volume mounted over the log dir defeats the purpose of creating a softlink between the log files and stdout/stderr in your Dockerfile, as described in @Boeboe ‘s answer.
In that case you can either create the softlink in your entrypoint (executed after volumes are mounted) or not use a volume at all (e.g. when logs are already collected by a central logging system).
answered May 16, 2017 at 16:54
veuncentveuncent
1,4891 gold badge18 silver badges17 bronze badges
In docker image of PHP-FPM, i’ve see such approach:
# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2
[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2
answered Feb 1, 2019 at 8:11
Oleg NeumyvakinOleg Neumyvakin
9,3383 gold badges58 silver badges59 bronze badges
Содержание
- Configuring Logging
- Setting Up the Error Log
- Setting Up the Access Log
- Enabling Conditional Logging
- Usecase: Sampling TLS Parameters
- Logging to Syslog
- Live Activity Monitoring
- Модуль ngx_http_log_module
- Пример конфигурации
- Директивы
Configuring Logging
Capture detailed information about errors and request processing in log files, either locally or via syslog.
This article describes how to configure logging of errors and processed requests in NGINX Open Source and NGINX Plus.
Setting Up the Error Log
NGINX writes information about encountered issues of different severity levels to the error log. The error_log directive sets up logging to a particular file, stderr , or syslog and specifies the minimal severity level of messages to log. By default, the error log is located at logs/error.log (the absolute path depends on the operating system and installation), and messages from all severity levels above the one specified are logged.
The configuration below changes the minimal severity level of error messages to log from error to warn :
In this case, messages of warn , error crit , alert , and emerg levels are logged.
The default setting of the error log works globally. To override it, place the error_log directive in the main (top-level) configuration context. Settings in the main context are always inherited by other configuration levels ( http , server , location ). The error_log directive can be also specified at the http, stream, server and location levels and overrides the setting inherited from the higher levels. In case of an error, the message is written to only one error log, the one closest to the level where the error has occurred. However, if several error_log directives are specified on the same level, the message are written to all specified logs.
Note: The ability to specify multiple error_log directives on the same configuration level was added in NGINX Open Source version 1.5.2.
Setting Up the Access Log
NGINX writes information about client requests in the access log right after the request is processed. By default, the access log is located at logs/access.log, and the information is written to the log in the predefined combined format. To override the default setting, use the log_format directive to change the format of logged messages, as well as the access_log directive to specify the location of the log and its format. The log format is defined using variables.
The following examples define the log format that extends the predefined combined format with the value indicating the ratio of gzip compression of the response. The format is then applied to a virtual server that enables compression.
Another example of the log format enables tracking different time values between NGINX and an upstream server that may help to diagnose a problem if your website experience slowdowns. You can use the following variables to log the indicated time values:
- $upstream_connect_time – The time spent on establishing a connection with an upstream server
- $upstream_header_time – The time between establishing a connection and receiving the first byte of the response header from the upstream server
- $upstream_response_time – The time between establishing a connection and receiving the last byte of the response body from the upstream server
- $request_time – The total time spent processing a request
All time values are measured in seconds with millisecond resolution.
When reading the resulting time values, keep the following in mind:
- When a request is processed through several servers, the variable contains several values separated by commas
- When there is an internal redirect from one upstream group to another, the values are separated by semicolons
- When a request is unable to reach an upstream server or a full header cannot be received, the variable contains 0 (zero)
- In case of internal error while connecting to an upstream or when a reply is taken from the cache, the variable contains — (hyphen)
Logging can be optimized by enabling the buffer for log messages and the cache of descriptors of frequently used log files whose names contain variables. To enable buffering use the buffer parameter of the access_log directive to specify the size of the buffer. The buffered messages are then written to the log file when the next log message does not fit into the buffer as well as in some other cases.
To enable caching of log file descriptors, use the open_log_file_cache directive.
Similar to the error_log directive, the access_log directive defined on a particular configuration level overrides the settings from the previous levels. When processing of a request is completed, the message is written to the log that is configured on the current level, or inherited from the previous levels. If one level defines multiple access logs, the message is written to all of them.
Enabling Conditional Logging
Conditional logging allows excluding trivial or unimportant log entries from the access log. In NGINX, conditional logging is enabled by the if parameter to the access_log directive.
This example excludes requests with HTTP status codes 2xx (Success) and 3xx (Redirection):
Usecase: Sampling TLS Parameters
Many clients use TLS versions older than TLS 1.3. Though many ciphers are declared insecure, older implementations still use them; ECC certificates offer greater performance than RSA, but not all clients can accept ECC. Many TLS attacks rely on a “man in the middle” who intercepts the cipher negotiation handshake and forces the client and server to select a less secure cipher. Therefore, it’s important to configure NGINX Plus to not support weak or legacy ciphers, but doing so may exclude legacy clients.
You can evaluate the SSL data obtained from the client and determine what proportion of clients get excluded if support for older SSL protocols and ciphers is removed.
The following configuration example logs the SSL protocol, cipher, and User-Agent header of any connected TLS client, assuming that each client selects the most recent protocol and most secure ciphers it supports.
In this example, each client is identified by its unique combination of IP address and User-Agent.
Define the custom log format sslparams that includes the version of the SSL protocol ( $ssl_protocol ), ciphers used in the connection ( $ssl_cipher ), the client IP address ( $remote_addr ), and the value of standard User Agent HTTP request field ( $http_user_agent ):
Define a key-value storage that will keep the IP address of the client and its User Agent, for example, clients :
Create a variable, for example, $seen for each unique combination of $remote_addr and User-Agent header:
View the log file generated with this configuration:
Process the log file to determine the spread of data:
In this output, low‑volume, less secure ciphers are identified:
Then you can check the logs to determine which clients are using these ciphers and then make a decision about removing these ciphers from the NGINX Plus configuration.
For more information about sampling requests with NGINX conditional logging see the blog post.
Logging to Syslog
The syslog utility is a standard for computer message logging and allows collecting log messages from different devices on a single syslog server. In NGINX, logging to syslog is configured with the syslog: prefix in error_log and access_log directives.
Syslog messages can be sent to a server= which can be a domain name, an IP address, or a UNIX-domain socket path. A domain name or IP address can be specified with a port to override the default port, 514 . A UNIX-domain socket path can be specified after the unix: prefix:
In the example, NGINX error log messages are written to a UNIX domain socket at the debug logging level, and the access log is written to a syslog server with an IPv6 address and port 1234 .
The facility= parameter specifies the type of program that is logging the message. The default value is local7 . Other possible values are: auth , authpriv , daemon , cron , ftp , lpr , kern , mail , news , syslog , user , uucp , local0 . local7 .
The tag= parameter applies a custom tag to syslog messages ( nginx in our example).
The severity= parameter sets the severity level of syslog messages for access log. Possible values in order of increasing severity are: debug , info , notice , warn , error (default), crit , alert , and emerg . Messages are logged at the specified level and all more severe levels. In our example, the severity level error also enables crit , alert , and emerg levels to be logged.
Live Activity Monitoring
NGINX Plus provides a real-time live activity monitoring interface that shows key load and performance metrics of your HTTP and TCP upstream servers. See the Live Activity Monitoring article for more information.
To learn more about NGINX Plus, please visit the Products page.
Источник
Модуль ngx_http_log_module
Модуль ngx_http_log_module записывает логи запросов в указанном формате.
Логи записываются в контексте location’а, где заканчивается обработка. Это может быть location, отличный от первоначального, если в процессе обработки запроса происходит внутреннее перенаправление.
Пример конфигурации
Директивы
Синтаксис: | access_log путь [ формат [ buffer = размер ] [ gzip[= степень ] ] [ flush = время ] [ if = условие ]]; access_log off ; |
---|---|
Умолчание: | |
Контекст: | http , server , location , if в location , limit_except |
Задаёт путь, формат и настройки буферизованной записи в лог. На одном уровне конфигурации может использоваться несколько логов. Запись в syslog настраивается указанием префикса “ syslog: ” в первом параметре. Специальное значение off отменяет все директивы access_log для текущего уровня. Если формат не указан, то используется предопределённый формат “ combined ”.
Если задан размер буфера с помощью параметра buffer или указан параметр gzip (1.3.10, 1.2.7), то запись будет буферизованной.
Размер буфера должен быть не больше размера атомарной записи в дисковый файл. Для FreeBSD этот размер неограничен.
При включённой буферизации данные записываются в файл:
- если очередная строка лога не помещается в буфер;
- если данные в буфере находятся дольше интервала времени, заданного параметром flush (1.3.10, 1.2.7);
- при переоткрытии лог-файла или завершении рабочего процесса.
Если задан параметр gzip , то буфер будет сжиматься перед записью в файл. Степень сжатия может быть задана в диапазоне от 1 (быстрее, но хуже сжатие) до 9 (медленнее, но лучше сжатие). По умолчанию используются буфер размером 64К байт и степень сжатия 1. Данные сжимаются атомарными блоками, и в любой момент времени лог-файл может быть распакован или прочитан с помощью утилиты “ zcat ”.
Для поддержки gzip-сжатия логов nginx должен быть собран с библиотекой zlib.
В пути файла можно использовать переменные (0.7.6+), но такие логи имеют некоторые ограничения:
- пользователь, с правами которого работают рабочие процессы, должен иметь права на создание файлов в каталоге с такими логами;
- не работает буферизация;
- файл открывается для каждой записи в лог и сразу же после записи закрывается. Следует однако иметь в виду, что поскольку дескрипторы часто используемых файлов могут храниться в кэше, то при вращении логов в течение времени, заданного параметром valid директивы open_log_file_cache, запись может продолжаться в старый файл.
- при каждой записи в лог проверяется существование корневого каталога для запроса — если этот каталог не существует, то лог не создаётся. Поэтому root и access_log нужно описывать на одном уровне конфигурации:
Параметр if (1.7.0) включает условную запись в лог. Запрос не будет записываться в лог, если результатом вычисления условия является “0” или пустая строка. В следующем примере запросы с кодами ответа 2xx и 3xx не будут записываться в лог:
Синтаксис: | log_format название [ escape = default | json | none ] строка . ; |
---|---|
Умолчание: | |
Контекст: | http |
Задаёт формат лога.
Параметр escape (1.11.8) позволяет задать экранирование символов json или default в переменных, по умолчанию используется default . Значение none (1.13.10) отключает экранирование символов.
При использовании default символы “ » ”, “ ”, a также символы со значениями меньше 32 (0.7.0) или больше 126 (1.1.6) экранируются как “ xXX ”. Если значение переменной не найдено, то в качестве значения в лог будет записываться дефис (“ — ”).
При использовании json экранируются все символы, недопустимые в JSON строках: символы “ » ” и “ ” экранируются как “ » ” и “ \ ”, символы со значениями меньше 32 экранируются как “ n ”, “ r ”, “ t ”, “ b ”, “ f ” или “ u00XX ”.
Кроме общих переменных в формате можно использовать переменные, существующие только на момент записи в лог:
$bytes_sent число байт, переданное клиенту $connection порядковый номер соединения $connection_requests текущее число запросов в соединении (1.1.18) $msec время в секундах с точностью до миллисекунд на момент записи в лог $pipe “ p ” если запрос был pipelined, иначе “ . ” $request_length длина запроса (включая строку запроса, заголовок и тело запроса) $request_time время обработки запроса в секундах с точностью до миллисекунд; время, прошедшее с момента чтения первых байт от клиента до момента записи в лог после отправки последних байт клиенту $status статус ответа $time_iso8601 локальное время в формате по стандарту ISO 8601 $time_local локальное время в Common Log Format
Строки заголовка, переданные клиенту, начинаются с префикса “ sent_http_ ”, например, $sent_http_content_range .
В конфигурации всегда существует предопределённый формат “ combined ”:
Синтаксис: | open_log_file_cache max = N [ inactive = время ] [ min_uses = N ] [ valid = время ]; open_log_file_cache off ; |
---|---|
Умолчание: | |
Контекст: | http , server , location |
Задаёт кэш, в котором хранятся дескрипторы файлов часто используемых логов, имена которых заданы с использованием переменных. Параметры директивы:
max задаёт максимальное число дескрипторов в кэше; при переполнении кэша наименее востребованные (LRU) дескрипторы закрываются inactive задаёт время, после которого закэшированный дескриптор закрывается, если к нему не было обращений в течение этого времени; по умолчанию 10 секунд min_uses задаёт минимальное число использований файла в течение времени, заданного параметром inactive , после которого дескриптор файла будет оставаться открытым в кэше; по умолчанию 1 valid задаёт, через какое время нужно проверять, что файл ещё существует под тем же именем; по умолчанию 60 секунд off запрещает кэш
Источник
Файлы логов — первое место, где нужно искать ошибки. Особенно если это касается веб-сервера. В Nginx всего два основных лога: error_log и access_log.
Логирование ошибок Nginx происходит в определенный файл, stderr или syslog. Он собирает все ошибки, которые произошли во время работы веб-сервера. По умолчанию он включен глобально:
error_log logs/error.log error; |
Для сбора только определенных ошибок необходимо разместить директиву в секции http, server, stream или location. А так можно логировать только критические ошибки и сигналы тревоги:
error_log logs/error.log <b>warn</b>; |
Лог доступа access_log
Лог доступа Nginx по умолчанию размещен в директории logs/access.log. В него записываются данные о запросах пользователей, как только эти запросы обработаны. Для изменения директории расположения лога используется директива access_log:
access_log logs/access.log <b>combined</b>; |
В расширенном виде access_log можно настроить по своим требованиям:
[codesyntax lang=»php»]
http { log_format compression ‘$remote_addr — $remote_user [$time_local] ‘ ‘»$request» $status $body_bytes_sent ‘ ‘»$http_referer» «$http_user_agent» «$gzip_ratio»‘; server { gzip on; access_log /spool/logs/nginx-access.log compression; ... } } |
[/codesyntax]
Также можно исключить ненужную информацию из лога:
[codesyntax lang=»php»]
map $status $loggable { ~^[23] 0; default 1; } access_log /path/to/access.log combined if=$loggable; |
[/codesyntax]
Запись в syslog
Стандартная для UNIX-систем утилита syslog может собирать логи и различные сообщения разных процессов на одном сервере:
access_log <b>syslog</b>:server=[2001:db8::1]:1234,facility=local7,tag=nginx,severity=info; |
Директива server указывает адрес сервера (здесь IPv6) и порт. А facility — специфические параметры программы: auth, authpriv, daemon, cron, ftp, lpr, kern, mail, news, syslog,user, uucp, local0 … local7.
Включение режима debug
При необходимости можно включить Nginx debug-режим записи логов, который обеспечивает расширенную информацию и полезен при решении серьезных проблем:
error_log logs/error.log debug; |