目录

一、背景

二、问题

三、解决方案


一、背景

最近对贫僧的个人页https://stackoperator.top进行升级,将Apache升级到2.4.46,PHP升级到7.4.15。升级后没啥问题,但是第二天却宕机了。经过查证是内存不足,导致mysql服务宕机了。那么是谁占用了这么多内存呢?

利用free、top等工具发现在页面刷新时,httpd进程的内存消耗会增加,而且是每点击、刷新一次页面就增加10+M的内存。如此严重的内存泄漏必须修理!!!谨以此文记录一下不太严谨的处理方式。

二、问题

因为是升级apache修改过httpd.conf文件,怀疑是apache配置改坏了。那么httpd.conf恢复到原始状态,再逐条修改配置,测试会不会消耗内存。最终确定是因为有一条配置,是要有最后一条,那么就会出现上面说的问题。

LoadModule php7_module lib64/httpd/modules/libphp7.so

已经周折(失败的解决方案),最终找到了Apache的FAQ页面 https://cwiki.apache.org/confluence/display/HTTPD/PHP-FPM,这个点进去看看全文基本就明白了。

问题是这样的——这个版本的apache httpd (2.4.x)引入了两个值得注意的特性:一个新的专门为fastCGI (mod_proxy_fcgi)设计的代理模块,以及使用MPM作为默认的apache进程管理器。与之前版本的worker MPM一样,当mod_php与非线程安全的第三方PHP扩展一起使用时,这个MPM的线程模型会导致问题。自apache 2.2发布以来,这一直是mod_php用户的祸根,实际上迫使他们拼凑fastcgi解决方案,或者使用更慢、内存消耗更大的prefork MPM。

This release of apache httpd has introduced two noteworthy features: a new proxy module specifically for fastCGI (mod_proxy_fcgi), and the move to the event MPM as the default apache process manager.

As with the worker MPM of the previous version, the threaded model of this MPM causes issues when mod_php is used with non-thread-safe third-party PHP extensions.

This has been a bane of mod_php users ever since apache 2.2 was released, practically forcing them to cobble together fastcgi solutions, or use the much slower and memory-hungry prefork MPM.

大概的意思是,在apache2.4.x版本不要直接LoadModule php7_module lib64/httpd/modules/libphp7.so。应该用 proxy_fcgi 和 php-fpm结合使用。

三、解决方案

对于php部分,编译的时候使用 --enable-fpm 选项,启用php-fpm服务。这个服务默认监听127.0.0.1:9000。

php-fpm

Prerequisites:

  • installing software packages
  • editing configuration files
  • controlling service daemons.

Your distribution or OS will either include it in the stock PHP package, or make it available as an add-on package; you can build it from source by adding --enable-fpm to your ./configure options.

The default pool, [www], has this configured as listen 127.0.0.1:9000: it will only respond to requests on the local loopback network interface (localhost), on TCP port 9000.

对于apache2.4.x部分,启用 proxy_moduleproxy_fcgi_module 模块。注意这个/path/to/your/documentroot要改成你自己vhost的documentroot的绝对路径。

To work the magic with the PHP fastCGI process manager, we will be using a new module, mod_proxy_fcgi, which is intended specifically for communicating with (possibly external) fastCGI servers.

Make sure you include the proxy_fcgi module in your httpd.conf so we can use its features; since this requires the base proxy module, ensure both are loaded (uncommented):

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

TCP socket (IP and port) approach

Edit the configuration for a vhost of your choice, and add the following line to it:

ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/your/documentroot/$1

DirectoryIndex /index.php index.php

然后重启apache服务,再刷新页面,内存在增长到一定程度后趋于稳定。不会再有严重的内存泄漏了。

