QeePHP 开源社区 - 引领 PHP 开发新思想、新模式's Archiver

lonestone 发表于 2009-3-21 14:56

UBUNTU linux编译安装lighttpd/php5.2.9/eA运行qeephp应用

[i=s] 本帖最后由 lonestone 于 2009-9-19 21:05 编辑 [/i]

先来做个广告:

566车市 [url=http://www.566che.com/]http://www.566che.com/[/url] 是一个采用qeephp2.1框架开发的二手车交易网站,现第四版以4个人月的时间开发,与2009年3月16日上线运行。

进入正题:

3月20日更新了稳定版本的框架源码后,php出现内存错误,出现问题的脚本就是新替换的sfYaml的解析库。
报错如下:[code]
[Fri Mar 20 14:20:07 2009] [error] [client 59.173.127.215] ALERT - canary mismatch on efree() - heap overflow detected (attacker '59.173.127.215', file '/var/www/qeephp-2.1/library/_vendor/yaml/sfYamlParser.class.php', line 98),
[/code]和老大交流后得知是php5在5.26之前都存在的一个BUG,最佳办法就是使用最新的php5.2.9

但生产服务器上用的是UBUNTU 8.04 Linux,用apt-get安装的apache2.2,php5.2.4,mysql5.0.51a,然后自行编译的eA0.9.5.2

现在既然要升级php5.2.9,就只有自行编译安装了,早有计划将apache2换成lighttpd的,那就一起来吧:

下载源码包[code]
wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.bz2
wget http://cn.php.net/distributions/php-5.2.9.tar.bz2
wget http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2
[/code]解压缩源码[code]
tar xvf lighttpd-1.4.22.tar.bz2
tar xvf php-5.2.9.tar.bz2
tar xvf eaccelerator-0.9.5.3.tar.bz2
[/code][color=#000000][/color]
[color=#000000]准备编译环境[/color]
[color=#000000][code]sudo apt-get install build-essential[/code][/color]
[color=#000000][/color]
[color=#000000]安装依赖的开发包[/color]
[color=#000000][code]
sudo apt-get install libmysqlclient15-dev libpng12-dev libxml2-dev libjpeg-dev libfreetype6
-dev libpcre3-dev libbz2-dev pkg-config gamin libgamin-dev libcurl4-openssl-dev libmcrypt-
dev
[/code]卸载apache和php5.2.4[code]sudo apt-get remove apache2-common php5-common --purge[/code][/color]
编译php5.2.9[code]
cd php-5.2.9
./configure --prefix=/usr/local/php --enable-fastcgi --enable-force-cgi-redirect --with-config-file-path=/usr/local/php/etc --disable-ipv6 --enable-libxml --with-gd --enable-gd-native-ttf --with-mysql=/usr/lib/mysql/lib --with-mysqli=/usr/bin/mysql_config --enable-xml --with-freetype-dir --with-jpeg-dir --with-png-dir --with-ttf=shared --enable-static --with-zlib-dir --with-ttf --enable-mbstring --with-mcrypt --enable-sockets --with-gettext --with-mysql-sock=/var/run/mysqld/mysqld.sock --enable-ftp --with-pdo-mysql --enable-sqlite-utf8 --enable-zip --enable-exif --with-curl
make
sudo make install
sudo cp php.ini-recommended /usr/local/php/etc/php.ini
[/code]
注意:如果是配合apache2编译php的话,要加上:
--with-apxs2=/usr/bin/apxs2
安装之前,在httpd.conf中增加点虚假的内容
例如:
# Dummy LoadModule directive to aid module installations
# LoadModule dummy_module /usr/lib/apache2/modules/mod_dummy.so
因为如果httpd.conf内容为空的话
安装PHP会出错。

编译lighttpd1.4.22[code]
cd ..
cd lighttpd-1.4.22
./configure --prefix=/usr/local/lighttpd --disable-ipv6 --with-mysql=/usr/bin/mysql_config --with-zlib --with-bzip2 --with-fam --with-memcache
make
sudo make install
sudo mkdir -p /usr/local/lighttpd/etc
sudo mkdir -p /usr/local/lighttpd/log
sudo mkdir -p /usr/local/lighttpd/run
sudo mkdir -p /etc/lighttpd/
sudo cp ./doc/lighttpd.conf /etc/lighttpd/
[/code]设置目录权限
因为我们将以www-data用户和组来运行服务,所以需要设置相关的目录权限[code]sudo chmod www-data:www-data /usr/local/lighttpd/log
sudo chmod www-data:www-data /usr/local/lighttpd/run[/code][color=#000000][/color]
[color=#000000]配置lighttpd[/color]
[color=#000000][code]sudo vim /etc/lighttpd/lighttpd.conf[/code][/color]
修改以下内容(可能是取消注释,也可能是新添加,可使用/搜索关键词)
打开相应的模块[code] server.modules              = (
                               "mod_rewrite",
                               "mod_redirect",
                               "mod_alias",
                                "mod_access",
#                               "mod_cml",
#                               "mod_trigger_b4_dl",
#                               "mod_auth",
#                               "mod_status",
#                               "mod_setenv",
                               "mod_fastcgi",
#                               "mod_proxy",
#                               "mod_simple_vhost",
                               "mod_evhost",
#                               "mod_userdir",
                               "mod_cgi",
                               "mod_compress",
                               "mod_ssi",
#                               "mod_usertrack",
                               "mod_expire",
#                               "mod_secdownload",
#                               "mod_rrdtool",
                                "mod_accesslog" )


[/code]设置文档路径:[code]server.document-root        = "/var/www/"[/code]设置错误日志文件路径:[code]server.errorlog             = "/var/log/lighttpd/error.log"[/code]设置默认文档:[code]index-file.names            = ( "index.php", "index.html",
                                "index.htm", "index.shtml", "default.htm" )[/code]设置访问日志路径:[code]accesslog.filename          = "/var/log/lighttpd/access.log"[/code]设置一些参数,提高性能:[code]server.port                = 80
server.max-fds             = 2048
server.stat-cache-engine   = "fam"
server.max-keep-alive-requests = 0
server.max-keep-alive-idle    = 5
server.event-handler       = "linux-sysepoll"
server.network-backend     = "linux-sendfile"[/code]设置pid file的路径[code]server.pid-file            = "/var/run/lighttpd.pid"[/code]设置运行用户:[code]server.username            = "www-data"
server.groupname           = "www-data"[/code]设置gzip压缩:[code]compress.cache-dir         = "/var/cache/lighttpd/compress/"
compress.filetype          = ("text/plain", "text/css", "text/xml", "text/javascript")[/code]设置fastcgi运行php[code]fastcgi.server    = ( ".php" =>
((
  "bin-path" => "/usr/local/php/bin/php-cgi",
  "socket" => "/tmp/php-fastcgi.socket" + var.PID,
  "max-procs" => 2,
  "idle-timeout" => 20,
  "bin-environment" => (
   "HP_FCGI_CHILDREN" => "5",
   "HP_FCGI_MAX_REQUESTS" => "1000"
  ),
  "bin-copy-environment" => (
   "ATH", "SHELL", "USER"
  ),
  "broken-scriptfilename" => "enable"
))
)[/code]然后就是要编写一个lighttpd的控制脚本,放在/etc/init.d/lighttpd,内容如下:[code]#!/bin/sh
### BEGIN INIT INFO
# Provides: lighttpd
# Required-Start: networking
# Required-Stop: networking
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start the lighttpd web server.
### END INIT INFO


PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/loca/lighttpd/sbin:/usr/loca/lighttpd/bin
DAEMON=/usr/local/lighttpd/sbin/lighttpd
NAME=lighttpd
DESC="web server"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
ENV="env -i LANG=C PATH=/usr/local/lighttpd/bin:/usr/local/lighttpd/bin:/bin"
SSD="/sbin/start-stop-daemon"

DAEMON_OPTS="-f /etc/lighttpd/lighttpd.conf"

test -x $DAEMON || exit 0

set -e

# be sure there is a /var/run/lighttpd, even with tmpfs
mkdir -p /var/run/lighttpd > /dev/null 2> /dev/null
chown www-data:www-data /var/run/lighttpd
chmod 0750 /var/run/lighttpd

. /lib/lsb/init-functions

case "$1" in
start)
log_daemon_msg "Starting $DESC" $NAME
if ! $ENV $SSD --start --quiet\
--pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS ; then
log_end_msg 1
else
log_end_msg 0
fi
;;
stop)
log_daemon_msg "Stopping $DESC" $NAME
if $SSD --quiet --stop --oknodo --retry 30\
--pidfile $PIDFILE --exec $DAEMON; then
rm -f $PIDFILE
log_end_msg 0
else
log_end_msg 1
fi
;;
reload)
log_daemon_msg "Reloading $DESC configuration" $NAME
if $SSD --stop --signal 2 --oknodo --retry 30\
--quiet --pidfile $PIDFILE --exec $DAEMON; then
if $ENV $SSD --start --quiet \
--pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS ; then
log_end_msg 0
else
log_end_msg 1
fi
else
log_end_msg 1
fi
;;
restart|force-reload)
$0 stop
[ -r $PIDFILE ] && while pidof lighttpd |\
grep -q `cat $PIDFILE 2>/dev/null` 2>/dev/null ; do sleep 1; done
$0 start
;;
*)
echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
exit 1
;;
esac

exit 0
[/code]这样,通过如下命令控制lighttpd即可[code]
sudo /etc/init.d/lighttpd start
sudo /etc/init.d/lighttpd stop
sudo /etc/init.d/lighttpd restart
sudo /etc/init.d/lighttpd force-reload
[/code]然后就是设置php.ini中,打开php输出压缩了(由于lighttpd不压缩动态文件):[code]sudo vim /usr/local/php/etc/php.ini[/code]修改[code]
zlib.output_compression = On
zlib.output_compression_level = 9
zlib.output_handler = On
[/code]然后我们来编译eA0.9.5.3[code]
cd ..
cd eaccelerator-0.9.5.3
./configure
make
sudo make install
[/code]扩展会被安装到:
/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so
然后修改php.ini加载它:[code]sudo vim /usr/local/php/etc/php.ini[/code]在最后加上[code][EA]
extension="eaccelerator.so"
eaccelerator.shm_size="32"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"[/code]创建缓存文件夹:[code]
sudo mkdir /tmp/eaccelerator
sudo chmod 777 /tmp/eaccelerator
[/code]看看是否成功加载:[code] /usr/local/php/bin/php -v[/code]如果输出有eA的信息就OK了
重启lighttpd即可

最后的问题就是URL重写

支持qeephp应用的rewrite模式的规则基本是:[code]url.rewrite-once = ("^(.+)$" => "/index.php/$1")[/code]lighttpd的url重写模块是不支持检测文件是否存在的,这点比较郁闷,你不得不编写很多正则来解决问题
我开始也是这么做,后来找到了一个外国高手打过补丁的模块源码,替换掉lighttpd的mod_rewrite.c后,问题完美解决。
可能这个替换会增加点磁盘IO,但我相信这对于我们这些小站不是问题吧?
如果需要支持这个特性,请下载附件,替换lighttpd源码中src中的相应文件,重新编译即可
然后将[code]url.rewrite-once[/code]替换为[code]url.rewrite-once-NF[/code]即可

顺便贴以下566che的虚拟主机配置,用到了rewrite, ailas等,颇具参考价值[code]$HTTP["host"] =~ ".*\.566che\.com|car\.wuhan\.net\.cn" {
server.document-root = "/var/www/566che_4th/public"

alias.url = ( "/bbs" => "/var/www/bbs/" )
alias.url += ( "/home" => "/var/www/uchome/" )
alias.url += ( "/uc" => "/var/www/ucenter/" )
alias.url += ( "/mm" => "/var/www/modelshow/public/" )
alias.url += ( "/phpmyadmin" => "/var/www/phpmyadmin/" )
alias.url += ( "/cgi-bin" => "/usr/lib/cgi-bin/")
alias.url += ( "/awstats-icon" => "/usr/share/awstats/icon/")

url.rewrite-once-NF = (

"^(.*)/bbs/archiver/([a-z0-9\-]+\.html)$" => "$1/bbs/archiver/index.php?$2",
"^(.*)/bbs/forum-([0-9]+)-([0-9]+)\.html$" => "$1/bbs/forumdisplay.php?fid=$2&page=$3",
"^(.*)/bbs/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$" => "$1/bbs/viewthread.php?tid=$2&extra=page\%3D$4&page=$3",
"^(.*)/bbs/profile-(username|uid)-(.+)\.html$" => "$1/bbs/viewpro.php?$2=$3",

"^(.*)/home/(space|network)\-(.+)\.html$"=>"$1/home/$2.php?rewrite=$3",
"^(.*)/home/(space|network)\.html$"=>"$1/home/$2.php",
"^(.*)/home/([0-9]+)$"=>"$1/home/space.php?uid=$2",

"^(?!/bbs)(?!/home)(?!/uc)(?!/mm)(?!/phpmyadmin)/(.+)$" => "/index.php/$1",
"^(.*)/(bbs|home|uc|mm|phpmyadmin)$" => "/$2/index.php"

)
}
else $HTTP["host"] =~ "^(566che\.com|.*\.556che\.com|www\.556che\.com)$" {
url.redirect = ( "^/(.*)" => "http://www.566che.com/$1" )
}[/code]至此基本结束,希望大家调试顺利!

dualface 发表于 2009-3-21 15:36

好帖,非常实用的资料!

kukat 发表于 2009-3-23 11:36

其实……
[url]http://packages.dotdeb.org/dists/stable/php5/binary-i386/php5_5.2.9-0.dotdeb.1_all.deb[/url]
[url]http://packages.dotdeb.org/dists/stable/php5/binary-amd64/php5_5.2.9-0.dotdeb.1_all.deb[/url][code]deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all[/code]

aios 发表于 2009-3-24 00:37

[i=s] 本帖最后由 aios 于 2009-3-31 14:34 编辑 [/i]

月底去拜访下。

后续,待了两天参观下,感触很多,继续努力。

zpvip 发表于 2009-3-25 06:05

我也用Ubuntu的,顶一下,有空也换成 lighttpd 好了

lonestone 发表于 2009-3-30 13:34

[quote]其实……
[url=http://packages.dotdeb.org/dists/stable/php5/binary-i386/php5_5.2.9-0.dotdeb.1_all.deb]http://packages.dotdeb.org/dists/stable/php5/binary-i386/php5_5.2.9-0.dotdeb.1_all.deb[/url]
[url=http://packages.dotdeb.org/dists/stable/php5/binary-amd64/php5_5.2.9-0.dotdeb.1_all.debdeb]http://packages.dotdeb.org/dists/stable/php5/binary-amd64/php5_5.2.9-0.dotdeb.1_all.debdeb[/url] http://packag ...
[size=2][color=#999999]kukat 发表于 2009-3-23 11:36[/color] [url=http://qeephp.com/bbs/redirect.php?goto=findpost&pid=37939&ptid=6496][img]http://qeephp.com/bbs/images/common/back.gif[/img][/url][/size][/quote]

呵呵,有deb那就用吧……、

确实要编译的话,也可以从源中的src包来编译和生成deb,也很方便

peacock 发表于 2009-5-8 13:50

请教下,rewrite规则写到什么文件里面?

lonestone 发表于 2009-5-8 13:53

[quote]请教下,rewrite规则写到什么文件里面?
[size=2][color=#999999]peacock 发表于 2009-5-8 13:50[/color] [url=http://qeephp.com/bbs/redirect.php?goto=findpost&pid=42508&ptid=6496][img]http://qeephp.com/bbs/images/common/back.gif[/img][/url][/size][/quote]

/etc/lighttpd/lighttpd.conf

peacock 发表于 2009-5-8 14:24

请教下,我的root目录为E:/htdocs/,请问怎么配置E:/htdocs/QeeApp/的rewrite?

peacock 发表于 2009-5-8 15:42

解决了
[quote]
url.rewrite = (
         "^/QeeApp/(.*\.(js|ico|gif|jpg|png|css))" => "/QeeApp/$1",
         "^/QeeApp/(.*)" => "/QeeApp/index.php"
)
[/quote]

conanwkl 发表于 2009-12-9 03:54

[b] [url=http://qeephp.com/bbs/redirect.php?goto=findpost&pid=37782&ptid=6496]1#[/url] [i]lonestone[/i] [/b]

http://redmine.lighttpd.net/issues/985

rewrite检查文件存在的功能在1.4.24版本中修复了。

页: [1]

Powered by Discuz! Archiver 7.0.0  © 2001-2009 Comsenz Inc.