V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abelyao
V2EX  ›  DevOps

每天约 14 万次访问量,只返回访问者的 IP 地址,应该如何部署更节省成本?

  •  2
     
  •   abelyao · 2016-05-03 23:11:30 +08:00 · 16806 次点击
    这是一个创建于 3158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有这样一个需求,每台机器每 30 秒通过访问一个特定的页面,来获取外网 IP 地址,大概会有 50 台机器运行;

    返回的内容大概就是 {'ip':'123.123.123.123'} 而已,因为需要服务端来判断来访者 IP ,所以没办法直接部署到 CDN 或者做缓存(这个 IP 必须得是实时的,如果来访者 IP 换了也得给出新的结果);

    目前考虑的是部署一个 node.js 来跑(据说高并发很好?),每天 14 万次请求,除了购买一个 VPS 还有什么更好的办法吗?

    PS. 考虑过通过网卡来获取 IP ,但机器都在路由器后面,网卡信息是没有外网 IP 地址的;
    PPS. 也考虑过直接抓网络上其它 IP 查询网站的结果,但这些网站有时会触发保护系统,返回了错误的结果;

    112 条回复    2016-05-05 10:33:45 +08:00
    1  2  
    dapang1221
        1
    dapang1221  
       2016-05-03 23:18:29 +08:00
    我感觉直接用 python 都行。。最高 50qps ,而且也没有啥计算和 io 的占用,根本没啥压力。。
    abelyao
        2
    abelyao  
    OP
       2016-05-03 23:19:52 +08:00
    @dapang1221 啥语言都行… 但只要用到了服务端,就得有个部署… 对不对……
    JiShuTui
        3
    JiShuTui  
       2016-05-03 23:21:00 +08:00 via Android
    14 万的请求不多,随便什么语言随便写都行吧
    just1
        4
    just1  
       2016-05-03 23:21:28 +08:00 via Android   ❤️ 1
    随便什么样配置的都可以做到啊。
    daocloud 自己做个 docker ,用免费额度。
    灵雀云也可以,有免费额度
    或者好雨云 php 或者其他语言部署一下
    JiShuTui
        5
    JiShuTui  
       2016-05-03 23:22:08 +08:00 via Android
    就用最好部署的 php 吧,一个.php 文件,两行代码搞定
    dapang1221
        6
    dapang1221  
       2016-05-03 23:23:17 +08:00
    @abelyao php 的话直接买个虚拟主机就行。。你查查万网还有没有免费两年的虚拟主机,反正之前有,不知道现在如何了,这个也是够用的……
    kingwkb
        7
    kingwkb  
       2016-05-03 23:23:33 +08:00 via iPhone   ❤️ 1
    我们直接使用 nginx 的 echo
    scys
        8
    scys  
       2016-05-03 23:32:13 +08:00   ❤️ 3
    丢个 Go 写的 IP 获取 API -_- Cloudflare 作为前端,你那个访问量不会有任何压力。
    https://only-pass.com/api/ipgeo 直接访问,返回 json -_- 用的是 geoip2 的免费解释地理位置用。

    现在延时全国估计在 300ms 内
    scys
        9
    scys  
       2016-05-03 23:34:10 +08:00   ❤️ 2
    manhere
        10
    manhere  
       2016-05-03 23:44:07 +08:00 via iPhone
    这就是个简单的 ddns 啊, 14 万请求随便搞个 vps 就可以了
    abelyao
        11
    abelyao  
    OP
       2016-05-03 23:55:28 +08:00
    @just1 @dapang1221 每分钟 100 次的访问量确实不大,就怕类似阿里云的那种免费主机,检测到这样的访问量以为是被 DDOS 了,直接拉黑洞里去……

    @JiShuTui 关键不在用什么语言写… 是怎么部署这个写完的代码…

    @scys 我靠!难道这个就是在寻找的方案!话说 CF 不会缓存结果吗?
    just1
        12
    just1  
       2016-05-03 23:57:25 +08:00 via Android
    直接找个 ip 的 api
    比如 ipinfo.io
    abelyao
        13
    abelyao  
    OP
       2016-05-03 23:58:17 +08:00
    @scys 请教一下具体实现的方式?如果 CF 做个前端,但还是要到后端拿 IP ,那并不能缓解后端服务器的压力啊… 能不能说一下具体思路,谢谢!!
    abelyao
        14
    abelyao  
    OP
       2016-05-04 00:03:01 +08:00
    @just1 免费的每天 1000 次请求,每天 10000 次请求是 50 刀 /月,这价格随便哪个自己搭建的方案都比这个成本低…
    LGA1150
        15
    LGA1150  
       2016-05-04 00:10:08 +08:00 via Android   ❤️ 1
    scys
        16
    scys  
       2016-05-04 00:17:26 +08:00
    @abelyao 按照你的要求,其实没有什么压力。大家都说了,没有负载不起来的语言。
    前端用 CF 只是考虑以后用备案域名,上百度云减速,做全球 CDN 罢了。
    CDN 你可以设置为默认缓存时间,而且 CF 的缓存算法不算烂,所以不担心这个问题。
    abelyao
        17
    abelyao  
    OP
       2016-05-04 00:19:18 +08:00
    @LGA1150 卧槽… 这 api 是 google 的?
    LGA1150
        18
    LGA1150  
       2016-05-04 00:20:59 +08:00 via Android
    @abelyao 是,不过部分地区的二级运营商可能因流量穿透导致 IP 不符
    dapang1221
        19
    dapang1221  
       2016-05-04 00:21:32 +08:00
    @abelyao 才这么点访问量不至于被当做 ddos 的……
    kofip
        20
    kofip  
       2016-05-04 00:22:57 +08:00   ❤️ 3
    abelyao
        21
    abelyao  
    OP
       2016-05-04 00:24:13 +08:00
    @kofip 我去你们偷偷藏了这么多 API ……
    kofip
        22
    kofip  
       2016-05-04 00:26:21 +08:00
    @abelyao 我放弃这个了,某些地区,打开很卡。
    YUX
        23
    YUX  
       2016-05-04 00:28:27 +08:00
    我一般用这个
    https://wtfismyip.com/text
    kofip
        24
    kofip  
       2016-05-04 00:28:51 +08:00
    @YUX 这个速度好慢。
    abelyao
        25
    abelyao  
    OP
       2016-05-04 00:40:45 +08:00
    @kofip 看到这篇 2010 年的博客,是当时作者搞的这个 sohu 的接口,能存活到现在说明确实是可长期提供的,不过看了一下底下的评论,有人反应 IP 的结果不准确…
    kofip
        26
    kofip  
       2016-05-04 00:52:17 +08:00
    @abelyao 确实可以长期使用,至于结果不准确,这个是运营商的问题。某些地区访问 200 以上 MS 。
    crab
        27
    crab  
       2016-05-04 00:54:30 +08:00
    c3538378
        28
    c3538378  
       2016-05-04 01:12:30 +08:00   ❤️ 10
    唉,楼主就取个 IP ,并不需要 ip2location ,多大点事:

    ```
    location = /ip {
    add_header Content-Type application/json;
    return 200 "{\"ip\":\"$remote_addr\"}";
    }
    ```
    limengwei
        29
    limengwei  
       2016-05-04 01:16:54 +08:00 via Android
    golang
    DravenJohnson
        30
    DravenJohnson  
       2016-05-04 02:55:34 +08:00   ❤️ 1
    SoloCompany
        31
    SoloCompany  
       2016-05-04 03:26:34 +08:00   ❤️ 1
    自有服务器的话 28 楼是正解
    考虑 SaaS / PaaS 的话首选 python 吧,毕竟最多平台支持,比如 SAE / GAE 这些
    kofip
        32
    kofip  
       2016-05-04 03:33:26 +08:00   ❤️ 1
    @c3538378 关键是各地访问的速度与稳定性。
    kofip
        33
    kofip  
       2016-05-04 03:41:54 +08:00   ❤️ 1
    我还幻想过,通过 DNS 服务器查询源 IP 。
    可惜并没有这种功能!
    msg7086
        34
    msg7086  
       2016-05-04 05:42:00 +08:00
    就像 28 楼那样 nginx 写个配置文件就行了,还部署……?
    shiji
        35
    shiji  
       2016-05-04 06:37:50 +08:00 via Android   ❤️ 1
    另外关掉 keepalive ,客户端收到回复之后也尽量直接关闭连接。
    Bryan0Z
        36
    Bryan0Z  
       2016-05-04 07:00:11 +08:00 via Android
    其实获取 ip 这事根本不用服务器,直接 traceroute 到自己 ip , 5 跳之内一般都有结果,第一个返回的外网 ip ,就是客户机公网 ip …当然想要 NAT 穿透就有点难了
    kofip
        37
    kofip  
       2016-05-04 07:05:00 +08:00
    @Bryan0Z 实验中!
    kofip
        38
    kofip  
       2016-05-04 07:07:29 +08:00
    @Bryan0Z 实验失败,你说的不成立。
    Anteiku
        39
    Anteiku  
       2016-05-04 07:37:18 +08:00 via Android
    c3538378
        40
    c3538378  
       2016-05-04 07:45:58 +08:00
    取个 IP 就也能有这么多幻想!楼主醒醒,杀鸡何必用牛刀?
    Bryan0Z
        41
    Bryan0Z  
       2016-05-04 07:53:57 +08:00 via Android
    @kofip 没有公网 ip 的宽带, ip 会不一样到处,另外
    tracert baidu.com
    我这里一直没什么问题呀
    kofip
        42
    kofip  
       2016-05-04 08:14:26 +08:00
    @Bryan0Z 我通过路由器上网的,路由跟踪 获取不到 自己公网 IP 。
    kofip
        43
    kofip  
       2016-05-04 08:16:18 +08:00
    @c3538378 很多服务都是通过 TCP 中转到后端服务器的,获取不到客户 IP ,只能拿到中转服务器的 IP 。
    kofip
        44
    kofip  
       2016-05-04 08:17:39 +08:00
    @c3538378 我的做法是,直接让客户端获取到自己的公网 IP ,当作参数传过来。
    clino
        45
    clino  
       2016-05-04 08:19:33 +08:00
    28 楼应该是最快并发量最大的
    kofip
        46
    kofip  
       2016-05-04 08:27:43 +08:00
    怎么就没有一个基础服务提供查询公网 IP 的呢?
    abelyao
        47
    abelyao  
    OP
       2016-05-04 08:35:24 +08:00 via iPhone
    @c3538378
    @clino
    @msg7086

    28 楼提到的 nginx 方案在 7 楼就有人提了, 9 楼就给出实例了。而 nginx 也需要跑一个才有,不管是 vps 还是 docker 。在现有方案中找到更降低成本,更提高稳定性的,怎么就变成幻想了?
    msg7086
        48
    msg7086  
       2016-05-04 08:53:48 +08:00
    @abelyao 没看懂你想表达什么观点。
    kofip
        49
    kofip  
       2016-05-04 09:02:50 +08:00
    @msg7086 服务器要钱的!
    msg7086
        50
    msg7086  
       2016-05-04 09:06:47 +08:00
    @kofip 这么一丁点钱都不肯出的话真的就别做项目了。
    我是很认真的说的,不是开玩笑。
    kofip
        51
    kofip  
       2016-05-04 09:08:48 +08:00
    telnet smtp.gmail.com 25

    220 smtp.gmail.com ESMTP qb1sm978569pac.44 - gsmtp

    EHLO smtp.gmail.com

    250-smtp.gmail.com at your service, [61.49.62.100]
    250-SIZE 35882577
    250-8BITMIME
    250-STARTTLS
    250-ENHANCEDSTATUSCODES
    250-PIPELINING
    250-CHUNKING
    250 SMTPUTF8

    quit

    221 2.0.0 closing connection qb1sm978569pac.44 - gsmtp

    我通过 这种方式 获取公网 IP 是不是有点怪异!
    kofip
        52
    kofip  
       2016-05-04 09:12:41 +08:00   ❤️ 1
    @msg7086 能省则省,想要各地响应都快速,还真不是小钱能搞定。

    上面那个 Gmail 方式完全是搞笑的,不会真那么干,没梯子根本访问不了。
    Livid
        53
    Livid  
    MOD
       2016-05-04 09:14:34 +08:00   ❤️ 3
    如果只是为了获得外网 IP 的话,用别人的服务吧:

    http://httpbin.org/ip

    https://httpbin.org/ip
    jedyu
        54
    jedyu  
       2016-05-04 09:14:57 +08:00
    nginx 不是一行配置的事吗?维护代理池?
    msg7086
        55
    msg7086  
       2016-05-04 09:19:18 +08:00   ❤️ 2
    @kofip 我随便举个例子。
    IDCF 最低配置我现在开的是 200 日元一个月,折合软妹 13 只,大概是一顿饭钱。
    Ping 可以保持在 100 内。
    内存给了 1G ,硬盘配了 5G ,这已经远远超过跑这套系统的硬件需求了。
    拿我 Linode 1G 配置的机子来算好了,上面用 Nginx+Lua 跑了一个 BT Tracker ,每 10 分钟就有 14 万请求, CPU 占用 30%不到, Nginx 进程内存吃了 15M 。想来这配置拿来直接返回一个 IP 的话一天跑几亿请求应该是轻而易举了吧。

    一个月 13 软妹币……真的有那么负担不起吗……
    yepinf
        56
    yepinf  
       2016-05-04 09:21:20 +08:00   ❤️ 1
    GTim
        57
    GTim  
       2016-05-04 09:21:52 +08:00
    @jedyu 支持 nginx + echo 扩展 一台就足以应付
    abelyao
        58
    abelyao  
    OP
       2016-05-04 09:23:49 +08:00
    @Livid 是的,只是为了获取外网 IP 地址,如果现有服务能稳定(其实我觉得应该比自己部署稳定)而且能被持续查询(每 30 秒查询一次)那当然是更好,自己也省事。
    kofip
        59
    kofip  
       2016-05-04 09:25:46 +08:00
    @Livid PING 345ms
    abelyao
        60
    abelyao  
    OP
       2016-05-04 09:29:25 +08:00
    @msg7086 @kofip

    谢谢两位朋友,都是热心的帮忙出办法。 @msg7086 说的对,随便一个最低配置的 VPS 确实已经能满足要求,价格也完全可以接受。但同时也像 @kofip 说的,需要考虑各地的访问情况和在线率的保障。

    这也是发帖的原因,如果只是随便找个 VPS 甚至虚拟主机,返回一个 IP 地址,那我都不好意思发帖问,只是想在这个层面上,再寻找一种更可靠稳定的方案,比如楼上有人提到的,加层 CF 做前端之类的。

    还是要感谢两位朋友帮忙出谋划策!
    raptor
        61
    raptor  
       2016-05-04 09:29:27 +08:00
    买个 VPS 有那么难吗?现在便宜的 VPS 十几美元一年足够满足你要求了,前两年还有几美元一年的。
    abelyao
        62
    abelyao  
    OP
       2016-05-04 09:30:25 +08:00
    @raptor 看我在 60 楼的回帖吧
    zhicheng
        63
    zhicheng  
       2016-05-04 09:31:42 +08:00 via Android
    ipcountry.org 就是放在 CF 后边的。
    kofip
        64
    kofip  
       2016-05-04 09:36:03 +08:00
    @zhicheng Ping 200ms
    kofip
        65
    kofip  
       2016-05-04 09:37:21 +08:00
    @abelyao 我看还是用 IP138 的吧,用正则提取。是否有限制,测试下就知道了。
    Moker
        66
    Moker  
       2016-05-04 09:37:24 +08:00
    @msg7086 哈哈我也觉得是...其实只要 5 刀一个月就好了 直接上 512 的
    zhicheng
        67
    zhicheng  
       2016-05-04 09:43:22 +08:00 via Android
    @kofip So?
    kofip
        68
    kofip  
       2016-05-04 09:49:45 +08:00
    @zhicheng ipcountry.org 我这里 PING 200MS
    c3538378
        69
    c3538378  
       2016-05-04 09:50:38 +08:00
    我已经彻底服了, 50 个客户端、 30 秒才访问一次、就取个 IP 而已 -> 其实是 1.4 万次访问,不是楼主说的 14 万哦

    你这是要有多稳定啊?

    我觉得你这是不是得在全国每个省都至少部署一台服务器呢( CF 在海外呢)?是不是还得要上 BGP 机房呢?怎么着还得要加个 Load Balancer 吧( CF 可没有这个功能)?
    msg7086
        70
    msg7086  
       2016-05-04 09:55:04 +08:00
    @c3538378 50×2880 你怎么算出 1.4 万的。
    kofip
        71
    kofip  
       2016-05-04 09:56:42 +08:00   ❤️ 1
    @abelyao @c3538378 最好是这样,所以不能自己弄服务器。

    我刚找到了一个 API ,符合你的形容。

    http://whois.pconline.com.cn/ipJson.jsp
    c3538378
        72
    c3538378  
       2016-05-04 09:57:58 +08:00
    @msg7086 呃,是我 SB 了... 😫
    abelyao
        73
    abelyao  
    OP
       2016-05-04 10:16:57 +08:00
    @kofip 这个是到目前位置打开速度最快的… 真的是秒开了…
    kofip
        74
    kofip  
       2016-05-04 10:18:10 +08:00
    @abelyao 我本地 PING 10ms 左右,测速网站 全国平均 30ms 。 符合 @c3538378 的形容!
    sampeng
        75
    sampeng  
       2016-05-04 11:15:46 +08:00
    每天 14w 请求。。什么语言都没问题。。。随便搞了。。
    hicdn
        76
    hicdn  
       2016-05-04 11:18:53 +08:00
    ppwangs
        77
    ppwangs  
       2016-05-04 11:32:02 +08:00
    根本不用架服务,静态文件就可以搞定。
    找 jsonp 的接口,分分钟搞定
    ericyl
        78
    ericyl  
       2016-05-04 12:52:00 +08:00   ❤️ 1
    aeshfawre
        79
    aeshfawre  
       2016-05-04 12:59:24 +08:00
    板瓦工 10 美元一年,20w 每日毫无压力,python 版,这是实盘运行着的.
    换成 go 版本,估计 200w 每日无压力.
    这个获取外网 IP 的功能,以前用的 ip138 的,腾讯的,阿里的,查询多了被屏蔽,实际上自己搭一个简直不要太简单.
    GPU
        80
    GPU  
       2016-05-04 14:27:53 +08:00
    @msg7086 nginx 还可以弄 BT Tracker ? 有相关吗?
    ZiShuo
        81
    ZiShuo  
       2016-05-04 15:13:07 +08:00
    http://ip.zishuo.net/ 不谢!我自己的 IP 地址库。
    9hills
        82
    9hills  
       2016-05-04 15:16:30 +08:00   ❤️ 1
    lz 你汇总下 ls 的 api ,然后选 3 个轮询即可。这样基本不会有问题。。
    scys
        83
    scys  
       2016-05-04 15:31:26 +08:00
    @ZiShuo 你那个 IP 地址好详细 ~_~ 不过..定位我那个就错了,偏离差不多 1~2 公里的文字描述
    abelyao
        84
    abelyao  
    OP
       2016-05-04 15:31:33 +08:00
    @9hills 是的,现在打算内置几个公开的 API ,每天在启动的时候做一次检测,选速度最快的那个查询
    abelyao
        85
    abelyao  
    OP
       2016-05-04 15:32:26 +08:00
    @ZiShuo 详细到可怕,但具体地址是错的… 可是这么详细的库是怎么来的呢……
    skydiver
        86
    skydiver  
       2016-05-04 16:10:36 +08:00
    每秒 14 万次飘过
    npc0der
        87
    npc0der  
       2016-05-04 16:26:31 +08:00
    @msg7086 idcf 日本手机号 注册 你怎么通过的 在日本?
    hicdn
        88
    hicdn  
       2016-05-04 16:27:09 +08:00
    @ZiShuo 详细的吓人,介意分享数据源吗?
    strwei
        89
    strwei  
       2016-05-04 16:47:28 +08:00
    golang +1
    7654
        90
    7654  
       2016-05-04 16:51:37 +08:00
    r#81 @ZiShuo 看起来像高德地图的地址?
    tsaohai
        91
    tsaohai  
       2016-05-04 17:26:47 +08:00
    @msg7086 idcf 最便宜的不是 500 日元吗 要是有 200 的得去看看了
    zhigang1992
        92
    zhigang1992  
       2016-05-04 18:14:51 +08:00
    隔壁帖就有一个 https://www.v2ex.com/t/276283

    http://121.15.207.49:3006/
    msg7086
        93
    msg7086  
       2016-05-04 20:57:23 +08:00
    @GPU 自己用 Lua 写了一个简单的。

    @npc0der 我当然是在要求日本手机号之前注册的。

    @tsaohai 不是。 500 那是内置模板配置的最低价格。如果你自己分配资源的话,硬盘可以设小一些。 200 日元其实也不是最低价,因为我硬盘分了 5G ,你分更少点的话更便宜。
    新注册还白送余额,我这边送了 6000 ,一年有效, 500 和 200 并没什么差别。
    iyaozhen
        94
    iyaozhen  
       2016-05-04 22:15:03 +08:00 via Android
    @ZiShuo 卧槽,你这是怎么搞的。也太详细了吧
    quix
        95
    quix  
       2016-05-04 22:33:22 +08:00
    写个 nginx 配置就行了。。
    KenGe
        96
    KenGe  
       2016-05-04 23:20:59 +08:00
    @ZiShuo 有 api 接口?
    AKI
        97
    AKI  
       2016-05-04 23:37:16 +08:00
    我的阿里云双核心 4G 内存 300qps 毫无压力。是一个 读取 mongodb 的服务。
    realpg
        98
    realpg  
       2016-05-05 00:47:47 +08:00
    这点 QPS ,最低配腾讯云阿里云机器轻松搞定。
    golang 写个 webserver ,静态编译,直接返回文本,单请求执行时间微秒级,最低配腾讯云阿里云这种机器轻松搞定。
    一个月成本 50 块钱左右,你说有 50 个客户端,平均一个机器一块钱一个月……
    realpg
        99
    realpg  
       2016-05-05 00:48:32 +08:00
    @msg7086
    IDCF 系统盘怎么自定义改小?他会给写死的吧。
    msg7086
        100
    msg7086  
       2016-05-05 03:28:39 +08:00
    @realpg 所以说别用内置模板。你自己装系统的话多小你都可以改。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1761 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 16:34 · PVG 00:34 · LAX 08:34 · JFK 11:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.