Apache2.4.x下proxy_module、proxy_fcgi_module结合PHP-FPM解决内存不足问题相关推荐

  1. apache2.2.21下为codeigniter配置url地址重写

    2019独角兽企业重金招聘Python工程师标准>>> apache2.2.21下为codeigniter配置url地址重写 1.首先打开apache的配置文件,httpd.conf ...

  2. windows10下pip安装速度慢的解决办法

    windows10下pip安装速度慢的解决办法 pip修改源 我们这里使用的镜像源是清华大学的镜像源,使用方法有两种,第一种是临时使用: pip install -i https://pypi.tun ...

  3. linux下mysql的root密码忘记解决方

    linux下mysql的root密码忘记解决方 1.首先确认服务器出于安全的状态,也就是没有人能够任意地连接MySQL数据库. 因为在重新设置MySQL的root密码的期间,MySQL数据库完全出于没 ...

  4. Windows下Python 3.6 + VS2017 + Anaconda 解决Unable to find vcvarsall.bat问题

    Windows下Python 3.6 + VS2017 + Anaconda 解决Unable to find vcvarsall.bat问题 参考文章: (1)Windows下Python 3.6 ...

  5. spring boot 2.0 java8 下 foundError: javax/xml/bind/JAXBException 解决方法

    spring boot 2.0 java8 下 foundError: javax/xml/bind/JAXBException 解决方法 参考文章: (1)spring boot 2.0 java8 ...

  6. CENTOS下SAMBA服务不能开启的解决方法

    CENTOS下SAMBA服务不能开启的解决方法 参考文章: (1)CENTOS下SAMBA服务不能开启的解决方法 (2)https://www.cnblogs.com/leon-1125/p/7486 ...

  7. 在Linux环境下mysql的root密码忘记解决方法

    在Linux环境下mysql的root密码忘记解决方法 参考文章: (1)在Linux环境下mysql的root密码忘记解决方法 (2)https://www.cnblogs.com/hgj123/p ...

  8. MySQL下mysql.sock丢失问题的解决[ubuntu, linux, mysqld.sock]

    MySQL下mysql.sock丢失问题的解决[ubuntu, linux, mysqld.sock] 参考文章: (1)MySQL下mysql.sock丢失问题的解决[ubuntu, linux, ...

  9. map python2 python3 兼容_windows下 兼容Python2和Python3的解决方法

    windows下同时安装了python2和python3时,都可以配置环境变量,如果在命令行里输入python命令,windows会去环境变量里寻找Python的安装位置,如果先找到pytoon2的, ...

最新文章

  1. R语言ggplot2可视化抑制(部分)图例(legend)输出实战:抑制颜色图例输出、保留数据点形状图例输出
  2. java二分查找法_java算法之二分查找法的实例详解
  3. linux日志中有空格,linux中统计排序的内容含有空白行的解决办法
  4. [存储过程]中的事务(rollback)回滚
  5. python学习基础知识_python学习基本知识
  6. python调参工作都是干啥的_xgboost原理及调参方法-通俗易懂版本
  7. 根据数据库表gengxin实体类_ASP.NET开发实战——(十二)数据库之EF Migrations
  8. MVC中validateRequest=false不起作用
  9. 信息学奥赛一本通 2057:【例3.9 】星期几
  10. rabbitmq消息保证幂等的消息设计
  11. 学习编写测试桩之declspec (dllexport)篇
  12. vim使用系列之二——总结一下自己常用的VIM操作
  13. Xcode Developer Tools
  14. Linux磁盘设备文件(sda,sdb,sdc…)变化问题
  15. 1.maven下仅shiro框架对shiro的测试使用
  16. MATLAB中滤波演示
  17. iOS 录音功能实现
  18. 卡尔曼滤波理论讲解与应用(matlab和python)
  19. 搭建自己的网站(服务器羊毛篇)
  20. 中文搜索引擎2010Q2市场份额

热门文章

  1. oracle9i安装不上,终于成功安装oracle9i了(Cent OS 4.0+oracle9204)
  2. oracle导入索引b报错,impdp导入索引很慢
  3. TextKit及应用
  4. 通讯组基本管理任务一
  5. 2016/08/27 What I Learned About Going Fast at eBay and Google
  6. System.Web.Caching.Cache类 缓存 各种缓存依赖
  7. Kotlin语法(基础)
  8. 16条很有用的Chrome浏览器命令
  9. linux中的一些命令的想法
  10. 对卫星网络及内容的安全防护措施