[ 安裝心得 ] 關於 Zope-2.5.0-src 的安裝
作者﹕網中人 <netman@study-area.org>
最近有機會接觸到傳說中的神秘而強悍的 Zope ﹐
而使用之後只有一個感覺﹕嘆為觀止﹗
這些感覺是沒辦法言傳的﹐只有當您真正接觸過才能意會。
(強烈建議看看 ZopeBook: http://www.zope.org/Members/michel/ZB)
然而﹐我在 RH7.2 上安裝的時候﹐卻遇到了一些困難﹕
首先是 python 版本的問題﹐
後來是 rc daemon 的設定。
所幸摸索了兩天﹐好像(我不敢肯定啦)也能跑起來了﹐
在高興之餘﹐當然也忘不了要跟大家分享我的心得。
++++++++++++++++++
以下步驟希望有助大家參考﹕
測試平臺﹕ RH7.2
測試版本﹕ python2 (可下載﹕http://www.study-area.org/linux/src/Zope-2.5.0-src.tgz )
zope2.5 (可下載﹕http://www.study-area.org/linux/src/python2-2.2-2.src.rpm )
首先﹐請確定您有安裝 python2 版本。
我是用 python2-2.2-2.src.rpm 來 rebuild 安裝的﹐
請注意您至少要包括 python2 和 python2-devel 這兩個 package﹐
當然了﹐src.rpm 產生的全部 package 都裝是沒太大壞處的。
su -
useradd -u 1000 -g 100 -s /bin/false -M zope
cd /opt
tar zxvf /all/path/to/Zope-2.5.0-src.tgz (確定您下載的是 src.tgz 哦)
chown -R zope.users Zope-2.5.0-src
ln -s Zope-2.5.0-src zope
cd /opt/zope
mv z2.py z2.py.orig
cat z2.py.orig | sed s/^UID=\'nobody\'/UID=\'zope\'/ > z2.py
python2 w_pcgi.py
以上命令或許會碰到 Makefile.pre.in 的問題﹐我也不清楚為什麼﹖
更奇怪的是 python2.1 版本是有的﹐但 2.2 反而沒有﹗
後來我是借 2.1 的檔案﹐然後複製到 /usr/lib/python2.2/config/ 目錄中。
您可以從這裡下載。
請確定上面的命令能成功完成再繼續﹐否則修改之。
python2 zpasswd.py access
這裡﹐您可以用 admin 做賬號名稱﹕
Username: admin
Password: (請自行輸入兩次)
Encoding: SHA
Domain restrictions: (這裡可以不輸入﹐直接 Enter 就好)
最後﹐執行下面的命令就可以將 zope 跑起來了﹕
/opt/zope/start &
然後用任何一個 browser 輸入 server 所在的 URL﹕
http://address.of.your.zope.server:8080/manage
用剛才設定的賬號(如 admin)及密碼登錄﹐
然後到 acl_users (左邊的目錄樹可以看到)﹐新增一個 manager 賬號﹕
Name: manage (可任意命名)
Password: (輸入密碼)
Confirm: (確認密碼)
Domain: (空白不填)
Roles: (請一定要選擇 manager ﹔如果按著 shift 鍵﹐則可複選。)
然後選擇右上角的下拉選單 logout
並用新建賬號登錄 (可能需要等一兩分鐘才生效)
並 refresh 畫面。
接下來﹐參考 zope book 的介紹﹐或從 help 那邊看 ZopeTutorial 。
需要關閉 zope 的話﹐執行﹕ /opt/zope/stop
* 下面的說明可能只適合 RedHat 系統上面﹐敬請留意﹕
********************
如果您需要用 rc script 以 daemon 方式來啟動的話﹐可以參考如下步驟﹕
1) 我去下載了 Zope-2.4.3-1.src.rpm 回來﹐
然後用 rpm 將之安裝到 src 目錄去:
rpm -ivh Zope-2.4.3-1.src.rpm
2) 您可以在 /usr/src/redhat/SOURCE 目錄下面﹐
找到一個名為 Zope-2.4.3-zope 的檔案﹐
那就是用來跑 init.d/zope 的 rc 檔了:
cd /usr/src/redhat/SOURCE
cp Zope-2.4.3-zope /etc/rc.d/init.d/zope
chkconfig --add zope
chkconfig zope on
不過﹐您還必須作一些修改(/etc/rc.d/init.d/zope)﹕
修改第 99 行﹐設定為您的 zope 目錄﹐例如﹕
INSTANCE_HOME=/opt/zope
(依我上面介紹的步驟為例子)
3) 另外﹐在 /usr/src/redhat/SOURCE 目錄還有另外一個檔﹕
Zope-2.4.3-zserver-wo-pcgi.sh
請將之複製到 zope 的目錄﹐並取名為 zserver.sh(因為 rc script 需要)﹕
cp Zope-2.4.3-zserver-wo-pcgi.sh /opt/zope/zserver.sh
然後修改其中的變數﹕
第 2 行﹕ export INSTANCE_HOME=/opt/zope
第 32 行﹕ /usr/bin/env python2 z2.py \
第 34 行﹕ -z /opt/zope
4) 然後就成功了﹗
要啟動 zope: service zope start
# 可能需要一些時間才看到 zserver 跑起來
要檢查狀態﹕ service zope status
要結束 zope﹕ service zope stop
要重新啟動﹕ service zope restart
Enjoy!
Kenny
p.s.
如果您不想下載 Zope-2.4.3-1.src.rpm 的話﹐
可以來信跟我要 zope 的 rc script 和 zserver.sh script 。
(netman@study-area.org)
或從下面位置下載它們的壓縮檔﹕﹕
* zope.tgz
* zserver.sh.tgz
解壓後複製到正確的路徑即可。要不然﹐參考如下內容寫也行﹕
1) cat /etc/rc.d/init.d/zope:
#!/bin/sh
#
# zope Start/Stop the Zope web-application server.
#
# chkconfig: 2345 72 72
# description: zope is a web server specifically for handling \
# HTTP requests to the Zope web-application service.
# probe: true
# Source function library.
. /etc/rc.d/init.d/functions
# Extracted from 'functions' to augment it to obtain Zope's
# watchdog and server PIDs from the ${INSTANCE_HOME}/var/Z2.pid
# file, where both the parent and child processes are recorded
# in the _same_ file.
# A function to find the pid of a program.
pidofproc() {
# Test syntax.
if [ $# = 0 ] ; then
echo "Usage: pidofproc {program}"
return 1
fi
# First try the "$INSTANCE_HOME/var/Z2.pid" file
if [ -f ${INSTANCE_HOME}/var/Z2.pid ] ; then
if [ "$1" = "zwatchdog" ] ; then
pid=`sed -e 's/^\([0-9]\+\) [0-9]\+/\1/' ${INSTANCE_HOME}/var/Z2.pid`
else
if [ "$1" = "zserver" ] ; then
pid=`sed -e 's/^[0-9]\+ \([0-9]\+\)/\1/' ${INSTANCE_HOME}/var/Z2.pid`
fi
fi
if [ "$pid" != "" ] ; then
echo $pid
return 0
fi
fi
# Next try "/var/run/*.pid" files
if [ -f /var/run/$1.pid ] ; then
pid=`head -1 /var/run/$1.pid`
if [ "$pid" != "" ] ; then
echo $pid
return 0
fi
fi
# Next try "pidof"
pid=`pidof -o $$ -o $PPID -o %PPID -x $1`
if [ "$pid" != "" ] ; then
echo $pid
return 0
fi
}
# Extracted from 'functions' to fix a tiny bug where it uses 'pidof'
# but should be using 'pidofproc'.
status() {
# Test syntax.
if [ $# = 0 ] ; then
echo "Usage: status {program}"
return 1
fi
# First try "pidofproc"
pid=`pidofproc $1`
if [ "$pid" != "" ] && ps h $pid >/dev/null 2>&1 ; then
echo "$1 (pid $pid) is running..."
return 0
else
pid=`pidof -o $$ -o $PPID -o %PPID -x $1`
if [ "$pid" != "" ] ; then
echo "$1 (pid $pid) is running..."
return 0
fi
fi
# Next try "/var/run/*.pid" files
if [ -f /var/run/$1.pid ] ; then
pid=`head -1 /var/run/$1.pid`
if [ "$pid" != "" ] ; then
echo "$1 dead but pid file exists"
return 1
fi
fi
# See if /var/lock/subsys/$1 exists
if [ -f /var/lock/subsys/$1 ]; then
echo "$1 dead but subsys locked"
return 2
fi
echo "$1 is stopped"
return 3
}
INSTANCE_HOME=/opt/zope
INSTANCE_NAME=`basename ${INSTANCE_HOME}`
# make sure starter script exists
[ -f ${INSTANCE_HOME}/zserver.sh ] || exit 0
RETVAL=0
# See how we were called.
case "$1" in
start)
echo -n "Starting zope: "
cd ${INSTANCE_HOME}
# See if it's already running.
pid=`pidofproc zwatchdog`
[ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && echo && exit $RETVAL
pid=`pidofproc zserver`
[ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && echo && exit $RETVAL
rm -f ${INSTANCE_HOME}/var/Z2.pid
daemon ${INSTANCE_HOME}/zserver.sh
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/${INSTANCE_NAME}
;;
stop)
echo -n "Shutting down zope: "
killproc zwatchdog
killproc zserver
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/${INSTANCE_NAME}
${INSTANCE_HOME}/var/Z2.pid
;;
restart|reload)
$0 stop
$0 start
RETVAL=$?
;;
status)
status zwatchdog
[ $RETVAL -ne 0 ] && RETVAL=$?
status zserver
[ $RETVAL -ne 0 ] && RETVAL=$?
;;
probe)
# echo command to start/restart zope, only if NOT already running...
# (this is a linuxconf convention, using the probe keyword above)
if [ ! -f /var/lock/subsys/${INSTANCE_NAME} ] ; then
echo start; exit 0
fi
pid=`pidofproc zwatchdog`
[ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && exit $RETVAL
pid=`pidofproc zserver`
[ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && exit $RETVAL
echo restart; exit 0
;;
*)
echo "Usage: zope {start|stop|restart|status}"
exit 1
esac
exit $RETVAL
+++++++++++++++++
2) cat /opt/zope/zserver.sh
#!/bin/sh
export INSTANCE_HOME=/opt/zope
# Now that we have fixed syslog.syslog_client to handle RH 6.1's changes, we
# can use syslogd for logging. Logging to a remote server using syslogd can
# be done by using ZSYSLOG_SERVER instead if ZYSLOG. If you do not define
# either of the ZSYSLOG* env vars, logging goes to the file specified by
# the -l command argument instead.
# Note: For syslog logging to work from the ZServer/medusa subsystem, the
# ZSYSLOG variable must now contain the name of the socket to log to,
# usually /dev/log on Unix machines. JM 19991104.
export ZSYSLOG="/dev/log"
#export ZSYSLOG_SERVER="localhost:514"
#
# We disable the Medusa monitor port, for security reasons, since many
# people won't need it.
#
# -z /usr/share/zope {specify directory of installed Zope software}
# -u zope {run as user 'zope'}
# -Z zwatchdog.pid {place to write ZServer's ZDaemon watchdog process ID}
# -w 8080 {port on which to listen for HTTP requests}
# -f 8021 {port on which to listen for FTP requests}
# -m '' {port on which to listen for Medusa monitor requests}
# -L 'locale' {specify desired international locale}
# -l /var/log/zope {specify logfile}
#
cd $INSTANCE_HOME
/usr/bin/env python2 z2.py \
-u zope \
-z /opt/zope \
-Z /var/run/zwatchdog.pid \
-w 8080 \
-f 8021 \
-m '' \
-l /var/log/zope \
>> /var/log/zope 2>&1 \
&
-------------------------
再補充(2002/06/23)﹕
以上步驟在 rh7.1 和 7.2 上面是可以的﹐但由於 rh7.3 已經裝有 python2 了﹐
所以讀者可以省略 python2 的安裝(除非您確定要升級)。
然而﹐我們也發現一個問題﹕
在 rh7.3 上面的 python2 卻不能讓前面步驟所安裝的 zope 順利執行﹗
如果強迫升級 python2 的話﹐卻會導致 redhat 上某些程式不能跑﹐
例如 redhat-config-user 和 authconfig-gtk
除非您不再執行那些 redhat 工具了﹗
解決的辦法有二﹕
1)
修改 python 的安裝目錄﹐再裝到獨立的地方去(不在 $PATH 中)﹐
然後修改 zope 的 start 這隻 scritp ﹐將裡面的 python 路徑換掉﹐
如果使用 rc script 的話﹐那一同將 zserver.sh 也換掉。
2)
不採樣 source 方式安裝﹐而是抓 tarball 回來﹐例如 2.5.1 的﹕
http://www.zope.org/Products/Zope/2.5.1/Zope-2.5.1-linux2-x86.tgz/view
然後按照如下步驟進行即可﹕
# cd /opt/
# tar zxvf /all/path/to/Zope-2.5.1-linux2-x86.tgz
# useradd -u 1000 -g 100 -s /bin/false -M zope
# chown -R zope.users Zope-2.5.1-linux2-x86
# rm zope
# ln -s Zope-2.5.1-linux2-x86 zope
# cd zope
# ./install # 請記住 admin 的密碼﹐否則參考前面的方法
# mv z2.py z2.py.orig
# cat z2.py.orig | sed s/^UID=\'nobody\'/UID=\'zope\'/ > z2.py
# ./start
我發現 tarball 的做法就是將 python 包在自己的 bin 裡面去了﹗
哈~~ 夠聰明吧 ﹗ ^_^
不過﹐如果您要使用 rc script 來啟動的話﹐
請將 zserver.sh 這隻 script 的 python 啟動路徑修改一下﹕
修改前﹕
/usr/bin/env python2 z2.py \
修改後﹕
$INSTANCE_HOME/bin/python z2.py \
這樣應該沒問題啦~~ 至於其它修補﹐請自行解決。
--
======= http://www.study-area.org =======
飛雪迎春到﹐風雨送春歸
已是寒崖百丈冰﹐尤有花枝俏
俏也不爭春﹐只把春來報
待得山花爛漫時﹐他在叢中笑﹗
----------
|