如何在lighttpd服务器中同时运行多版本PHP并按端口分配?
在lighttpd上同时运行多版本PHP(PHP 5.6 + PHP 7.0)
我之前也折腾过lighttpd多版本PHP共存的配置,确实直接启用两个官方的fastcgi-php5.6和fastcgi-php7.0模块会冲突,不过咱们可以通过手动配置FastCGI后端的方式绕开这个限制,既能让端口80默认跑PHP5.6,又能给特定项目指定PHP7.0。下面是一步步的实操方案:
1. 禁用自动的PHP FastCGI模块
首先得把系统自带的自动PHP模块引用注释掉,避免冲突:
- 打开lighttpd主配置文件(通常是
/etc/lighttpd/lighttpd.conf) - 找到类似
include "conf.d/fastcgi-php5.6.conf"或include "conf.d/fastcgi-php7.0.conf"的行,在前面加#注释掉 - 确保只保留
mod_fastcgi模块的启用(如果还没启用,就加一行server.modules += ( "mod_fastcgi" ))
2. 配置PHP 5.6为端口80的默认后端
在主配置文件中添加手动的FastCGI配置,把PHP5.6设为全局默认:
# 全局默认使用PHP 5.6 fastcgi.server += ( ".php" => (( # 如果你用的是PHP-FPM(推荐,性能更好),用socket路径 "socket" => "/var/run/php/php5.6-fpm.sock", # 如果直接用php-cgi,就换成下面这行 # "bin-path" => "/usr/bin/php5.6-cgi", # "max-procs" => 4, # 用cgi时可以设置进程数 "broken-scriptfilename" => "enable" )) )
注意:
broken-scriptfilename必须开启,否则lighttpd传递给PHP的脚本路径会有问题,导致无法正常解析PHP文件。
3. 为特定项目配置PHP 7.0
如果某个站点或目录需要用PHP7.0,通过$HTTP["host"]或$HTTP["url"]做匹配,单独指定后端:
方式1:针对特定域名配置
# 当访问php70.local域名时,使用PHP7.0 $HTTP["host"] == "php70.local" { fastcgi.server += ( ".php" => (( "socket" => "/var/run/php/php7.0-fpm.sock", # 用cgi的话替换成:"bin-path" => "/usr/bin/php7.0-cgi", "broken-scriptfilename" => "enable" )) ) }
方式2:针对特定目录配置
# 当访问/php70-project/路径下的PHP文件时,使用PHP7.0 $HTTP["url"] =~ "^/php70-project/" { fastcgi.server += ( ".php" => (( "socket" => "/var/run/php/php7.0-fpm.sock", "broken-scriptfilename" => "enable" )) ) }
4. 验证配置并重启服务
- 先检查配置文件是否有语法错误:
lighttpd -t -f /etc/lighttpd/lighttpd.conf
- 如果输出
Syntax OK,就重启lighttpd服务:
# 系统用systemd的话 systemctl restart lighttpd # 老系统用service的话 service lighttpd restart
额外注意事项
- 如果用PHP-FPM,要确保
php5.6-fpm和php7.0-fpm服务已经启动并正常运行 - 检查socket文件的权限,确保lighttpd的运行用户(通常是
www-data)有权限访问,必要时可以调整socket的权限或所属组 - 用php-cgi的话,lighttpd会自动管理CGI进程,但PHP-FPM的稳定性和性能更优,推荐优先使用FPM模式
内容的提问来源于stack exchange,提问作者Taci Roy
相关产品推荐
相关产品推荐

