使用this.connection.clientAddress没有获得正确的客户端公共IP

时间:2017-01-23 19:08:17

标签: meteor

使用this.connection.clientAddress服务器端不能在Meteor中为我提供正确的用户IP地址。据说,这是Meteor内置的用于检索用户IP服务器端的标准,但我得到的只是标准的172.xx.xxx IP,它与我的实际IP不对应。

我尝试过第三方API和几个节点模块,它们都可以正常工作。但是,this.connection.clientAddress的问题仍然存在。

// Client
Meteor.call("getIP", funciton(error, result){
console.log(result);
});

// Server
getIP: function(){
return this.connection.clientAddress;
}

这可能是由于我的开发服务器上存在nginx代理问题吗?任何修复?

1 个答案:

答案 0 :(得分:0)

您的服务器可能没有公共IP地址,这就是为什么它只为您提供内部ip 172.xx.xxx.xxx

防火墙/负载均衡器从已发布的IP地址转发数据包。确切的安排取决于谁托管服务器。

您需要将公共IP地址作为环境变量传递给Meteor,对其进行硬编码(不推荐)或将其放入数据库集合中。

更新:以下是使用保存到Mongo集合中的环境变量的解决方案:

假设您的服务器设置允许您在shell脚本或配置文件中指定环境变量。我的例子使用Nginx / Passenger。

# Tell the app where MongoDB is
passenger_env_var MONGO_URL mongodb://localhost:27017/myproject;
# Tell the app what its other settings are
passenger_env_var ROOT_URL https://dev.myproject.online;

passenger_env_var IMAGE_DIR /var/www/imgserver/public;

在服务器中,meteor方法读取环境变量并将它们插入到集合中:

// Get a list of environment vars and put them in the Environs collection
// - client code will pick these up and handle them.
  getEnvirons: function() {
    Environs.remove({});    // Force them to be re-read every server startup
    var toGet = ["ROOT_URL", "IMAGE_DIR"]; // Edit this as you please
    _.each(toGet, function(e){
      var val = process.env[e];
      Environs.insert({name: e, value: val});
    });
  },

从服务器中的Meteor启动块调用上述内容。

剩下要做的就是发布Environs系列并订阅它。 (我假设你知道该怎么做)。当然,加载环境变量数据将是异步的,因此在代码中允许这样做