当前位置: 首页 > 编程日记 > 正文

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

目录

一、背景

二、问题

三、解决方案


一、背景

最近对贫僧的个人页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_module proxy_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服务,再刷新页面,内存在增长到一定程度后趋于稳定。不会再有严重的内存泄漏了。

相关文章:

两分钟让你知道什么是“Java重载”

重载:顾名思义,就是重复负载的意思,具体到Java 就是方法名相同(重复使用),但参数列表不同。 我们通过几个Java方法来具体说明:public class Addition{public int add(int a, int b){return ab;}…

C++ static

(1)static表示静态变量。局部变量存储在栈区,在{}结束时被释放。而static修饰的变量存储在全局区,在程序结束时被释放。 (2)static修饰的变量在外部文件中无法调用,即使使用extern也无法调用。其…

TCO 2015 1A Hard.Revmatching(Hall定理)

\(Description\) 给定一个\(n\)个点的二分图,每条边有边权。求一个边权最小的边集,使得删除该边集后不存在完备匹配。\(n\leq20\)。 \(Solution\) 设点集为\(S\),与\(S\)中的点相邻的点的并集为\(N(S)\)。 由Hall定理,若存在点集\…

20169211 2016-2017-2 《移动平台开发实践》 第十周实验总结

实验一:简易计算器 实验要求 实现一个简易计算器Calc,支持 - * / 和%运算, 从命令行传入计算数据,比如:java Calc 2 3 结果为 2 3 5 java Calc 8 - 3 结果为 8 - 3 5 java Calc 2 * 3 结果为2 * 3 6 java Calc 10 / 2 结…

wordpress从apache迁移到nginx

目录 一、安装nginx 二、配置文件准备 2.1、进程运行用户 2.2、虚拟主机 2.3、重定向 三、迁移 庚子鼠年最后几天,贫僧发现了内存不足的问题,并在Apache2.4.x下proxy_module、proxy_fcgi_module结合PHP-FPM解决内存不足问题一文中阐述了解决方案。…

zabbix4.0搭建(基于CentOS6.8)

环境服务端:188.188.3.241,系统:centos6.8,mysql:5.7.3,php:5.4.9,nginx:1.12.0一、nginx编译安装NGINX_VERSION1.12.0yum -y install pcre-devel openssl-develcd /usr/…

[Ahoi2008]Meet 紧急集合

1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec Memory Limit: 162 MBhttp://www.lydsy.com/JudgeOnline/problem.php?id1787Description Input Output Sample Input 6 4 1 2 2 3 2 4 4 5 5 6 4 5 6 6 3 1 2 4 4 6 6 6 Sample Output 5 2 2 5 4 1 6 0 HINT S…

C++ 回调函数

函数指针 函数指针是一种指针&#xff0c;具体来说是&#xff1a;指向函数入口地址的指针。 #include <iostream> using namespace std; double function_t(int val) {return val; } int main() {double (*ptr)(int); // 创建一个函数指针&#xff0c;返回值为doubl…

想知道什么是“成员变量”吗?

成员变量是直接定义在“类”中的量&#xff1b; 特点&#xff1a;成员变量有默认值,具体请看表格 数据类型默认值整型0浮点型0.0char’ ’booleanfalse其他类型null 成员变量的作用就是可以详细描述对象信息 我们来举个例子&#xff1a; public class UserInfo{int age;doubl…

Linux09-网络配置

目录 一、网络配置基础 1.1、网络接口 1.2、设置主机名 二、nmcli配置网络 2.1、配置固定的IP地址等 2.2、连接wifi 三、链路聚合等 一、网络配置基础 1.1、网络接口 先来对比一下RHEL6、RHEL7关于网络接口上的一些差别。 RHEL6 RHEL7 配置文件位置 /etc/sysconfig…

VScode配置ROS环境

创建一个文件夹 使用catkin_make编译工作空间的根目录 使用VScode打开 VScode 中编译 ros 快捷键 ctrl shift B 调用编译&#xff0c;选择:catkin_make:build 可以点击配置&#xff08;右边的小齿轮&#xff09;&#xff0c;修改.vscode/tasks.json 文件 { // 有关 tasks.j…

从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...

注意&#xff0c;64位系统&#xff0c;用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统&#xff1a;使用的是64位的Windows Server 2008 解决办法&#xff1a; 这是由于该计算机上没有安装Microsoft Access数据库引擎组件&#xff0c;该组件…

天兔(Lepus)监控系统慢查询分析平台安装配置

转http://suifu.blog.51cto.com/9167728/1770672 被监控端要安装pt工具 1234[rootHE1~]## yum -y install perl-IO-Socket-SSL[rootHE1~]## yum -y install perl-DBI[rootHE1~]## yum -y install perl-DBD-MySQL[rootHE1~]## yum -y install perl-Time-HiRes[rootHE1~]# tar xv…

五分钟让你搞懂什么是“构造方法”

构造方法的形式&#xff1a;类名([参数列表]){} 特点&#xff1a;- 构造方法没有返回值&#xff0c;就算void也不能有&#xff0c;这点与Java方法(或叫函数)不一样&#xff1b;- 一个类中默认无参构造方法&#xff0c;但是当定义了一个有参构造方法时&#xff0c;则默认无参构造…

Linux10-归档、系统间复制文件

目录 一、tar命令 二、scp、sftp命令 三、rsync命令 一、tar命令 tar命令可以归档文件、目录&#xff0c;提取创建的归档文件&#xff0c;同时进行压缩解压缩。使用tar选项时不需要加-&#xff0c;下面是常用的tar选项。 c&#xff0c;创建一个存档。x&#xff0c;提取一个…

pattern

常用的正则表达式 0-9 pattern"[0-9]*" 信用卡 [0-9]{13,16} 银联卡 ^62[0-5]\d{13,16}$ Visa: ^4[0-9]{12}(?:[0-9]{3})?$ 万事达&#xff1a;^5[1-5][0-9]{14}$ QQ号码&#xff1a; [1-9][0-9]{4,14} 手机号码&#xff1a;^(13[0-9]|14[5|7]|15[0|1|2|3|5…

VScode配置CMAKE文件

创建一个vscode文件 记得一定要创建一个build文件夹&#xff0c;因为cmake编译过程中产生的中间文件会放到build文件夹中。 打开VScode 配置文件 launch.json {"version": "0.2.0","configurations": [{"name": "(gdb) Launc…

三分钟了解“Java重写”

要了解“Java重写”&#xff0c;首先要知道“继承”&#xff0c;继承是一种基于已有类&#xff08;父类&#xff09;创建新类&#xff08;子类&#xff09;的一种方式 下面的Son类继承了Father类 public class Father(){public void eat(String name,int age){System.out.prin…

2017 .NET 開發者須知

筆記&#xff0d;Scott Hanselman 的 2017 .NET 開發者須知 转载http://blog.darkthread.net/post-2017-01-16-dotnet-dev-should-know-2017.aspx Scott Hanselman 前兩天有篇文章&#xff0d;What .NET Developers ought to know to start in 2017&#xff0c;我的工作&#x…

Linux11-RPM软件包和YUM源

目录 一、rpm 二、yum 一、rpm 红帽开发了RPM软件包管理器&#xff0c;RPMRedhat Package Manager。RPM软件包名的格式为<name>-<version>-<release>.<arch>.rpm。比如&#xff0c;httpd-tools-2.4.6-7.el7.x86_64.rpm&#xff0c;其中namehttpd-to…

SQL Server 与 ORACLE 的区别

sql server 与 oracle的区别&#xff1a; DBMS 数据库管理系统 1.数据类型不同。 sql server 的数据类型&#xff1a;int ,smallint ,char,varchar,nchar,nvarchar,ntext,datetime,smalldatetime,money,decima, float,bit…… oracle 的数据类型&#xff1a;number(…

php如何定时执行任务

PHP的实现决定了它没有Java和.Net这种AppServer的概念, 而http协议是一个无状态的协议, php只能被用户触发, 被调用, 调用后会自动退出内存, 没有常驻内存, 就没有办法准确的定时处理那么, 如果需要用PHP定时执行某些任务的话, 可以有以下俩个方法&#xff0c;下面就让我们来看…

Java的多态(详尽版)

父类类型&#xff08;比如Mammal&#xff09;的变量指向子类&#xff08;比如Cat&#xff09;创建的对象&#xff0c;使用该变量调用父类中一个*被子类重写*的方法&#xff08;比如move方法&#xff09;&#xff0c; 则父类中的方法呈现出不同的行为特征&#xff0c;这就是多态…

C++ memset

memset的主要功能是对一片内存进行赋值&#xff08;逐字节进行&#xff09; 包含在头文件#include < cstring >中。 函数模板 void *memset(void *s, int v, size_t n); s&#xff1a;数组名&#xff0c;或指向某一片内存的指针名&#xff0c; v&#xff1a;要填充的值…

Linux12-文件系统基础

目录 一、识别文件系统和设备 1.1、分区 1.2、逻辑卷 二、挂载卸载文件系统命令mount、umount、blkid、lsof 2.1、挂载 2.2、卸载 三、检查文件系统命令df、du 四、制作文件链接命令ln 4.1、硬链接 4.2、软连接 五、查找文件命令locate、find 一、识别文件系统和设备…

C语言------运算符和表达式

1. 自动类型转换是由计算机自动完成的&#xff0c;当由低级别的向高级别的转换时&#xff0c;不会报警&#xff0c;但是当高级别的向低级别的转换时&#xff0c;会发出告警信息&#xff0c;信息意思就是提示会有部分数据丢失的可能。 2. 强制类型转换是通过“&#xff08;数据类…

String类常用方法(看一眼就懂)

public class Test{public static void main(String[] args){String name " T o m ";System.out.println(name.length()); //输入字符的长度&#xff0c;&#xff08;空格也占一个字节&#xff09;System.out.println(name.equals(" T o m ")); //判断连…

1.2.2一个数可以有多少种用连续素数之和表示

#include <iostream> using namespace std; const int maxp2000,n10000; int prime[maxp],total0; bool isprime(int k)//bool函数用来求素数 {for(int i0;i<total;i)if(k%prime[i]0)//判断素数的一种方法&#xff08;用这个数对数组当中所有的 素数 进行取余&#xf…

C++查找算法(更新中)

C的查找分为静态查找与动态查找。 静态查找&#xff1a;只是在查找表中判断是否有这一个元素&#xff0c;取出这个元素的属性。 动态查找&#xff1a;在查找过程中&#xff0c;会对查找表做出修改。 比如插入、删除。 静态查找 静态查找包括&#xff1a;顺序查找、二分查找、…

编译Linux Kernel(linux-4.19.178)并制作成rpm文件

目录 一、安装依赖项 二、下载、解压缩、制作.config文件 三、编译内核及打包 四、升级内核 首次尝试编译Linux内核&#xff0c;记录过程&#xff0c;提供Linux Kernel(linux-4.19.178)下载https://download.csdn.net/download/qpeity/15637656。 一、安装依赖项 安装依赖…