當我們使用下面的 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)
tornado中可以透過
來獲取,不過可能有時候有些問題,請參閱github上的這個issue:https://github.com/facebook/tornado/i...
原理是讀一些HTTP頭
類似的,PHP中的實作如下:
如果是反向代理的話可以在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;