每天约 14 万次访问量,只返回访问者的 IP 地址,应该如何部署更节省成本? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
abelyao
V2EX    DevOps

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

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

    有这样一个需求,每台机器每 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  
    PRO
       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
    PRO
       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
    yemoluo
        57
    yemoluo  
       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 看起来像高德地图的地址?
    46Gnj0E0OBmad377
        91
    46Gnj0E0OBmad377  
       2016-05-04 17:26:47 +08:00
    @msg7086 idcf 最便宜的不是 500 日元吗 要是有 200 的得去看看了
    zhigang1992
        92
    zhigang1992  
       2016-05-04 18:14:51 +08:00
    隔壁帖就有一个 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  
    PRO
       2016-05-05 00:47:47 +08:00
    这点 QPS ,最低配腾讯云阿里云机器轻松搞定。
    golang 写个 webserver ,静态编译,直接返回文本,单请求执行时间微秒级,最低配腾讯云阿里云这种机器轻松搞定。
    一个月成本 50 块钱左右,你说有 50 个客户端,平均一个机器一块钱一个月……
    realpg
        99
    realpg  
    PRO
       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     Solana     2178 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 00:28 PVG 08:28 LAX 17:28 JFK 20:28
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86