Nginx 日志请求和响应 API 代理

Nginx 日志请求和响应 API 代理

我有一个配置,将我所有的本地 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 发送/接收的内容将有助于我进行调试。

我怎样才能实现这种日志记录?

答案1

楼主,欢迎来到 Server Fault!仅供参考,请听取@MichaelHampton 的建议并三思而行。在这种情况下,访问日志确实为您提供您可能需要的信息。您只需告诉它您想要记录什么。

为了扩展 M Hampton 的建议,您应该做的是定义您自己的上游/代理日志记录的日志格式,然后使用您的自定义日志格式将access_log指令添加到您执行操作的位置proxy_pass

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

您可以在日志格式中包含任何来自 nginx 的变量。您必须从上游单独指定您想要的标头在这里使用变量例如$upstream_http_server。下面是用于记录上游信息的一种建议的日志记录格式,您可以将其用作起点。

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';

稍微搜索一下并阅读文档(并听听 M Hampton 的演讲!)将对你大有裨益。祝你好运!

相关内容