首頁  >  問答  >  主體

tornado 透過 nginx 反向代理部署後的日誌顯示問題

當我們使用下面的 nginx 設定部署 tornado 應用程式後

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;
    }

在tornado.log 中請求ip全部都會顯示成127.0.0.1 ,類似下面這樣
[I 130125 21:44:54 web:1447] 200 GET / (127.0.0.1) 16.00ms

如何在 nginx 反向代理的情況下讓 tornado.log 中的ip位址也能顯示成真實的ip呢?

正確答案:除了 nginx 配置正確, 更重要的是需要在 tornado httpserver 中設定 xheaders=True
tornado.httpserver.HTTPServer(Application(), xheaders=True)

PHPzPHPz2737 天前874

全部回覆(2)我來回復

  • 大家讲道理

    大家讲道理2017-05-16 17:31:30

    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;
    }

    回覆
    0
  • 滿天的星座

    滿天的星座2017-05-16 17:31:30

    如果是反向代理的話可以在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;

    回覆
    0
  • 取消回覆