V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
LeeReamond
V2EX  ›  问与答

项目经过 Nginx 均衡负载后产生的日志问题

  •  
  •   LeeReamond · 2021-02-15 20:21:25 +08:00 · 605 次点击
    这是一个创建于 1411 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如题,Nginx 本身是带有日志功能的,默认设置下可以看到哪些 IP,访问了哪个路由,用的什么设备等等。但是通常业务端还想记录一些业务相关的内容,比如由哪个用户进行访问,使用了什么配置、什么权限等等,这些信息必须要到业务端的日志里才能获取到。但是经过 nginx 反代之后原始的 IP 信息会丢失,业务端日志里看到的请求者全都是 nginx,很令人迷惑,而 nginx 里某一 IP 的对应业务端记录,又不知道去哪个节点里找,

    这种问题一般要怎么解决呢?

    13 条回复    2021-02-16 18:39:33 +08:00
    Ptu2sha
        1
    Ptu2sha  
       2021-02-15 20:25:07 +08:00
    你是没用过 proxy ? foward_ip 啊转发带过来
    Lax
        2
    Lax  
       2021-02-15 20:28:11 +08:00
    Google 关键词:nginx proxy_add_x_forwarded_for
    wunonglin
        3
    wunonglin  
       2021-02-15 20:28:44 +08:00
    又是你哈哈哈哈哈哈。

    你 nginx 配置了 proxy_pass_request_body on;和 proxy_pass_request_headers on;没
    wunonglin
        4
    wunonglin  
       2021-02-15 20:30:47 +08:00
    还有个$proxy_add_x_forwarded_for;和$remote_addr;着两个变量可以给你用。
    还有要配 proxy_set_header X_Forward_For $proxy_add_x_forwarded_for;这个,应该就能拿到了
    LeeReamond
        5
    LeeReamond  
    OP
       2021-02-15 20:34:49 +08:00
    @Ptu2sha 感谢,搜索了一下解决了
    LeeReamond
        6
    LeeReamond  
    OP
       2021-02-15 20:39:03 +08:00
    @wunonglin 大佬住在 v 站么,每次发帖你都能看到。不过我联想到一个问题,看这个 nginx 推 IP 的方式,似乎就是在 http headers 里面加一些信息而已。想起来之前看到 web 后端一般识别路由等都需要依赖 headers 里面的 host 来进行判断,所以有恶意修改 host 的攻击方式。

    我在 fastapi 官网的中间件部分看到这个,它有一个限制可信 host 的中间件专门防止这种攻击。但是我用他这个的话,我的 vue 前端没法控制所有请求的 host 啊,比如 vue 请求 html 的时候会加上 host,请求 js 文件之类的时候,请求会直接进入后端,不跟前端发生关系,没法自定义 host,chrome 默认就加载不出来┓( ´∀` )┏
    wunonglin
        7
    wunonglin  
       2021-02-15 20:50:24 +08:00
    fastapi 没接触过,这个是 python 的东西吧?

    前端的话是因为页面发出 xhr 请求的时候是不能修改请求头的 host 的,但是你为啥有会要用页面控制 host 的需求?
    wunonglin
        8
    wunonglin  
       2021-02-15 20:58:43 +08:00
    @LeeReamond #6 而且,后端识别路由是不由 path 来决定的么
    LeeReamond
        9
    LeeReamond  
    OP
       2021-02-15 22:51:54 +08:00
    @wunonglin 毕竟我 web engine 不是我自己实现的,我也不清楚里面实现细节,不清楚他的解析实现是否有风险,其实我也是第一次听说恶意修改 headers 里面的 host 还能用来攻击。我后来试了一下,也是用那个 nginx 推 headers 的办法可以解决,nginx 可以自动给没有预设 host 参数的请求自动补上,然后由业务端中间件校验一下合法性,似乎可以防御这种攻击。
    wunonglin
        10
    wunonglin  
       2021-02-16 01:55:36 +08:00
    @LeeReamond #9 这种我也没碰到过,我是用 nginx 做反代的,server_name 那里就已经根据请求 url 的 host 来分配 vhost 了,如果是自己写的 web 服务器的话估计需要注意下这个问题
    julyclyde
        11
    julyclyde  
       2021-02-16 13:05:15 +08:00
    @LeeReamond 你以为按 host 识别,说明你的知识领域还仅仅在于开发这方面,而不了解 http 标准
    LeeReamond
        12
    LeeReamond  
    OP
       2021-02-16 17:27:37 +08:00
    @julyclyde 确实不是很了解,大佬了解大佬讲讲标准规范是啥样的。不过 http 协议,想了解也没个集中说明的地方吧,总不可能把标准书背下来,一般都是用到哪里查哪里记哪里,不用的就忽略了
    julyclyde
        13
    julyclyde  
       2021-02-16 18:39:33 +08:00
    @LeeReamond 觉得协议标准没有个集中说明的地方,说明你学习方法有问题啊。http 标准 RFC2616

    web 服务器要先看 host header 然后才能区分虚拟主机。在配置正确的情况下,nginx 不会把“不区分 host 所有的请求”都发给你的应用程序,你的应用程序收到的只有按照 host header 筛选过的部分请求
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2886 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 08:07 · PVG 16:07 · LAX 00:07 · JFK 03:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.