Python 3.x python3aiohttp服务器可以';在nginx背后无法获得真正的ip

Python 3.x python3aiohttp服务器可以';在nginx背后无法获得真正的ip,python-3.x,nginx,aiohttp,Python 3.x,Nginx,Aiohttp,我在nginx后面使用aiohttp()和https: 我尝试在aiohttp中间件中获取IP: peername = request.transport.get_extra_info('peername') host, port, = (peername if peername is not None else ('','')) 我期望真正的IP,但它总是返回127.0.0.1 这个问题的原因是什么?如何解决 我的nginx配置: upstream site_python {

我在nginx后面使用aiohttp()和https:

我尝试在aiohttp中间件中获取IP:

peername = request.transport.get_extra_info('peername')
host, port, = (peername if peername is not None else ('',''))
我期望真正的IP,但它总是返回127.0.0.1 这个问题的原因是什么?如何解决

我的nginx配置:

upstream site_python {
        ip_hash;
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
        server 127.0.0.1:8083;
    }



server {
    listen      11.111.11.111:80;
    server_name www.example.com example.com;
    rewrite     ^   https://$server_name$request_uri? permanent;
}



server {


    listen      11.111.11.111:443 ssl;

    ssl_certificate     /home/site/ssl/www_site_ru.crt;
    ssl_certificate_key /home/site/ssl/561457962.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         HIGH:!aNULL:!MD5;


    server_name www.example.com; 
#    rewrite     ^ http://www.example.com$request_uri permanent;



  if ($host != 'www.example.com') {
    rewrite ^/(.*)$ $scheme://www.example.com$request_uri permanent;
  }



    location / {
        proxy_pass http://site_python$request_uri;
        proxy_redirect off;
        proxy_set_header Host www.example.com;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;    

    }

}
我也试图找到它在额外的,但也没有真正的IP在它

print(request.transport._extra)

{'sockname': ('127.0.0.1', 8080), 'socket': <socket.socket fd=32, family=AddressFamily.AF_INET, type=2049, proto=6, laddr=('127.0.0.1', 8080), raddr=('127.0.0.1', 48154)>, 'peername': ('127.0.0.1', 48154)}
打印(请求.传输.\u额外)
{'sockname':('127.0.0.1',8080),'socket':,'peername':('127.0.0.1',48154)}

我认为
peername
始终是直接连接机器的IP。原始客户端的IP只能通过HTTP头访问,在这种情况下,通过
proxy\u set\u header X-Real-IP$remote\u addr在nginx配置中设置

如果要获取原始客户端IP,请尝试

host = request.remote
请参见

我用

host = request.headers.get('X-FORWARDED-FOR',None)

它不工作“'Request'对象没有属性'remote'”对不起,它是一个属性,不是一个方法。我修正了答案
request.remote
属性已添加到主分支,但尚未发布。
request.remote
是一个也使用
传输的属性。get_extra_info('peername')
最终返回
socket.getpeername()
,因此它在问题的上下文中几乎毫无用处。您需要类似于
django ipware
的东西,它能够从请求头确定正确的远程IP。