apache上运行PHP的几种方式汇总
之前也有整理过一篇 「apache中PHP的几种支持模式」的blog,但是感觉还是比较混乱,很多问题没有理清楚,一些方式也没有整理到。所以今天通过这篇blog再整理一下。
Using proxy_fcgi and php-fpm (for apache 2.4)
Using php with fastcgi (for 2.2 and older)
Using php with fcgid (for 2.2 and older)
Using mod_php as a DSO with a threaded mpm (2.0 and newer)
Using mod_php as a DSO (deprecated)
Using proxy_fcgi and php-fpm (for apache 2.4)
此方法优先于所有其他方案,适用于Apache 2.4及更高版本。 它还允许线程mpm,如event或worker,这将显著减少对服务器的RAM需求。
详情见httpd 2.4.x上使用mod_proxy_fcgi和php-fpm实现高性能PHP
Using php with fastcgi (for 2.2 and older)
此方法适用于2.2及更高版本。 它还允许线程mpm,如event或worker,这将显著减少对服务器的RAM需求。
本文的范围是讨论使用Apache httpd 2.2和php的可能配置。在大多数情况下使用mod_php不是一个可行的解决方案,因为它引入了对每个httpd进程增加的RAM需求的可扩展性问题。另外,此外,它排除了使用线程MPM,因为php扩展在许多情况下不是线程安全的。
理想的配置是轻线程httpd进程,与外部fastcgi服务器(如PHP-FPM)通信。
第一个使用mod_fastcgi的方案
Alias /php5.fcgi /var/www/fcgi/php5.fcgi
FastCGIExternalServer /var/www/fcgi/php5.fcgi -flush -host 127.0.0.1:9000
# 创建一个新的处理程序名称并将其用于PHP文件
AddHandler my-fastcgi .php
# *.php的请求实际上作为参数馈送到php-fastcgi
Action my-fastcgi /php5.fcgi
<Directory "/var/www/fcgi/">
Order deny,allow
Deny from all
<Files "php5.fcgi">
Order allow,deny
Allow from all
</Files>
</Directory>
Using php with fcgid (for 2.2 and older)
此方法适用于2.0或2.2版本。 它允许线程mpm,如worker,这将显着减少您的服务器上的RAM要求。 而mod_fcgid是一个官方的Apache模块。
Why ?
- 因为mod_php迫使你加载prefork MPM,这是低效的。
- 因为mod_php将被加载到httpd内存中,即使在服务静态页面
- 2013年发布的大多数发行版提供了预编译的包,让您可以使用fcgi运行php。 这只是一个配置问题。
- mod_fcgid是一个官方Apache模块,可在 http://httpd.apache.org/mod_fcgid/ 查看
优点
- 巨大的性能提升,在CPU和内存消耗
- PHP运行在一个单独的进程
不在fcgid上运行php的情况
如果你运行httpd 2.4,你应该考虑PHP-FPM
快速体验
按照所有步骤,或许最终会丢失一些东西。
1、摆脱mod_php。 你需要从你的配置中注释掉“LoadModule php5_module”。
在debian上,只要运行“apt-get remove libapache2-mod-php5”
2、Install mod_fcgid
在 debian上, “apt-get install libapache2-mod-fcgid”
3、Install PHP as CGI
在 debian上, “apt-get install php5-cgi”
编写一个小封装包,例如:/usr/local/bin/php-wrapper
#!/bin/sh
# Set desired PHP_FCGI_* environment variables.
# Example:
# PHP FastCGI processes exit after 1000 requests by default.
PHP_FCGI_MAX_REQUESTS=1000
export PHP_FCGI_MAX_REQUESTS
# Replace with the path to your FastCGI-enabled PHP executable
exec /usr/lib/cgi-bin/php5
确保它是可读的和可执行的apache user/group.
5、修改配置 httpd.conf
LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so
AddHandler fcgid-script .php
FcgidWrapper /usr/local/bin/php-wrapper .php
6、用多线程MPM替换prefork MPM,例如worker。
在debian上,只需运行“apt-get install apache2-mpm-worker”
常见问题/It doesn’t work
不要惊慌。 检查apache错误日志。
PHP文件被下载,不解释
PHP files are downloaded, not interpreted
If you have a handler already set for PHP, it may be conflicting. So you can try something like : “grep -ri handler /etc/httpd | grep php” depending on the result, you may need to comment out some config you are having.
如果您已经为PHP设置了处理程序,则可能会发生冲突。 所以你可以尝试类似:“grep -ri handler /etc/httpd | grep php”根据结果,你可能需要注释掉一些存在配置。
更多选项
请参考: http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html#upgrade
Using mod_php as a DSO with a threaded mpm (2.0 and newer)
这种方法与下一个配方相同,只是可以使用event或worker等线程化的mpm。主要的要求是php系统库和DSO必须用线程安全标志(重新)编译。
如果使用apache httpd 2.0或更早版本,必须重新编译才能更改mpm。 对于2.4,加载适当的mpm模块后缀。
必须特别注意确保工作程序经常重启(MaxConnectionsPerChild> 0),因为子进程仍然容易出现php内存泄漏,并且进程可能消耗大量RAM并耗尽可用的系统资源。
这可能是所有最少使用的方法,由于维护一个线程安全的php库是一件非常头痛的事,并且因为大多数linux发行版不发运这些包。
Using mod_php as a DSO (deprecated)
此方法是最早和可能是最慢的配置。 它适合2.2版本和更旧,并要求使用prefork mpm。
为什么你不应该使用mod_php与prefork mpm了
- mod_php始终加载到每个httpd进程中。 即使当httpd服务静态/非php内容。
- mod_php不是线程安全的,并且迫使你坚持使用prefork mpm(多进程,没有线程),这可能是最慢的配置
如何使用
首先,必须加载模块:
LoadModule php5_module lib/httpd/modules/libphp5.so
然后,添加dso的处理程序:
# Then, configure the handler for all files that end with .php
# A regexp such as \.(php|php4|php5)$ can also be used to support more extensions
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
参考: