我们正在使用MUP进行AWS的Meteor部署。几周以前,我们很高兴我们现在可以切换到免费证书,感谢Letsencrypt和Kadira。一切都运行得非常好,直到我在日志中意识到客户端IP不再通过代理传递...无论我做什么,我都会看到127.0.0.1
作为我的客户端IP。我试图使用this.connection.clientIP
或headers包来获取方法。
嗯,在深入研究和深入了解stub和nginx的工作原理之后,我得出的结论是,这种做法从未奏效。
我提出的最佳解决方案是使用proxy_protocol作为described by Chris,但我无法让它发挥作用。
我使用了/opt/stud/stud.conf
的设置并尝试启用write-proxy
和proxy-proxy
设置。
这就是我的nginx配置:
server {
listen 80 proxy_protocol;
server_name www.example.com example.com;
set_real_ip_from 127.0.0.1;
real_ip_header proxy_protocol;
access_log /var/log/nginx/example.access.log;
error_log /var/log/nginx/example.error.log;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto http;
}
}
以下是我在生产EC2服务器上的标题:
accept:"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
accept-encoding:"gzip, deflate, sdch"
accept-language:"en-US,en;q=0.8"
cache-control:"no-cache"
connection:"upgrade"
host:"127.0.0.1:3000"
pragma:"no-cache"
upgrade-insecure-requests:"1"
x-forwarded-for:"127.0.0.1"
x-forwarded-proto:"http"
x-ip-chain:"127.0.0.1,127.0.0.1"
x-real-ip:"127.0.0.1"
那么,当天的问题。使用MUP和SSL,有没有办法获得传递客户端IP地址?
答案 0 :(得分:0)
我知道你说你曾尝试使用headers,但是你可以再试一次,看看你是否可以这样做。我有很多问题x-forwarded-for计数不保持一致,但如果我从标题链中拉出来,[0]总是客户端IP。
将此代码放在/ server文件夹中:
Meteor.methods({
getIP: function() {
var header = this.connection.httpHeaders;
var ipAddress = header['x-forwarded-for'].split(',')[0];
return ipAddress;
}
});
在浏览器控制台中:
Meteor.call('getIP', function(err, result){
if(!err){
console.log(result);
} else {
console.log(err);
}
};
了解您从该回复中获得的内容。如果可行,您可以在Template.rendered上或在需要IP时调用该方法。
否则,我非常确定您应该能够将IP设置为nginx conf中的任意标头,然后直接在req
对象中访问它。
答案 1 :(得分:0)
顺便说一句,在你包含的nginx配置中,我认为你需要使用real_ip_header X-Forwarded-For;
以便real_ip将使用该标头来定位客户端IP,你还应该设置real_ip_recursive on;
以便它会忽略您信任的set_real_ip_from
答案 2 :(得分:0)
好吧,所以在经历了一个不眠之夜并学习了关于STUD和HAProxy协议工作方式的一切之后,我得出了一个简单的结论,它根本就不受支持。
我知道我可以很容易地回到Nginx处终止SSL,但我想确保我的部署具有自动化作为MUP。
解决方案? MUPX。 MUP的下一个版本,但仍处于开发阶段。它使用Docker并直接在Nginx上进行SSL终止。
所以你有它。课? Stable
并不总是一个解决方案。 :)