Das Problem mit der Protokollanzeige nach der Bereitstellung von Tornado über den Nginx-Reverse-Proxy
PHPz
PHPz 2017-05-16 17:29:30
0
2
882

Nachdem wir die Tornado-Anwendung mit der folgenden Nginx-Konfiguration bereitgestellt haben

upstream frontends {
        server 127.0.0.1:8000;
        server 127.0.0.1:8001;
        server 127.0.0.1:8002;
        server 127.0.0.1:8003;
    }

Alle in tornado.log angeforderten IP-Anfragen werden als 127.0.0.1 angezeigt, ähnlich wie folgt
[I 130125 21:44:54 web:1447] 200 GET / (127.0.0.1) 16.00ms

Wie kann ich dafür sorgen, dass die IP-Adresse in tornado.log als echte IP angezeigt wird, wenn der Nginx-Reverse-Proxy verwendet wird?

Richtige Antwort: Zusätzlich zur korrekten Nginx-Konfiguration muss, was noch wichtiger ist, xheaders=True im Tornado-httpserver festgelegt werden
tornado.httpserver.HTTPServer(Application(), xheaders=True)

PHPz
PHPz

学习是最好的投资!

Antworte allen(2)
大家讲道理

tornado中可以通过

self.request.remote_ip

来获取,不过可能有时候有些问题,见github上的这个issue:https://github.com/facebook/tornado/i...

原理是读一些HTTP头

类似的,PHP中的实现如下:

function _get_client_ip() {
    $clientip = '';
    if(getenv('HTTP_CLIENT_IP')
        && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $clientip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR')
        && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $clientip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR')
        && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $clientip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR'])
        && $_SERVER['REMOTE_ADDR']
        && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $clientip = $_SERVER['REMOTE_ADDR'];
    }

    preg_match("/[\d\.]{7,15}/", $clientip, $clientipmatches);
    $clientip = $clientipmatches[0] ? $clientipmatches[0] : 'unknown';
    return $clientip;
}
滿天的星座

如果是反向代理的话可以在nginx 中加入这么一个配置:
proxy_pass http://frontends;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;

Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage