多层代理或负载均衡 额外的HTTP头部信息

Koa2本身是支持代理支持的服务端框架,在阅读Koa2文档的时候,文档中使用了代理时才会使用的HTTP头部,eg:
X-Forwarded-Proto,X-Forwarded-For,X-Forwarded-Host,X-Forwarded-Server
这些HTTP头部早期并没有被添加到RFC标准中,由于被各大HTTP代理、负载均衡等转发服务广泛使用也被加入到RFC标准中。

这里一个说明来简单介绍这些HTTP头部信息

X-Forwarded-For: 10.20.156.2, 10.20.156.3
X-Forwarded-Host: www.b.com, benni82.a.com
X-Forwarded-Server: www.b.com, www.a.com
X-Forwarded-Proto: https

X-Forwarded-For的内容从左到右依次是,用户的ip,第一个代理ip
X-Forwarded-Host依次是,第一次代理时请求头的Host值,第二次代理时请求头的Host值
X-Forwarded-Server依次是:第一个代理的ServerName,第二个代理的ServerName(取自apache ServerName指令的设值)
X-Forwarded-Proto则是为了正确地识别实际用户发出的协议是 http 还是 https

Node.js+Nginx转发示例

这里我用Node.js来写一个简单的服务端来测试一下

var http = require('http');
http.createServer(function (req,res) {
res.writeHead(200,{'Content-Type':'text/plain'});
res.write('remoteAddress: ' + req.connection.remoteAddress + '\n');
res.write('x-forwarded-for: ' + req.headers['x-forwarded-for'] + '\n');
req.on('data',function (chunk) {
res.write(chunk);
});
req.on('end',function () {
res.end();
});
}).listen(11223);

执行此文件,在浏览器的地址栏输入127.0.0.1:11223来访问。
访问后得到的页面结果如下:

remoteAddress: ::1
x-forwarded-for: undefined

由于直接访问,没有通过Nginx代理转发,所以获得x-forwarded-for的值是undefined
然后设置Nginx反向代理,在/usr/local/etc/nginx/nginx.conf中输入

location / {
root html;
index index.html index.htm;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:11223/;
proxy_redirect off;
}

在没有修改Nginx的默认端口下,Nginx默认的端口是8080
那么在浏览器的地址栏中输入localhost:8080,即可以访问nginx转发的服务
访问后得到的页面结果如下:

remoteAddress: ::ffff:127.0.0.1
x-forwarded-for: 127.0.0.1

由于这里访问的地址是通过Nginx转发代理的,所以x-forwarded-for的值是127.0.0.1