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]至此基本结束,希望大家调试顺利! 好帖,非常实用的资料! 其实……
[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] [i=s] 本帖最后由 aios 于 2009-3-31 14:34 编辑 [/i]
月底去拜访下。
后续,待了两天参观下,感触很多,继续努力。 我也用Ubuntu的,顶一下,有空也换成 lighttpd 好了 [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,也很方便 请教下,rewrite规则写到什么文件里面? [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 请教下,我的root目录为E:/htdocs/,请问怎么配置E:/htdocs/QeeApp/的rewrite? 解决了
[quote]
url.rewrite = (
"^/QeeApp/(.*\.(js|ico|gif|jpg|png|css))" => "/QeeApp/$1",
"^/QeeApp/(.*)" => "/QeeApp/index.php"
)
[/quote] [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]