[ 安裝心得 ] 關於 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 ======= 飛雪迎春到﹐風雨送春歸 已是寒崖百丈冰﹐尤有花枝俏 俏也不爭春﹐只把春來報 待得山花爛漫時﹐他在叢中笑﹗ ----------