如何为nginx ingress控制器的访问日志添加x-forwarded-for字段?

10
我正在使用gke上的nginx ingress控制器,默认情况下我的访问日志如下所示:

"10.123.0.20 - [10.123.0.20] - - [22/Apr/2019:18:47:59 +0000] "GET /sdflksdf/sdfsdf HTTP/2.0" 404 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/538.12 (KHTML, like Gecko) Chrome/73.0.3683.100 Safari/537.36" 26 0.002 [default-blah-80] 10.44.0.26:80 0 0.001 404 skjf0s93jf0ws93jfsijf3s3fjs3i

我希望在我的访问日志中添加x-forwarded-for头部信息,如果可能的话,我希望该字段添加在当前日志行的末尾。或者将其添加到日志行开头也可以。我正在查看他们的文档,但不清楚如何在访问日志中添加x-forwarded-for: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/log-format/

1
"10.123.0.20" - 这应该是 $remote_addr。那 X-Forwarded-For 不是吗?如果不是的话,为什么? - Vasili Angapov
2个回答

15

你应该使用ConfigMap来定制NGINX配置

ConfigMaps允许您将配置文件与镜像内容解耦,以保持容器化应用的��移植性。

ConfigMap API资源将配置数据存储为键值对。这些数据为系统组件(如nginx-controller)提供了配置。

要配置自定义日志,您需要使用log-format-upstream键。

e.g.:

创建以下配置映射:
apiVersion: v1
data:
  log-format-upstream: '$remote_addr - $request_id - [$proxy_add_x_forwarded_for] - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" $request_length $request_time [$proxy_upstream_name] $upstream_addr $upstream_response_length $upstream_response_time $upstream_status'
kind: ConfigMap
metadata:
  name: nginx-ingress-config

确保您在使用nginx-ingress-controller时将--configmap=$(POD_NAMESPACE)/nginx-ingress-config作为命令args来自官方库的示例)。


我想使用默认的日志配置 https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/log-format/,并在其末尾添加 x-forwarded-for。你能否将整个内容作为字符串添加到 configMap 中,并包括条件语句 {{ if $cfg.useProxyProtocol }}$proxy_protocol_addr{{ else }}$remote_addr{{ end }} - red888

0

从helm官方仓库安装nginx-ingress的方法是将controller.service.externalTrafficPolicy设置为Local,如下所示。

helm install nginx-ingress stable/nginx-ingress --set rbac.create=true --set controller.service.externalTrafficPolicy=Local

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接