【问题标题】:How to stop requests on PHP server while it is running cron job sheduled PHP script?如何在运行 cron 作业调度程序 PHP 脚本时停止 PHP 服务器上的请求?
【发布时间】:2021-03-09 22:18:47
【问题描述】:

我遇到了一些 DDOS 攻击导致我的 PHP 服务器宕机的情况。偶尔。

我将 AWS 与 Auto Scaling 组一起使用,所以这不是问题。

当这个服务器在 cron 作业计划的 PHP 脚本的中间出现故障时,问题就开始了。

所以我的想法是阻止 PHP 服务器上的所有路由,除了 /healthcheck...

我该怎么做?有更好的解决方案吗?

【问题讨论】:

  • php脚本运行时如何保护php服务器不宕机?
  • 作为一个选项,我建议您加载取决于 env 变量的路由,该变量在 cron 作业开始时为 true,在完成时为 false。为了确保这个变量即使在 cron 脚本失败时也是 false,我会用 try/finally 包装整个脚本。可以使用任何内存数据结构存储来代替 env 变量,例如 redis/file 甚至 APC
  • 您在查询数据库吗?如果是,那么您的查询可能有问题。检查任何慢查询。看看您是否可以在与 where 子句一起使用的列中创建索引。以上几点的结合帮助我解决了类似的问题。
  • 你有请求限制吗?您可以将 throttle:60,1 之类的东西添加到您的路由中间件中,以在 1 分钟的窗口内将客户端限制为 60 个请求。

标签: php laravel amazon-web-services cron ddos


【解决方案1】:

您是否考虑过创建辅助 Auto Scaling 组,专门用于 cron 作业?它需要像这样设置计划操作:

  1. 使用与当前 Auto Scaling 组相同的启动配置
  2. 设置第二个 Auto Scaling 组并将“计划操作”设置为在特定时间启动服务器(最小值/最大值/期望设置为 1)
  3. 使用 AWS CLI 调用更新您的 cron,以在完成后通过将新创建的扩展组上的 min/max/desired 设置为 0 来终止实例

这样实时系统和 cron 作业是分开的,不会相互影响。

【讨论】:

  • 谢谢。这听起来是个好主意。我可以使用相同的源代码库和一些配置参数告诉系统——在哪里运行 cron 脚本以及在哪里避免运行它们。最好为 cron 作业运行实例停止 ALB 上的流量...
  • 感谢您的回答,但是否有更多选择可以尝试,例如 AWS Batch、AWS Glue...?
  • 这在很大程度上取决于 from 工作在做什么。这么说,鉴于您的描述,第二个 ASG 共享相同的启动配置和 AMI 可能是最简单的。
猜你喜欢
  • 2016-10-03
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2018-05-13
相关资源
最近更新 更多