前言
Ubuntu服务器安装Apache2默认使用的模式为prefork模式,也就是多进程模式。这个模式有个好处就是比较稳定,但是也有坏处,那就是每个请求都需要一个完整的进程,对内存的消耗比较大。
Apache2提供了好几个运行模式,其中就有worker模式【多进程/多线程模式】,多进程的模式最大的优势就是对内存的消耗比较少,且运行速度相比prefork模式稍微快了些。
但是在Ubuntu下将Apache2改用worker模式,PHP又有问题了,因为PHP默认不支持多线程环境,如果我们第一次尝试使用可以看到下面的提示:
Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe. You need to recompile PHP.
字面意思是如果使用worker模式,那么我们的PHP需要执行在thread safe模式,但是Ubuntu下使用apt安装的PHP默认不是thread safe模式,这时候就需要自行编译PHP安装。
经过在网上各种寻找资料(网络上的资料真的是太老了),爬了好多的坑,最终在使用worker模式下成功了,使用了php-cgi模式。
操作
查看当前Apache2的运行模式,可以使用下面命令进行查询,可以看到我当前的运行环境是prefork模式,此时可以使用htop查看存在大量的apache的进程。
$ a2query -M
prefork
下面开始讲prefork模式切换到worker模式,首先安装PHP-CGI相关的依赖:
$ sudo apt install php-cgi libapache2-mod-fcgid
修改VirtualHost里的配置内容,此处以我这里的服务器域名举例:
<VirtualHost *:443>
......
AddHandler fcgid-script .php
FCGIWrapper /usr/lib/cgi-bin/php .php
<Directory "/you/site/path/">
Options +ExecCGI
</Directory>
......
</VirtualHost>
下面开启将Apache2的模式切换到worker模式,执行下面步骤
# 关闭默认的PHP模式,使用VH中配置的CGI模式
$ a2dismod php
# 关闭prefork模式
$ a2dismod mpm_prefork
# 启动worker模式
$ a2enmod mpm_worker
# 重启apache2
$ sudo systemctl restart apache2
# 查看运行模式
$ a2query -M
worker
# 启动fcgid模块
$ a2enmod fcgid
结束
至此我们已经将Apache2的运行模式切换到了worker模式,本人也是初次尝试此配置方式,目前还不知道有无问题,但大量apache内存大的问题稍微有些解决。