Flask+Nginx反向代理时logging打印真实IP和代理IP

Flask+Nginx反向代理时logging打印真实IP和代理IP

前言

这是最近碰到的一个问题,场景是服务器上运行了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地址获取方法

代码如下:

1
2
3
4
5
6
7

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]))
    WSGIRequestHandler.address_string = address_string

上的代码是重写代码,之后再配置日志格式即可:

1
2
3
4
5
6
7
8

def init():
    fix_werkzeug_logging()  #在此处调用
    logging.basicConfig(level=logging.INFO,
                        format='[Process %(process)d] [Thread %(thread)d] %(asctime)s %(filename)s ‘
                               ‘%(funcName)s[line:%(lineno)d] %(levelname)s %(pathname)s ‘
                               ‘[message: %(message)s] ‘,
                        datefmt=’%Y-%m-%d %H:%M:%S’,
                        filemode=’a’)

 

配置Nginx反向代理

Nginx在反向代理的时候需要将X-Forwarded-For和X-Real-Ip两个头进行传递,配置如下:

1
2
3
4
5
6

proxy_pass http://127.0.0.1:8082/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
#proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-For $http_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;

 

效果

 

1

[message: [192.168.0.1]-[192.168.2.2] – – [15/Feb/2020 15:53:21] “GET / HTTP/1.1” 404 -]

© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容