这是【shì】最近【jìn】碰到的一【yī】个问题【tí】,场景是服务【wù】器上运【yùn】行了Flask和Nginx,使【shǐ】用【yòng】了Nginx反向代理到Flask,但是【shì】此时Flask的日志【zhì】中记【jì】载的IP全部【bù】都是127.0.0.1,不方【fāng】便进行分析,所以要自己定义打印的IP情况。
我【wǒ】需要在【zài】日志中显示真【zhēn】是【shì】的访问IP和用户的代理【lǐ】IP,也就是X-Real-Ip和【hé】X-Forwarded-For两个请求头【tóu】。
因为flask的【de】日志【zhì】是从werkzeug_internal.py模【mó】块打印出来的,所【suǒ】以要重写这里面【miàn】的一【yī】个函数。
代码如下:
1 2 3 4 5 6 7 | def fix_werkzeug_logging(): from werkzeug.serving import WSGIRequestHandler def address_string(self): # 这【zhè】就【jiù】是在nginx的【de】config中,为什么一定要有【yǒu】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在反向【xiàng】代【dài】理【lǐ】的时候需要将X-Forwarded-For和X-Real-Ip两个【gè】头进【jìn】行传递【dì】,配置如下:
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 -] |
版权所有:深圳市网商在线科技有限公司
友情链接: