nginx 给 django-axes(访问日志中间件)一个空的 IP 地址

Esc*_*her 1 django nginx

我在访问我网站的登录页面时遇到问题。它具有django-axes访问日志记录中间件监视它的功能:

from axes.decorators import watch_login
@method_decorator(watch_login, name="dispatch")
class UserLogin(FormView): ...
Run Code Online (Sandbox Code Playgroud)

对登录页面的 GET 请求会导致:

数据错误在 /path/to/login/

inet 类型的无效输入语法:“b''”

回溯中的 IP 地址(根据错误)是b''; 所以我猜nginx 代理没有通过这个

这是我的 nginxsites-available配置的摘录(我在调试时没有启用 ssl):

upstream app_servers {
    server unix:/tmp/gunicorn.sock;
}

location / {
    proxy_pass          http://app_servers;
    proxy_redirect      off;
    real_ip_header      X-Real-IP;
    proxy_set_header    Host                    $http_host;
    proxy_set_header    User-Agent              $http_user_agent;
    proxy_set_header    X-Real-IP               $remote_addr;
    proxy_set_header    X-Forwarded-For         $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto       $scheme;
}
Run Code Online (Sandbox Code Playgroud)

我的 nginx 配置缺少什么才能django-axes正常工作?

Jam*_*mes 6

如果有人现在遇到此问题,只需更新。AXES_BEHIND_REVERSE_PROXY 已被弃用

以下设置对我有用:

AXES_META_PRECEDENCE_ORDER = [
   'HTTP_X_FORWARDED_FOR',
   'REMOTE_ADDR',
]
Run Code Online (Sandbox Code Playgroud)

文档提到AXES_PROXY_COUNT为好。但是,对于我的设置,将默认设置保留为 None 对我有用。

我的 Nginx 设置如下:

location / {
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://127.0.0.1:8000;
}
Run Code Online (Sandbox Code Playgroud)


2ps*_*2ps 5

可能是你忘记设置了AXES_BEHIND_REVERSE_PROXY。即设置为True在你的Django设置应允许的Django轴上看到HTTP_X_FORWARDED_FOR头。

  • AXES_BEHIND_REVERSE_PROXY: 如果True,它将从 处定义的标头中查找 IP 地址AXES_REVERSE_PROXY_HEADER。请确保您启用此设置以配置您的代理以设置正确的标头值,否则您可能会因在每个请求中直接设置此标头而受到攻击。默认:False

  • AXES_REVERSE_PROXY_HEADER: 如果AXES_BEHIND_REVERSE_PROXYTrue,它会从这个头中寻找 IP 地址。默认: HTTP_X_FORWARDED_FOR