Apache + mod_wsgi httpd.conf 的 django 设置是否影响 mysql?

Apache + mod_wsgi httpd.conf 的 django 设置是否影响 mysql?

我有一个使用 Apache 和 mod_wsgi 的 django 网站。在过去的 4-5 天内,我的管理员电子邮件中不断出现此类错误。

OperationalError: (1040, 'Too many connections')

我已经安装了 django-debug-toolbar,平均每个页面有 100-150 个查询,响应时间不到 300 毫秒。我不认为我的 MySql 服务器超载了。另一方面,在我尝试重新配置设置后不久,这种情况发生了httpd.conf

我的网站每天的点击量达到 800-1000 次。

这些是我的httpd.conf设置

KeepAlive Off
Listen 13646
MaxSpareThreads 15
MinSpareThreads 8
MaxClients 20
ServerLimit 20
SetEnvIf X-Forwarded-SSL on HTTPS=1
ThreadsPerChild 5
MaxRequestsPerChild 1000000
StartServers 20
WSGIDaemonProcess <project> processes=7 threads=12 python-path=<path>
WSGIProcessGroup <project>
WSGIRestrictEmbedded off
WSGILazyInitialization On

如能提供任何帮助,我们将非常感激。

附言:我使用的是共享主机方案。我的主机方案有 512MB RAM,其中 300MB 是免费的。

答案1

关于您的配置的一些评论。

  1. MaxSpareThreads 和 MinSpareThreads 应该确实是 ThreadsPerChild 的倍数。如果不是,使用某些值组合,Apache 会在以下两种情况之间循环:创建新进程(因为它认为需要这些进程);然后决定在下一刻再次终止这些进程(因为它随后改变主意并认为这些进程是多余的)。因此,将 MinSpareThreads 更改为 5。

  2. MaxClients 表示所有 Apache 子工作进程最多可以同时处理 20 个请求。但是,它们代理的 mod_wsgi 守护进程有能力处理 7*12=84 个请求。因此,您在守护进程/线程上分配过多,因为 Apache 子工作进程永远无法同时处理超过 20 个请求。更好的配置(使用较少内存的配置)是 processes=4 和threads=5。

  3. 如果您实际使用的是 worker MPM,则将 StartServers 设置为 20 太高了。从技术上讲,对于 worker MPM,StartServers 不能超过 MaxClients/ThreadsPerChild。因此,将 StartServers 设置为 2。

  4. MaxRequestsPerChild 的设置任意高,考虑到您的请求吞吐率,您不妨将其设置为正常默认值 0,这意味着保留进程而不是在达到最大请求数时回收它们。由于 Python Web 应用程序在 mod_wsgi 守护进程模式下运行,因此无论如何都不需要回收 Apache 子工作进程。

无论如何,这不太可能改变您原来的问题,但会创建更优化的配置。

相关内容