单个 Apache 实例与多个 Apache 实例

单个 Apache 实例与多个 Apache 实例

我使用 Django(Python)构建并使用 Apache/mod_wsgi 运行的 SaaS 应用程序工作。

注册站点创建 apache 虚拟主机配置、wsgi 和设置文件。最后重新启动 apache 服务器。

这意味着每次新用户注册帐户时,apache 都会重新启动,这会影响当前客户端应用程序的性能。

一个可能的选择是为新客户端创建一个单独的 apache 实例,但是这会增加所有客户端所需的 RAM。

对此您有何建议?

答案1

多个实例的副作用是它们也不能都在同一端口上运行。

也许您的脚本可以执行“apachectl configtest”来首先确保配置有效(有助于防止它因配置错误而无法启动)。

然后运行apachectl graceful。

apachectl 优雅:通过向 Apache 守护进程发送 SIGUSR1 来正常重启它。如果守护进程未运行,则启动它。这与正常重启不同,因为当前打开的连接不会中止。副作用是旧日志文件不会立即关闭。这意味着,如果在日志轮换脚本中使用,可能需要相当长的延迟以确保在处理旧日志文件之前已关闭它们。此命令会在启动重启之前通过 configtest 自动检查配置文件,以确保 Apache 不会死机。

apachectl 配置测试:运行配置文件语法测试。它会解析配置文件并报告语法正常或有关特定语法错误的详细信息。

答案2

这可能有点过头了,但我有一个巧妙的计划。:-)

设置 iptables 规则,例如:

iptables -t nat -i PREROUTING -m tcp -p tcp --dport 80 -j DNAT --to-destination :81

让 Apache 在端口 81 上运行。端口 80 的传入连接将被重定向到端口 81。

现在,当您获得新配置时,将其保存到单独的位置并让其监听端口 82。现在您可以尝试启动第二个 Apache 实例。如果启动失败,则说明配置有问题,可以继续使用旧配置运行,直到问题解决。

如果确实启动了,请将上面的 iptables 规则替换为指向端口 82 的规则。现有连接将继续转到旧端口,直到完成为止。在关闭旧实例之前,请给它们一些宽限期。这样,您就可以启动一个全新的实例并关闭旧实例,但不会中断用户。然后,您可以对下一个返回端口 81 的配置执行相同操作。

apachectl graceful 可能是您想要的,但如果它不适合您,这可能是另一种选择。

答案3

您会发现,Apache/mod_wsgi 的版本与 Django 的版本锁定在一起。因此,如果您有带 mod_wsgi2 的 Python 2 代码,那么如果您还有 Python 3 代码,则必须有一个带 mod_wsgi3 的单独 httpd 实例。

我不知道匹配度要达到多高,但我认为有人告诉我,当我们完成从 2 到 3 的迁移,然后是 3.next 时,很快就会有另一个 Apache 实例。除此之外,同一台机器上还存在其他中间件的模块冲突,而该机器目前有三个 httpd 实例。

希望你的网站是冗余的,你可以一次重启一端。你应该使用反向代理在网站之间进行多路复用,也许使用 httpd 之类的 mod_cluster。

那么 mod_wsgi 内部的进程空间又如何呢?如果两个客户端由同一个 httpd 实例管理,它们是否能以安全的方式相互隔离?

如果可以选择的话,我可能会选择 FastCGI 部署....我认为 Django 可以做到这一点(使用 gunicorn?),但是我们已经有一段时间没有研究了,而且我不是那个研究的人。

希望有所帮助。

相关内容