Поиск по сайту:

Как настроить пользовательский доступ и форматы журналов ошибок в Nginx


HTTP-сервер Nginx имеет феноменальную возможность ведения журналов с широкими возможностями настройки. В этой статье мы объясним, как настроить собственные форматы журналов доступа и ошибок для Nginx в Linux.

Цель этого руководства — помочь вам понять, как генерируются журналы, чтобы настроить собственные форматы журналов для целей отладки, устранения неполадок или анализа того, что происходит на вашем веб-сервере, а также в веб-приложениях (например, для отслеживания запросов).

Читайте также: 4 хороших инструмента для мониторинга и управления журналами с открытым исходным кодом для Linux

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

Настройка журналов доступа в Nginx

В Nginx все клиентские запросы к серверу записываются в журнал доступа в указанном формате с помощью модуля ngx_http_log_module.

Файл журнала по умолчанию — log/access.log (обычно /var/log/nginx/access_log в системах Linux), а форматом журнала по умолчанию обычно является комбинированный или основной формат. формат (он может варьироваться от одного дистрибутива к другому).

Директива access_log (применимо к http, серверу, местоположению, если оно указано в местоположении и ограничено контекстом) используется для установки файла журнала, а директива log_format (применяется в соответствии с только контекст http) используется для установки формата журнала. Формат журнала описывается общими переменными и переменными, которые генерируются только во время записи журнала.

Синтаксис настройки формата журнала:

log_format format_name 'set_of_variables_to_define_format';

и синтаксис для настройки журнала доступа:

access_log /path/to/log_file format_name;		#simplest form 
OR
access_log /path/to/log_file [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]];

Ниже приведен отрывок из файла конфигурации Nginx по умолчанию /etc/nginx/nginx.conf в CentOS 7.

http {
	#main log format 
	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;
}

Этот формат журнала дает следующую запись журнала.

127.0.0.1 - dbmanager [20/Nov/2017:18:52:17 +0000] "GET / HTTP/1.1" 401 188 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"

Ниже приведен еще один полезный формат журналирования, который мы используем для отслеживания запросов к нашим веб-приложениям с использованием некоторых переменных по умолчанию. Самое главное, он содержит идентификатор запроса и записывает сведения о местоположении клиента (страна, код страны, регион и город).

log_format  custom '$remote_addr - $remote_user [$time_local] '
                         	     '"$request" $status $body_bytes_sent '
                      		     '"$http_referer" "$http_user_agent" '
                     		     '"$http_x_forwarded_for" $request_id '
                   		     '$geoip_country_name $geoip_country_code '
                  		     '$geoip_region_name $geoip_city ';

Вы можете использовать его следующим образом:

access_log  /var/log/nginx/access.log custom;

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

153.78.107.192 - - [21/Nov/2017:08:45:45 +0000] "POST /ngx_pagespeed_beacon?url=https%3A%2F%2Fwww.example.com%2Fads%2Ffresh-oranges-1509260795 HTTP/2.0" 204 0 "https://www.suasell.com/ads/fresh-oranges-1509260795" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0" "-" a02b2dea9cf06344a25611c1d7ad72db Uganda UG Kampala Kampala 

Вы можете указать несколько журналов с помощью директив access_log на одном уровне, здесь мы используем более одного файла журнала в контексте http.

http{
	##default log format
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                                	      '$status $body_bytes_sent "$http_referer" '
                                         '"$http_user_agent" "$http_x_forwarded_for"';
      
	##request tracing using custom format
	log_format custom '$remote_addr - $remote_user [$time_local] '
                                           '"$request" $status $body_bytes_sent '
                                           '"$http_referer" "$http_user_agent" '
                                           '"$http_x_forwarded_for" $request_id '
                                           '$geoip_country_name $geoip_country_code '
                                          '$geoip_region_name $geoip_city ';

	##this uses the default log format
	access_log /var/log/nginx/access.log;

	##this uses the our custom log format
	access_log /var/log/nginx/custom_log custom;
}

Ниже приведены примеры более сложных конфигураций журналирования, которые полезны для форматов журналов, содержащих переменные, связанные со сжатием, а также для создания сжатых файлов журналов:

