我最近为用户设置了一个API来提取信息,这是一个巨大的成功。 API返回包含名称和ID等信息的信息。然后,我告诉用户他们只需从以下位置拉出图像即可获得匹配的图像:
mysite.com/pics/ID_Retrieved_From_API.jpg
这一直很好,除了今天我醒来我的网站完全失败,因为它达到了它的资源限制(共享主机)。我检查了我的日志,注意到一个特定的IP拉了数千张我的图片:
[08/Feb/2019:07:06:54 +0000] "GET /pics/76600549.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
[08/Feb/2019:07:06:54 +0000] "GET /pics/93700540.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
[08/Feb/2019:07:06:54 +0000] "GET /pics/91000583.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
[08/Feb/2019:07:06:54 +0000] "GET /pics/52300492.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
[08/Feb/2019:07:06:54 +0000] "GET /pics/87400522.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
[08/Feb/2019:07:06:54 +0000] "GET /pics/78400534.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
[08/Feb/2019:07:06:54 +0000] "GET /pics/63100533.jpg HTTP/1.1" 508 224 "-" "python-requests/2.21.0"
我暂时阻止了IP以恢复我的网站。我并没有对用户感到恼火,因为我非常鼓励这一点,但除了有人如此积极地拉动图像之外我没有。我不确定现在该怎么办。什么是允许用户提取图像的最佳方式?我正在考虑将它们全部压缩在一起,但最终结果将是一个> 5gb的文件,我认为这仍然会扼杀服务器资源。
我尝试在cloudflare中限速,但这似乎不起作用,当我解锁IP时,我的资源再次出现。我的费率限制规则是:
mysite.com/pics/*
10 requests per 1 second = Block
任何建议表示赞赏。
我当前正在运行的解决方案是注册Google Cloud Storage并在那里托管API的图像。
为了避免混淆,并且还可能避免将来发生这种情况,我将image_url
添加到我的API中,该API指向Google云端存储图像位置,因此访问API的用户可以快速获取API的正确图像URL。
最后,我在托管图像存储桶上设置了Cross-Origin Resource Sharing(CORS),以便用户可以访问图像。
这已经设置了大约5天,我的网站自那以后没有任何问题。这是一个需要成本的解决方案,但在Google云端存储上托管图像实际上是cheap。