2016-08-19 90 views
1

我在獲取nginx以有條件地記錄請求正文時遇到了一些麻煩。我不想記錄登錄憑證,並且相應地包含了一個映射,該映射在URI不是登錄URI時正確觸發。似乎有使用

  • client_body_in_single_buffer on
  • fastcgi_pass php_cgi
  • echo_read_request_body

但沒有這些似乎幫助了很多類似的帖子提示的。有任何想法嗎?以下是目前的配置。

map $request_uri $log_body { 

    ~/login 0; 
    default 1; 
} 

log_format filter '$remote_addr - $remote_user [$time_local] ' 
    '"$request" $status $request_time $upstream_response_time "$scrubbed_request"'; 

server { 
    listen 443 ssl; 
    server_name localhost; 

    ssl_certificate /etc/ssl/site.crt; 
    ssl_certificate_key /etc/ssl/site.key; 

    access_log /var/log/nginx/site.log filter; 

    location /branch/dev/v2/ { 

    set $scrubbed_request 'NOT LOGGED'; 
    if ($log_body) { 
     set $scrubbed_request $request_body; 
    } 
    rewrite /branch/dev/(.*) /$1 break; 
    proxy_pass http://127.0.0.1:3001; 
    } 
    location /branch/dev/ { 
    rewrite /branch/dev/(.*) /$1 break; 
    proxy_pass http://127.0.0.1:4001; 
    } 
} 

注意,如果$scrubbed_request在log_format線替換爲$request_body,我們也捕獲所有請求主體。這讓我認爲set聲明以某種方式以一種意想不到的方式消耗request_body

回答

0

它總是一個好主意,read the documentation

變量的值是由proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass指令處理的位置時可獲得請求體念給一個memory buffer

正如你所看到的,你必須配置你的client_body_buffer_size大到足以將整個身體存儲在內存中。

您也不需要set報表,您可以使用the if parameter of access_log和不同的格式。

+0

如果我的請求主體只是一個像'abcdef'這樣的小字符串,如何提高'client_body_in_single_buffer'的幫助?看起來這個字符串應該很容易適應16K緩衝區,文檔說這是爲64位實例提供的。我錯過了什麼嗎? – Justin

+0

@Justin你還沒有提到你的請求體有多大。所以,大小是可以的,那麼你應該避免使用'set'。 'set'指令是重寫模塊的一部分,它在nginx開始讀取主體之前工作。 – VBart