天天看点

Ubuntu server 11.04 下配置Apache的Worker模式+mod_fcgid+APC

安装了ubuntu server 的 LAMP套件 用 apache2ctl -V 查看当前apache是以Prefork模式运行

据说worder模式比较给力 于是google之

以下来源:http://blog.renhao.org/2010/06/ubuntu-set-apache2-mpm-worker/

其实Apache本身的并发能力是足够强大的,但是Ubuntu默认安装的是Prefork模式下的Apache。所以导致很多人后面盲目的去安装lighttpd或者nginx一类替代软件。但是这类软件有一定的兼容问题,部分情况下可能工作的并不好。那么, 是不是Apache并发就不行了呢?——答案当然是否定的。

在进行配置之前,我们首先要知道什么是Prefork模式,什么是Worker模式,什么是Event模式,以及什么是MPM。

MPM是Apache2引入的一个概念,就是将结构模块化。把核心任务处理作为一个可插拔的模块,即MPM,使其能针对不同的环境进行优化。在这个情况下,就诞生出了处理模式的概念。处理模式现在分为Prefork、Worker、Event三种。

Prefork MPM基于非线程模型,和Apache 1.x版本中的处理方式很相似。Prefork MPM在所有情况下都很安全,对运行非线程安全(non-thread-safe)模式的软件如PHP,它是唯一的安全选择。对于某些应用程序,包括在 Apache 1.3上非常流行的程序(如简单静态页面、CGI脚本等),Prefork MPM是最好的选择。另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。但是由于每一个请求都会产生一个新的进程,导致系统资源(尤其是内存)消耗的很快,一旦并发量较大的时候,大量的Apache进程会占用巨大的内存空间。

而Worker MPM基于线程模式,具有内存消耗低(对繁忙的服务很重要)、扩展性在某些特定应用情况下比Prefork更好等优点。在这个模式下,采用的进程和线程混合的形式处理请求。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的Prefork模式。

以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载,但是 Keepalive需要和服务进程或者线程绑定,这就导致一个繁忙的服务器会耗光所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM可以用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工作。

一目了然,三种MPM模式各有各的优缺点。但是如果我们经常遇到访问量一大,服务器资源就吃紧的情况,那么就是Prefork模式瓶颈了。在其他两类MPM中,通用的做法还是使用Worker模式来解决问题。Event MPM由于不支持安全连接(HTTPS)所以导致应用有一定的局限性。

下面我们就以Ubuntu下将Apache的模式从Prefork设置为Worker为例,来说明一下操作步骤。前面也提到了,由于Worker模式与PHP的执行方式不同,所以如果简单的输入apt-get install apache2-mpm-worker,会导致PHP无法使用。当然了,如果你的网页只有静态页面,不需要使用PHP,那么使用上面这条指令就会搞定一切。这里我们着重讨论下要使用PHP的情况下,应该如何配置Apache的Worker模式。

1. 安装Apache的fcgid模块,使用它来启用PHP。

#apt-get install libapache2-mod-fcgid

2. 设置fcgid模块的配置文件,使其能够调用PHP。

#vim /etc/apache2/mods-available/fcgid.conf

将文件内的原来文本全部删除掉,然后添加下面的文本:

<IfModule mod_fcgid.c>

AddHandler fcgid-script .php .py .pl .fcgi

SocketPath /var/lib/apache2/fcgid/sock

IPCConnectTimeout 20

</IfModule>

3. 安装php5-cgi。

#apt-get install php5-cgi

4. 设置Apache的配置文件,使其能够调用fcgid模块来启动PHP。

#vim /etc/apache2/apache2.conf

在文件最后添加下面的内容:

<Directory />

FCGIWrapper /usr/bin/php5-cgi .php

Options ExecCGI SymLinksIfOwnerMatch

</Directory>

5. 安装Apache的Worker MPM模块。

#apt-get install apache2-mpm-worker

需要注意的是,如果之前有安装了php5-gd和php5-mysql模块,Ubuntu在配置Apache的Worker模式的时候可能会将其卸载,可以重新安装一次以防万一:

#apt-get install php5-gd php5-mysql

这样就成功的完成了Apache的Worker MPM模块配置工作,现在Apache将会以Worker模式运行了。你会发现你的站点负载能力又会大大的提升,内存资源也会充裕很多了。

资料参考:http://hi.baidu.com/yanft/blog/item/e3f7b326f8171c1b8b82a132.html

资料参考:http://www.linuxforum.net/forum/printthread.php?Cat=&Board=web&main=445922&type=post

可以将

FCGIWrapper /usr/bin/php5-cgi .php

这句写入/etc/apache2/mods-available/fcgid.conf配置里

<IfModule mod_fcgid.c>

AddHandler fcgid-script .php .py .pl .fcgi

SocketPath /var/lib/apache2/fcgid/sock

FCGIWrapper /usr/bin/php5-cgi .php

IPCConnectTimeout 20

</IfModule>

然后再给站点的配置上加入

Options ExecCGI

重启apache后 用apache2ctl -V 查看一下

发现 这行 Server MPM:     Worker

add by Q 2011.09.21

