摘要
本文将介绍如何在Nginx反向代理Flask时,在Flask打印用户的真实IP和代理IP日志,通过配置X-Forwarded-For和X-Real-Ip两个请求头的传递和重写Flask中werkzeug.serving.WSGIRequestHandler.address_string函数进行自定义日志显示。
0x01 前言
这是最近碰到的一个问题,场景是服务器上运行了Flask和Nginx,使用了Nginx反向代理到Flask,但是此时Flask的日志中记载的IP全部都是127.0.0.1,不方便进行分析,所以要自己定义打印的IP情况。
我需要在日志中显示真是的访问IP和用户的代理IP,也就是X-Real-Ip和X-Forwarded-For两个请求头。
因为flask的日志是从werkzeug\_internal.py模块打印出来的,所以要重写这里面的一个函数。
0x2 重写日志的IP地址获取方法
代码如下:
Python
def fix_werkzeug_logging():
from werkzeug.serving import WSGIRequestHandler
def address_string(self):
# 这就是在nginx的config中,为什么一定要有X-Real-IP啦
return "[%s]-[%s]" % (self.headers.get('X-Forwarded-For', self.client_address[0]), self.headers.get('X-Real-Ip', self.client_address[0]))<