Nginx журнал запросов и ответов API Proxy

Вопрос или проблема

У меня есть конфигурация для перенаправления всех моих локальных API-запросов (от клиента с заголовком apikey) с example.com на удаленный API-сервер distant-api-server.com:8000).

upstream api-server {
    server distant-api-server.com:8000;
}

server {
    listen 80;
    index index.html;
    server_name example.com;

    location ~ /api/(?<path>.*) {                                               

    if ($request_method = OPTIONS ) {                                       
        add_header 'Access-Control-Allow-Origin' "$http_origin";            
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';     
        add_header 'Access-Control-Allow-Headers' 'apikey';                 
        return 200;                                                         
    }                                                                       

    if ($api_route = "error"){return 501;}                                  

        error_page 501 /501_apikey.html;                                    

        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT';
        add_header 'Access-Control-Allow-Headers' 'apikey';
        proxy_set_header X-Real-IP $remote_addr;                            
        proxy_set_header X-NginX-Proxy true;                                
        proxy_pass http://$api_route/$path$is_args$args;                    
        proxy_set_header X-Forwarded-For $remote_addr;                      
        proxy_set_header X-Forwarded-Host $remote_addr;                     
        proxy_ssl_session_reuse off;                                        
        proxy_set_header Host $http_host;                                   
        proxy_redirect off;                                                 
    }
}

Я хотел бы вести учет:
– Запроса, отправленного с локального сервера на /api
– Запроса, который затем отправляет Nginx на http://$api_route/$path$is_args$args
– Ответа, полученного от удаленного API и переданного Nginx на страницу моего клиента

На данный момент, когда я делаю запросы к /api, возникает ошибка на удаленном API, и затем мой запрос истекает по времени. Знание того, что отправляет/получает Nginx, помогло бы мне в отладке.

Как я могу добиться такого рода логирования?

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

Что вам следует сделать, так это определить свой собственный формат журнала для логирования upstream/proxy, а затем добавить директиву access_log в окружение, из которого вы делаете proxy_pass с использованием вашего пользовательского формата журнала.

location ~ /api/(?<path>.*) {
    log_format upstream_logging . . .;
    . . .
    access_log /var/log/nginx/api_logging.log upstream_logging;
}

И вы можете включить в свой формат журнала любые переменные из nginx, которые вы хотите. Вам придется указать, какие заголовки вы хотите получать индивидуально из upstream используя переменные здесь, например $upstream_http_server. Вот один предложенный формат логирования для регистрации информации upstream, который вы можете использовать в качестве отправной точки.

log_format upstream_logging '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';

Ответ или решение

Логи запросов и ответов с помощью Nginx в качестве API-прокси

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

Шаги для настройки логирования в Nginx

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

  1. Определение формата логов для запросов к API. Вам нужно будет создать формат логов для записи запросов и ответов. Пример такого формата может выглядеть следующим образом:

    log_format upstream_logging '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';

    В этом формате записывается время запроса, IP-адрес клиента, имя сервера, адрес удалённого сервера, время ответа и время обработки запроса. Эту информацию можно легко использовать для отладки.

  2. Добавление директивы access_log в вашу локацию API. Вам нужно будет добавить указанную директиву в ваше текущее определение локации:

    location ~ /api/(?<path>.*) {
       ...
       access_log /var/log/nginx/api_logging.log upstream_logging;
       ...
    }

    Это позволит записывать все входящие запросы и ответы в файл api_logging.log по указанному пути.

  3. Логирование дополнительных заголовков. Если вы хотите записать конкретные заголовки ответа от удалённого сервера, вам нужно будет добавить их с помощью специальных переменных. Например, чтобы записывать заголовки, возвращаемые удалённым API, вы можете добавить следующее:

    log_format upstream_logging '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time upstream_header: $upstream_http_custom_header';

    Убедитесь, что вы заменяете custom_header на название именно того заголовка, который вам важен.

Пример полной конфигурации

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

upstream api-server {
    server distant-api-server.com:8000;
}

server {
    listen 80;
    index index.html;
    server_name example.com;

    log_format upstream_logging '[$time_local] $remote_addr - $remote_user - $server_name to: $upstream_addr: $request upstream_response_time $upstream_response_time msec $msec request_time $request_time';

    location ~ /api/(?<path>.*) {                                               
        if ($request_method = OPTIONS ) {
            add_header 'Access-Control-Allow-Origin' "$http_origin";            
            add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';     
            add_header 'Access-Control-Allow-Headers' 'apikey';                 
            return 200;                                                         
        }

        if ($api_route = "error"){return 501;}                                  

        error_page 501 /501_apikey.html;

        access_log /var/log/nginx/api_logging.log upstream_logging;  # Добавлено форматирование логов

        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS, PUT';
        add_header 'Access-Control-Allow-Headers' 'apikey';
        proxy_set_header X-Real-IP $remote_addr;                            
        proxy_set_header X-NginX-Proxy true;                                
        proxy_pass http://$api_route/$path$is_args$args;                    
        proxy_set_header X-Forwarded-For $remote_addr;                      
        proxy_set_header X-Forwarded-Host $remote_addr;                     
        proxy_ssl_session_reuse off;                                        
        proxy_set_header Host $http_host;                                   
        proxy_redirect off;                                                 
    }
}

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...