access_log /var/log/nginx/custom_log custom buffer 32k;
access_log /path/to/log.gz compression  gzip  flush=5m;

Настройка журналов ошибок в Nginx

В случае возникновения сбоев в работе Nginx он записывает информацию о них в журнал ошибок. Эти проблемы имеют разные уровни серьезности: отладка, информация, уведомление, предупреждение, ошибка. Strong> (это уровень по умолчанию и работает глобально), крит, предупреждение или экстренный.

Файл журнала по умолчанию — log/error.log, но в дистрибутивах Linux он обычно находится в /var/log/nginx/. Директива error_log используется для указания файла журнала и может использоваться в контексте основного, http, почты, потока, сервера и местоположения (именно в этом порядке).

Вам также следует отметить, что:

  • Конфигурации в основном контексте всегда наследуются более низкими уровнями в порядке, указанном выше.
  • а конфигурации нижних уровней переопределяют конфигурации, унаследованные от более высоких уровней.

Вы можете настроить ведение журнала ошибок, используя следующий синтаксис:

error_log /path/to/log_file log_level;

Например:

error_log /var/log/nginx/error_log warn; 

Это предписывает Nginx регистрировать все сообщения типа warn и более серьезного уровня журнала crit, alert и emerg. Сообщения.

В следующем примере будут регистрироваться сообщения уровней критическое, предупреждение и аварийное.

error_log /var/www/example1.com/log/error_log crit;

Рассмотрим конфигурацию ниже: здесь мы определили регистрацию ошибок на разных уровнях (в контексте http и сервера). В случае ошибки сообщение записывается только в один журнал ошибок, ближайший к уровню, на котором возникла ошибка.

http {
	log_format compression '$remote_addr - $remote_user [$time_local] '
                           '"$request" $status $body_bytes_sent '
                           '"$http_referer" "$http_user_agent" "$gzip_ratio"';
	
	error_log  /var/log/nginx/error_log  crit;

    	server {
		listen 80;
		server_name example1.com;

		#this logs errors messages for example1.com only
      		error_log  /var/log/nginx/example1.error_log  warn;
            	…...
	}

     	server {
		listen 80;
		server_name  example2.com;

		#this logs errors messages for example2.com only
        		error_log  /var/log/nginx/example1.error_log;
        		…….
    	}
}

Если вы используете более одной директивы error_log, как в конфигурации ниже (тот же уровень), сообщения записываются во все указанные журналы.

server {
		listen 80;
		server_name example1.com;

      		error_log  /var/www/example1.com/log/error_log  warn;
		error_log  /var/log/nginx/example1.error_log  crit;
            	…...
	}

Настройка условного журналирования в Nginx

В некоторых случаях нам может потребоваться, чтобы Nginx выполнял условную регистрацию сообщений. Не каждое сообщение должно регистрироваться Nginx, поэтому мы можем игнорировать незначительные или менее важные записи в наших журналах доступа для определенных случаев.

Мы можем использовать модуль ngx_http_map_module, который создает переменные, значения которых зависят от значений других переменных. Параметры внутри блока карты (который должен существовать только в содержимом http) определяют сопоставление между исходными и результирующими значениями.

Для этого типа настройки запрос не будет зарегистрирован, если условие оценивается как “0” или пустая строка. В этом примере исключаются запросы с кодами состояния HTTP 2xx и 3xx.

http{
	map $status $condition {
		~^[23] 0;
    		default 1;
	}
	server{
		access_log  /path/to/access.log  custom if=$condition;
	}
}

Вот еще один полезный пример отладки веб-приложения на этапе разработки. При этом будут игнорироваться все сообщения и записываться только отладочная информация.

 
http{
	map $info  $debuggable { 
    		default     0; 
    		debug       1; 
	} 
	server{
		……..
		access_log /var/log/nginx/testapp_debug_access_log  debug if=$debuggable; 
		#logs other requests 
		access_log  /var/log/nginx/testapp_access.log  main; 
		…….
	}
}

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

На данный момент это все! В этом руководстве мы объяснили, как настроить собственный формат журналов доступа и ошибок в Nginx. Используйте форму обратной связи ниже, чтобы задать вопросы или поделиться своими мыслями об этой статье.