2016-08-19 23 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に常に良い考えです:リクエストボディがmemory bufferに読まれたとき

変数の値がproxy_pass、fastcgi_pass、uwsgi_pass、およびscgi_passディレクティブによって処理された場所で利用できるようになります。

ご覧のとおり、client_body_buffer_sizeは全身をメモリに保存するのに十分な大きさに設定する必要があります。

setステートメントも必要ありません。the if parameter of access_logと異なるフォーマットを使用できます。

+0

私のリクエストボディが 'abcdef'のような小さな文字列だった場合、' client_body_in_single_buffer'を助けるのはどうでしょうか?それは、文字列が、64ビットのインスタンスのためにプロビジョニングされていると言っている16Kバッファに簡単に収まるように思えます。何か不足していますか? – Justin

+0

@Justinあなたのリクエストボディがどれほど大きいかは述べていません。サイズは大丈夫ですので、 'set'を使わないでください。 'set'ディレクティブは、nginxが本文を読み始める前に動作するrewriteモジュールの一部です。 – VBart

関連する問題