我们运行社交/本地服务,从地理定位用户的IP获益。 问题在于,对于IPv6来说,地理位置比IPv4要快得多。
有没有一种方法来优先使用nginx在Ubuntu主机上通过IPv6传入连接? configuration看起来像这样:
server { listen 80 default_server; listen [::]:80 ipv6only=off default_server; }
IPv6 / IPv4首选项由连接的启动者(即Web浏览器)决定。 地址select规则在RFC 6724中定义。 虽然这些可以被覆盖,但只有用户重新configuration他们的操作系统。
强制别人使用IPv4的唯一方法是根本不提供IPv6。 显然,即使在中期,这也不是一个实际的解决scheme。
那么,让我们回到原来的问题:IPv6的地理位置“比IPv4更”快一点“。
这部分取决于您获取地理位置数据的位置。 例如Maxmind只给我的IPv6地址为“美国”,根本没有任何城市,而且有一组有趣的坐标 ,而Google至less能够正确识别大都市地区,但距离大约50英里。 Maxmind和Google都允许报告更正,至less对于Maxmind而言, 任何人都可以为任何IP地址执行此操作 。
我不希望这种情况持续很长时间。 随着IPv6使用的持续扩大,这种地理定位服务的用户将要求更高的IPv6地址准确性,并且最终必须交付,至less为了付费用户,以免这些用户到别处去。
同时,您应该确保您的应用程序有其他方式来定位用户。 如果他们login,你可以阅读他们现有的帐户寻找他们的位置的线索。 你可以要求用户明确select一个国家。 等等…
你可以做的另外一件事是提供你的网站的一个纯IPv4子域和一个纯IPv6子域,每个子域都要加载你的页面。 然后,您可以将它们关联到客户端并报告回服务器。 不巧合Maxmind已经在自己的网站上做这个。
这样的偏好可以使用SRVlogging来表示。 不幸的是,这些不支持HTTP。 所以你只剩下客户端在IPv4和IPv6之间进行select的情况。
许多客户端使用SYN + SYN-ACK的往返时间来决定使用哪一个。 所以,通过减缓在IPv6上发送SYN-ACK数据包,可以使大多数客户更喜欢IPv4。 但是故意拖慢你的网站是一个可怕的方法。
相反,我会退后一步,看看这个问题。 你想要更好的地理位置数据。 访问者每次访问您的网站时,您都会立即知道其中一个IP地址。 无论是IPv4还是IPv6地址取决于他们的浏览器喜欢与您的服务器进行通信。
在你的页面中,你可以利用AJAX请求来了解另一个IP地址。 对于使用IPv4的客户端,将AJAX请求发送到仅IPv6域,对于使用IPv6的客户端,将AJAX请求发送到仅IPv4域。
只要AJAX请求到达服务器,您就知道用户的IPv4和IPv6地址。 知道这个通信会让你做地理定位比你只知道其中的一个更好。
您经常会看到AJAX请求永远不会到达服务器的情况。 对于这些用户,您只能根据一个IP地址进行地理定位。 但是,只要对该AJAX请求的回复没有用于客户端的任何内容,用户甚至不会注意到这些失败的AJAX请求。 所以AJAX请求不会导致感觉到放缓或不稳定的行为。