windows 服务器下的 apache 出现 MemoryError (django wsgi )

用django开发的一个老项目,开发时版本是0.9 , 后期服务器迁移多次,现在django版本用的1.2,用的apache 配合 wsgi模块搭建,原来服务器是linux,目前移到了 windows server 2012 配置是 2 cpu, 8g mem

昨天客户说服务器出问题了,访问时出现 500错误,internal server error

登录到服务器,打开apache的日志,发现和以前的不一样,并没有指出程序什么地方出错,截取一段如下

[Fri Sep 22 09:38:02 2029] [error] [client xxx.xxx.xxx.xxx]     args[0] = force_unicode(args[0]), referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:02 2029] [error] [client xxx.xxx.xxx.xxx]   File "D:\\Python27\\lib\\site-packages\\django\\utils\\encoding.py", line 85, in force_unicode, referer: http://xx.xxx.xx.xx/xxxx/index/
[Fri Sep 22 09:38:02 2029] [error] [client xxx.xxx.xxx.xxx]     s = s.decode(encoding, errors), referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:02 2029] [error] [client xxx.xxx.xxx.xxx]   File "D:\\Python27\\Lib\\encodings\\utf_8.py", line 16, in decode, referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:02 2029] [error] [client xxx.xxx.xxx.xxx]     return codecs.utf_8_decode(input, errors, True), referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:02 2029] [error] [client xxx.xxx.xxx.xxx] TemplateSyntaxError: Caught MemoryError while rendering: , referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx] mod_wsgi (pid=4308): Exception occurred processing WSGI script 'D:/mytest/wsgi/mytest.wsgi'., referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx] Traceback (most recent call last):, referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx]   File "D:\\Python27\\lib\\site-packages\\django\\http\\__init__.py", line 431, in next, referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx]     chunk = chunk.encode(self._charset), referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx]   File "D:\\Python27\\lib\\site-packages\\django\\utils\\functional.py", line 55, in _curried, referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx]     return _curried_func(*(args+moreargs), **dict(kwargs, **morekwargs)), referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx]   File "D:\\Python27\\lib\\site-packages\\django\\utils\\safestring.py", line 81, in _proxy_method, referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx]     data = method(self, *args, **kwargs), referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/
[Fri Sep 22 09:38:04 2029] [error] [client xxx.xxx.xxx.xxx] MemoryError, referer: http://xx.xxx.xx.xx/xxxx/xxxx/index/

MemoryError ? 这是说内存错误?

查看任务管理器后发现内存使用近4G, 离8G的内存还远着,再看apache使用了近2G, 尝试将 apache 服务重新启动了一下,发现apache内存使用将到了 25M。而原来出现错误的页面都已经正常。

联想到新增加了视频上传功能,猜测可能是用户最近上传视频之后,导致了apache的内存泄漏。

联想到前段时间一台云服务器1cpu, 1g mem 出现的内存不足问题,先对apache进行配置调节。

五.启用MPM模块配置文件
1.MPM模块是专门针对Windows操作系统而优化设计的,在Apace安装目录下的conf下的httpd.conf文件中启用该配置文件
找到
# Server-pool management (MPM specific)

Include conf/extra/httpd-mpm.conf (去掉前面的注释符号"#")
2.在Apace安装目录下的conf下extra目录中的配置文件httpd-mpm.conf中更改MPM模块的相关配置
找到mpm_winnt_module,由于mpm_winnt模块只会创建1个子进程,因此这里对单个子进程的参数设置就相当于对整个Apache的参数设置。
<IfModule mpm_winnt_module>

ThreadsPerChild 1500

MaxRequestsPerChild 0

</IfModule>
ThreadsPerChild: 线程数量,线程数量越大,越能够更好的处理更多并发连接。默认值是150,推荐设置:小型网站=1000 中型网站=1000~2000 大型网站=2000~3500
MaxConnectionsPerChild:累计最多处理到多少个请求,超过该值会自动重启Apache,设置为0,则没有限制,但可能会照成内存泄漏。小型网站=10000 中型或大型网站=20000~100000,若设置为大于0时,最好为ThreadsPerChild的100倍

MaxConnectionsPerChild:累计最多处理到多少个请求,超过该值会自动重启Apache,设置为0,则没有限制,但可能会照成内存泄漏。小型网站=10000 中型或大型网站=20000~100000,若设置为大于0时,最好为ThreadsPerChild的100倍

考虑到内部系统,将参数调小一点,观察一下将来是否正常。
#ThreadsPerChild 150
#MaxRequestsPerChild 0

ThreadsPerChild 100
MaxRequestsPerChild 5000

参考: https://blog.csdn.net/xyy1028/article/details/89440858

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注