新遇见的问题 上传一个joomla插件 报500错误

查日志发现  mod_fcgid: HTTP request length 135567 (so far) exceeds MaxRequestLen (131072)

google到如下内容

最近在win2003 apache+php+fastcgi+mysql  开发环境下,使用wordpress上传图片时,遇到稍大的图片总是会遇到“HTTP error”,但是检查过php.ini发现文件大小限制post_max_size设置的没有问题,查看apache的logs 日志记录才显示了问题所在:

“mod_fcgid: HTTP request length 135567 (so far) exceeds MaxRequestLen (131072)”

原来是fastcgi模式下的设置问题,需要在配置文件.htaccess或者直接在apache的配置文件http.conf 中指明,如下:

<IfModule mod_fcgid.c>

  AddHandler    fcgid-script .fcgi

  FcgidConnectTimeout  20

  # to get around upload errors when uploading images increase the MaxRequestLen size to 15MB

  MaxRequestLen  15728640

</IfModule>

里面的“MaxRequestLen”就是fastcgi模式下上传文件也就是http接受的最大文件长度。

于是#vim /etc/apache2/mods-available/fcgid.conf

将MaxRequestLen  15728640 这句加入

<IfModule mod_fcgid.c>

AddHandler fcgid-script .php .py .pl .fcgi

SocketPath /var/lib/apache2/fcgid/sock

FCGIWrapper /usr/bin/php5-cgi .php

IPCConnectTimeout 20

MaxRequestLen  15728640

</IfModule>

再上传插件 未报错

进一步优化 安装APC

操作码缓存

请求一个 PHP 脚本时,PHP 会读取该脚本,并将其编译为 Zend 操作码,这是要执行的代码的一种二进制表示形式。随后,此操作码由 PHP 执行并丢弃。操作码缓存将保存这个编译后的操作码,并在下一次调用该页面时重用它。这会节省很多时间。有多种缓存可用,我比较常用的是 eAccelerator。

要安装 eAccelerator,您的计算机上需要有 PHP 开发库。由于不同的 Linux 发布版存放文件的位置不同,所以最好直接从 eAccelerator 的 Web 站点获得安装说明(参见 参考资料 部分获得链接)。您的发布版也有可能已经包含了一个操作码缓存,只需安装即可。

无论如何在系统上安装 eAccelerator,都有一些配置选项需要注意。配置文件通常是 /etc/php.d/eaccelerator.ini。

eaccelerator.shm_size

 定义共享高速缓存的大小,编译后的脚本就存储在这里。该值的单位是兆字节(MB)。根据您的应用程序确定恰当的大小。eAccelerator 提供了一个脚本来显示缓存的状态,其中包含内存占用,64MB 是个不错的选择(

eaccelerator.shm_size="64"

)。如果您选择的值未被接受,那么必须修改内核的最大共享内存的大小。向 /etc/sysctl.conf 添加 

kernel.shmmax=67108864

,运行 

sysctl -p

 来使设置生效。

kernel.shmmax

 值的单位是字节。

如果共享内存的分配超出极限,eAccelerator 必须将旧脚本从内存中清除。默认情况下,这是被禁用的;

eaccelerator.shm_ttl = "60"

 指定:当 eAccelerator 用完共享内存时,60 秒内未被访问的所有脚本都将被清除。

另一种流行的 eAccelerator 替代工具是 Alternative PHP Cache(APC)。Zend 的厂商也提供了一种商业操作码缓存,包括一个进一步提高效率的优化器。

sudo apt-get install php-apc

sudo /etc/init.d/apache2 restart

想要安装php-fpm来管理fastcgi

发现mod_fcgid不支持php-fpm

老外说的 网上也找不到具体配置的方法

http://httpd.markmail.org/message/pnj6pkxjmulrt3vo?q=php-fpm

另附 worker模式的 mpm 配置解释

<IfModule worker.c>

# ServerLimit & ThreadLimit 需要配置其它worker指令前面

# default 16

    ServerLimit      16   

# 每个子进程可配置的线程数上限, ThreadsPerChild的配值不能超过ThreadLimit,否则启动报警告并自动调整ThreadPerChild

# default 64

    ThreadLimit      64   

# 服务器启动时建立的子进程数, 子进程在启动时建立这些线程后就不再建立新的线程了

# default 3

    StartServers     5    

# MaxClients指令设置了允许同时伺服的最大接入请求数量

# 对于混合型的MPM默认值是16(ServerLimit)乘以64(ThreadsPerChild)的结果

    MaxClients       1024

# worker的默认值是"75"。这个MPM将基于整个服务器监视空闲线程数。如果服务器中总的空闲线程数太少,子进程将产生新的空闲线程。

# default 75

    MinSpareThreads  25   

# Apache将按照"其大于等于MinSpareThreads加上ThreadsPerChild的和"自动修正你设置的值

# 75<64+25,所以MaxSpareThreads被重新设置为64+25=89

# default 250

    MaxSpareThreads  75

# 每个子进程建立的线程数,要设在超过64,需求相应配置ThreadLimit

# default 25

    ThreadsPerChild  64  

</IfModule>