我来自 .NET 背景,我对它有很多喜爱之处,但也有很多讨厌之处。总体而言,IIS 是我讨厌的东西之一。
但是,IIS 的一个非常好的功能是,您可以在服务器节点上设置“停止”。这会将所有新流量重定向到其他节点,但允许当前在线的用户在完全关闭 IIS 之前完成他们的会话。
这对于在不中断用户会话的情况下进行部署非常方便。
在我的新公司,我们不使用 .NET,但我们很喜欢它。我们在 EC2 上使用 JRuby 和 Java,使用 Apache 作为前端,使用 Tomcat 作为后端。
有没有人遇到过提供与 Tomcat、Nginx 或 Apache 类似功能的解决方案?
我搜索了一番,但没找到任何有用的东西。Axis2 怎么样?有人有这方面的经验吗?
答案1
如果您想关闭本地 Apache 站点,让当前用户完成其当前任务,请正常停止 Apache。我假设您有其他架构,可以将用户重定向到另一个可运行的网站,以允许他们继续(即负载平衡器等)。
来自 Apache 站点:
信号:WINCH apachectl -k graceful-stop
“WINCH 或优雅停止信号使父进程建议子进程在当前请求后退出(如果子进程不提供任何服务,则立即退出)。然后,父进程将删除其 PidFile 并停止监听所有端口。父进程将继续运行,并监视正在处理请求的子进程。一旦所有子进程都已完成并退出,或者已达到 GracefulShutdownTimeout 指定的超时时间,父进程也将退出。如果达到超时时间,将向任何剩余的子进程发送 TERM 信号以强制它们退出。
当处于“正常”状态时,TERM 信号将立即终止父进程和所有子进程。但是,由于 PidFile 已被删除,您将无法使用 apachectl 或 httpd 发送此信号。"
答案2
实际上,只需
apache2ctl graceful
将正常重启 apache 进程,使其加载新配置
例如,假设生产中有 www.v1,开发中有 www.v2
<VirtualHost *:80>
ServerName www.example.com
DocumentRoot /var/www/vhosts/example.com/www.v1
[...]
</VirtualHost>
<VirtualHost *:80>
ServerName dev.exemple.com
DocumentRoot /var/www/vhosts/example.com/www.v2
[...]
</VirtualHost>
现在准备好将开发投入生产了吗?编辑配置(除非你执行 apache restart/graceful,否则在线上不会有任何变化,最好观察 logrotate 何时发生,它会抛出一个“apache2ctl graceful”)。
<VirtualHost *:80>
ServerName old.example.com
DocumentRoot /var/www/vhosts/example.com/www.v1
[...]
</VirtualHost>
<VirtualHost *:80>
ServerName www.exemple.com
DocumentRoot /var/www/vhosts/example.com/www.v2
[...]
</VirtualHost>
当您觉得一切准备就绪时...祝您新版本能够在新域名上运行 ;)
apache2ctl graceful
而贤者之事应该发生:)
请注意,“apache2ctl graceful”会自动执行“apache2ctl configtest”,如果你在 apache 配置中犯了一个明显的错误,它不会崩溃