我正在寻找一种解决方案来自动化我们应用程序的部署过程之一。在部署开始时,我想以编程方式将指定的服务器设置为维护模式,最后在部署完成后,从 nginx 服务器中删除维护模式标志。
通过维护模式,我的意思是 nginx 应该以 HTTP 响应代码 503 响应所有请求(可能带有自定义页面)。
我知道如何设置服务器块以响应 503 代码(请参阅http://www.cyberciti.biz/faq/custom-nginx-maintenance-page-with-http503/)但问题是如何以编程方式执行此操作并且最有效。
我想到了两个选择:
选项1:在部署过程开始时,将维护文件写入文档根目录,并有条件地检查nginx服务器配置中是否存在维护文件:
server {
if (-f $document_root/in_maintenance_mode) {
return 503;
}
}
Run Code Online (Sandbox Code Playgroud)
此方法包含一定的开销,因为每个请求都会检查文件是否存在。是否可以仅在加载 nginx 配置时检查文件是否存在?
选项 2:部署脚本用维护版本替换整个 nginx 服务器配置文件,并在部署结束时将其换回。如果使用此方法,我担心可能会覆盖维护配置文件的其他自动化进程,例如 puppet。
我正在使用supervisord 的 [program:x]来保持我的后台队列运行器正常运行。numprocs 的数量设置为静态数字,但现在我正在寻找一种解决方案,根据队列的工作负载动态调整进程计数。
是否可以(以编程方式)更改 supervisord 的 numprocs 设置的数量而不影响已经运行的工人?
我在 Linux (iptables) 路由器中有两个不同的 WAN 接口。根据协议(目标 TCP 端口),如何实现通过不同接口路由不同流量的情况?甚至有可能吗?
我正在为 logrotate 移动我所有服务器的日志轮换任务。服务器有几个 PHP-FPM 池,每个池都配置了一个单独的error_log
指令。
日志的 logrotate 配方相当简单:
/var/log/php/*.log
{
rotate 7
daily
missingok
notifempty
delaycompress
compress
dateext
sharedscripts
postrotate
# Need for signaling the php-fpm process?
endscript
}
Run Code Online (Sandbox Code Playgroud)
我是否应该向 php-fpm 池发送一些信号以捕获 error_log 文件的新句柄(在postrotate
脚本中)?如果是,是哪个信号?
我有一套用于我们的服务器的通用木偶配方。木偶管理的文件之一是/etc/crontab
包含原始cron.daily
,cron.weekly
和cron.monthly
条目。
/etc/crontab
这里的公共文件的问题是所有的 cronjobs 在我们所有的服务器中都在完全相同的时间运行。例如,每日备份消耗了我们所有的备份服务器资源,因为所有服务器都在同时提供它。
在服务器之间随机化每天/每周/每月运行的确切分钟数的首选方法是什么,同时仍然保持所有服务器之间的木偶配方通用?
我一直在考虑几种不同的选择:
sleep
与$RANDOM
实际工作之前。这样,crontab
每个主机中的时间都会相似,但运行每日/每周作业的确切时间会有所不同。即使在同一服务器内部也会有变化(例如,每天的运行间隔可能在 23-25 小时之间变化)。at
+“基于主机名的整数”分钟运行所有作业。有点hacky,但可能会工作......linux ×2
automation ×1
cron ×1
deployment ×1
iptables ×1
logrotate ×1
maintenance ×1
nginx ×1
php-fpm ×1
puppet ×1
queue ×1
routing ×1
supervisord ×1