網站製作學習誌

記錄學習製作網站的一切

在 Linux 上建構 PHP5 開發與測試環境

終於正式進入 PHP5 的領域了,而公司的正式環境是使用 Linux ,所以我也必須準備一個在 Linux 平台上的測試環境。 Neo 老大給了我一台還不錯的雙 PIII 工作站,稍作清理後我就準備用它來當做測試機了。

不過為了在這台機器建構這樣的測試平台卻花了我不少時間,看來三年多前使用 Linux 的經驗已經完全消失了 (囧rz) 。還好網路上資源非常豐富,雖然在安裝的過程中遇到不少挫折,但是總算是一一克服。接下來,我就把自己安裝的方式記錄下來,免得以後忘記。當然如果內容有錯誤的話,也請各位先進不吝指導。

註:這裡還要感謝 Neo丫凱,他們不厭其煩地教導我很多有關 Linux 的知識,減少了我許多摸索的時間。

安裝目標

以下就是我這次要安裝的平台:

  • Linux 平台 (採用 CentOS)
  • Apache 2.0.x
  • MySQL 5.0.x
  • PHP 5.2.x
  • Subversion 1.4.x
  • Trac 0.10.x

目錄配置

以下依照一些先進的經驗,加上個人的喜好,將平台中相關目錄配置如下:

原始碼存放位置 /usr/local/src
Apache 網站根目錄 /home/www/wwwroot
MySQL 數據庫位置 /var/mysql/data
MySQL 設定檔 /etc/my.cnf
PHP 設定檔 /etc/php.ini
Subversion 檔案庫根目錄 /home/svn
Trac 專案資料庫根目錄 /home/trac

建立 Linux 平台

下載 CentOS

我選擇的 Linux 平台是 CentOS ,目前其穩定的版本為 5.0 (2007-12) 。可以透過以下網址,下載 ServerDVD ISO 檔:

http://ftp.isu.edu.tw/pub/Linux/CentOS/5.0/isos/i386/CentOS-5.0-i386-bin-DVD.iso

下載回來後,我將它燒錄成 DVD 光碟以便安裝。

安裝簡述

基本上安裝步驟就是參考鳥哥的網站,而詳細的步驟就按照安裝畫面一一設定即可。但特別要注意 SELinux 要先關掉,免得到時候遇到一堆網路問題。

由於這是測試用的環境,所以其實也不用安裝太多不必要的服務。不過有兩個服務要預先安裝,那就是 vsftpd 和 sshd 。這樣後面要操作系統及存取檔案時,會比較容易一些。

另外就是 httpd 、 mysql 和 php 也都不要勾選,因為後面我們要採用 tarball 的方式來安裝。

定時校正伺服器時間

接下來要定時將伺服器的時間做校正動作,這裡要先安裝 ntp 套件:

1
# yum install ntp

安裝好後,我們要修改排程表:

1
# crontab -e

加入以下這行:

1
0 23 * * * /usr/sbin/ntpdate time.stdtime.gov.tw > /dev/null 2>&1

完成後存檔,這樣伺服器就會在每天的 23:00 根據國家時間與頻率標準實驗室的 NTP 伺服器來自動校準時間。

註:以上設定 CentOS 的步驟也可以參考學生用伺服器建置流程(CentOS 5 版),這篇教學在 CentOS 的設定上寫的比較完整。

設定 FTP 伺服器

首先要建一個 www 帳號,專門用來上傳 web 程式:

1
# useradd www

然後編輯 /etc/vsftpd/vsftpd.conf ,參考鳥哥的 vsFTPd 檔案伺服器,我將設定調整如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=000
connect_from_port_20=YES
chown_uploads=YES
chown_username=nobody
ascii_upload_enable=YES
ascii_download_enable=YES
ftpd_banner=Welcome to My FTP service.
chroot_local_user=YES
chroot_list_enable=YES
pam_service_name=vsftpd
userlist_enable=YES
userlist_deny=YES
userlist_file=/etc/vsftpd/user_list
listen=YES
tcp_wrappers=YES
use_localtime=YES

安裝編譯套件

因為後面需要編譯 Tarball 原始碼,因此這裡我們需要先把編譯所需要的相關套件用 yum 指令來安裝好:

1
2
3
4
5
6
7
8
# yum install \
gcc gcc-c++ gcc-g77 flex bison autoconf \
automake bzip2-devel zlib-devel ncurses-devel \
gd gd-devel \
libjpeg-devel libpng-devel libtiff-devel libxml2-devel freetype-devel pam-devel \
sqlite python-devel python-sqlite \
neon neon-devel db4 db4-devel \
curl curl-devel

這些套件因為較無版本問題,而且如果自行編譯會比較麻煩;因此這裡採用 yum 安裝會快一點。

小提示:以 xxx-devel 為名的,就是用來協助編譯的套件,它們通常會包含一些編譯用的表頭檔。

從 gcc 到 pam-devel 等套件是給 Apache 、 MySQL 與 PHP 編譯用的,而 Subversion 會用到的套件有 sqlite neon neon-devel db4 db4-devel ,至於 Trac 則會用到 python python-devel python-sqlite 。

編譯安裝目標套件

編譯 Tarball 可以參考鳥哥網站裡的原始碼與 Tarball 套件管理員,大致的步驟如下:

  1. 下載套件原始檔,並放到 /usr/local/src 底下。
  2. 解開套件原始檔,然後進到解開後的目錄。
  3. 設定套件相關選項。
  4. 編譯與安裝。

特別要注意設定套件相關選項時,一定要仔細考慮清楚自己所要的配置。如果有任何不清楚的地方,可以在設定前輸入以下指令來瞭解各個選項的意義:

1
# ./configure --help

編譯與安裝 MySQL 5.0.x

MySQL 5 也是要在 PHP5 之前安裝,這裡參考的是官方的安裝說明。首先要先建立執行 MySQL 時所需要的帳號:

1
2
# groupadd mysql
# useradd -g mysql mysql

然後就按照標準程序安裝:

1
2
3
4
5
6
7
8
9
# cd /usr/local/src
# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.45.tar.gz/from/http://ftp.stu.edu.tw/pub/Unix/Database/Mysql/
# tar xvzf mysql-5.0.45.tar.gz
# cd mysql-5.0.45
# ./configure \
--prefix=/usr/local \
--localstatedir=/var/mysql/data \
--enable-thread-safe-client
# make && make install

有關 configure 選項的說明如下: (參考自官方網站的 2.4.14.2. Typical configure Options)

選項 說明
–prefix=/usr/local MySQL 的安裝目錄
–localstatedir=/var/mysql/data 資料庫的存放路徑
–enable-thread-safe-client 啟用 thread safe 的用戶連結方式

註:我在參考對岸網友的安裝心得時,到最後都一直無法成功安裝預設資料庫。後來在 ./configure 中使用以上的選項後,才順利把 MySQL 安裝起來。

編譯安裝完成後,接下來要將 MySQL 設定檔複製到預設的位置:

1
# cp support-files/my-medium.cnf /etc/my.cnf

然後安裝預設的資料庫,這裡要特別注意權限的設定:

1
2
3
4
5
6
7
8
# cd /usr/local
# mkdir /var/mysql
# mkdir /var/mysql/data
<del># chown -R mysql .
# chgrp -R mysql .</del>
# bin/mysql_install_db --user=mysql
<del># chown -R root .
# chown -R mysql var</del>

安裝好預設資料庫後,我們要將 MySQL 加入伺服器的啟動服務項目裡:

1
2
3
4
# cp share/mysql/mysql.server /etc/rc.d/init.d/mysqld
# chmod 755 /etc/rc.d/init.d/mysqld
# chkconfig --add mysqld
# chkconfig mysqld on

接下來啟動 MySQL ,並設定 root 的密碼:

1
2
3
# service mysqld start
# bin/mysqladmin -u root password "password_for_root"
# service mysqld stop

編譯與安裝 Apache 2.0.x

因為後面的套件在安裝時需要夠知道 Apache 安裝的目錄,所以這裡要先安裝 Apache 。 Apache 的安裝基本上也是採用標準步驟:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# cd /usr/local/src
# wget http://apache.ntu.edu.tw/httpd/httpd-2.0.61.tar.gz
# tar zxvf httpd-2.0.61.tar.gz
# cd httpd-2.0.61 
# ./configure \
--prefix=/usr/local \
--enable-module=so \
--enable-dav=shared \
--enable-deflate=shared \
--enable-expires=shared \
--enable-rewrite=shared \
--enable-authn-dbm=shared \
--enable-authn-anon=shared \<!-- - - enable-authn-dbd=shared \ -->
--enable-auth-basic=shared \
--enable-cache \
--enable-file-cache \
--enable-mem-cache \
--enable-disk-cache \
--enable-static-support \
--enable-static-htpasswd \
--enable-static-htdigest \
--enable-static-rotatelogs \
--enable-static-logresolve \
--enable-static-htdbm \
--enable-static-ab \
--enable-static-checkgid
# make && make install

註: e-ghost 網友指出,如果 MEM 採 worker 模式會有與 PHP5 不相容的狀況發生;這時就要使用預設的 prefork 模式。

有關 configure 選項的說明如下: (參考自 Apache HTTP Server Documentation::Configure the source tree::Options)

選項 說明
–prefix=/usr/local Apache 的安裝目錄
–enable-module=so 啟用 so 模組,可以讓 Apache 支援 DSO
–enable-dav=shared 啟用 WebDAV ,Subversion 需要用到
–enable-deflate=shared 啟用網頁壓縮
–enable-expires=shared 啟用 HTTP 控制
–enable-rewrite=shared 啟用網址重寫
–enable-cache 啟用快取
–enable-file-cache 啟用檔案快取
–enable-mem-cache 啟用記憶體快取
–enable-disk-cache 啟用磁碟快取
–enable-static-support 啟用靜態支援
–enable-static-htpasswd 編譯 htpasswd - 管理採用基本認證的檔案
–enable-static-htdigest 編譯 htdigest - 管理採用摘要認證方式的檔案
–enable-static-rotatelogs 編譯 rotatelogs - 輪替 Apache 紀錄的管道日誌程序
–enable-static-logresolve 編譯 logresolve - 解析 Apache 紀錄中的 IP 地址為主機名
–enable-static-htdbm 編譯 htdbm - 操作 DBM 密碼數據庫
–enable-static-ab 編譯 ab - Apache HTTP 服務器性能測試工具
–enable-static-checkgid 編譯 checkgid
–with-mpm=worker 讓 Apache 以 worker 方式運行

接下來要將 Apache 設為伺服器的啟動服務項目,首先把 Apache 的控制程式複製成伺服器的服務項目:

1
# cp /usr/local/bin/apachectl /etc/rc.d/init.d/httpd

然後編輯這個服務項目:

1
# vi /etc/rc.d/init.d/httpd

然後在 #!/bin/sh 下面加入以下兩行:

1
2
# chkconfig: 2345 10 90
# description: Activates/Deactivates Apache Web Server

註:能讓 chkconfig 辨認出 httpd 的關鍵在是 chkconfig: 2345 10 90 這一行,第一個數字 2345 表示讓 Apache 在 2345 這四個級別都自動運行;第二個數字 10 表示程序啟動的優先級;第三個數字 90 表示程序停止的優先級。

然後就可以把 Apache 加到系統的啟動服務裡面:

1
2
# chkconfig --add httpd
# chkconfig httpd on

因為我們已經編好 Apache ,所以會得到 htpasswd 這個執行檔。我們就可以用它來建立 Subversion 與 Trac 共用的帳號:

1
# htpasswd -c /etc/project-users.db admin

建立好 admin 帳號後,再用以下指令來建立其他組員的帳號:

1
# htpasswd /etc/project-users.db username

編譯與安裝 PHP 5.2.x

PHP5 的安裝也是採用標準模式,然後也要記得將 php.ini-recommend 複製成 /etc/php.ini

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# cd /usr/local/src
# wget http://www.php.net/distributions/php-5.2.5.tar.gz
# tar zxvf php-5.2.5.tar.gz
# cd php-5.2.5
# cp php.ini-recommended /etc/php.ini
# ./configure \
--prefix=/usr/local \
--with-apxs2=/usr/local/bin/apxs \
--with-zlib \
--with-bz2 \
--with-libxml-dir \
--with-gd \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-ttf \
--with-mime-magic \
--with-mysql \
--with-mysqli \
--with-pdo-mysql \
--with-config-file-path=/etc \
--with-iconv \
--with-curl \
--disable-ipv6 \
--enable-mbstring \
--enable-ftp
# make && make install

有關 configure 選項的說明如下:

選項 說明
–prefix=/usr/local PHP 的安裝目錄
–with-apxs2=/usr/local/bin/apxs 指定 Apache2 的執行檔路徑
–with-zlib 啟用 zlib 支援
–with-bz2 啟用 bz2 支援
–with-libxml-dir 啟用 libxml 支援
–with-gd 啟用 gd2 支援
–with-freetype-dir 啟用 freetype 支援
–with-jpeg-dir 啟用 jpeg 支援
–with-png-dir 啟用 png 支援
–with-ttf 啟用 ttf 支援
–with-mime-magic 啟用 mime 支援
–with-mysql 啟用 mysql 支援
–with-mysqli 啟用 mysqli 支援
–with-pdo-mysql 啟用 pdo_mysql
–with-config-file-path=/etc 指定設定檔 php.ini 的路徑
–with-iconv 啟用 iconv 支援
–disable-ipv6 關閉 ipv6 支援
–enable-mbstring 啟用 mbstring 支援
–enable-ftp 啟用 ftp 支援

接下來要把 PHP 整合到 Apache 裡,先編輯 Apache 的設定檔:

1
# vi /usr/local/conf/httpd.conf

在最後一行或是 AddType 區段加上:

1
AddType application/x-httpd-php .php

然後要設定預設文件,一樣在 httpd.conf 中尋找:

1
DirectoryIndex index.html

加入粗體部份:

1
DirectoryIndex index.php index.htm index.html

然後修改網站根目錄,找到:

1
DocumentRoot "/usr/local/htdocs"

改為:

1
DocumentRoot "/home/www/wwwroot"

然後再找到:

1
<Directory "/usr/local/htdocs">

改成:

1
<Directory "/home/www/wwwroot">

接下來要讓 .htaccess 可以作用,在上面的 <Directory “/home/www/wwwroot”> 往下幾行可以找到:

1
AllowOverride none

將它更改為:

1
AllowOverride all

最後將 httpd.conf 存檔並退出 vi 編輯器。

編譯與安裝 SWIG 1.3.x

SWIG 是讓 Python 可以和 Subversion 溝通的橋樑,安裝方式也是採用標準步驟:

1
2
3
4
5
6
# cd /usr/local/src
# wget http://nchc.dl.sourceforge.net/sourceforge/swig/swig-1.3.31.tar.gz
# tar -xzvf swig-1.3.27.tar.gz
# cd swig-1.3.27
# ./configure
# make && make install

編譯與安裝 Subversion 1.4.x

接下來安裝 Subverion ,也是採用標準步驟:

1
2
3
4
5
6
# cd /usr/local/src
# wget http://subversion.tigris.org/downloads/subversion-1.4.5.tar.gz
# tar -zxvf subversion-1.4.5.tar.gz
# cd subversion-1.4.5
# ./configure --prefix=/usr/local --with-apxs=/usr/local/bin/apxs
# make && make install

有關 configure 選項的說明如下:

選項 說明
–prefix=/usr/local 指定 Subversion 的安裝目錄
–with-apxs=/usr/local/bin/apxs 指定 Apache2 的執行檔路徑

然後要編譯 swig-py ,讓 Python 可以找到 Subversion 。

1
2
# make swig-py && make install-swig-py
# ldconfig

最後設定 httpd.conf ,讓我們可以透過 http 來使用 Subversion :

1
2
3
4
5
6
7
8
9
10
<Location /svn>
DAV svn
SVNParentPath /home/svn
# <LimitExcept GET PROPFIND OPTIONS REPORT>
AuthType Basic
AuthName "CompanyName"
AuthUserFile "/etc/project-users.db"
Require valid-user
# </LimitExcept>
</Location>

編譯與安裝 mod_python

mod_python 是讓 Apache 可以執行 Python 的模組,採標準安裝方式:

1
2
3
4
5
6
# cd /usr/local/src
# wget http://apache.stu.edu.tw/httpd/modpython/mod_python-3.3.1.tgz
# tar xvzf mod_python-3.3.1.tgz
# cd mod_python-3.3.1
# ./configure --with-apxs=/usr/local/bin/apxs
# make && make install

安裝完成後,再安裝 Apache 的 DSO 模組:

1
2
# make install_dso
# make install_py_lib

編譯與安裝 clearsilver

Python 的 Web Template 引擎,採標準安裝方式:

1
2
3
4
5
6
# cd /usr/local/src
# wget http://www.clearsilver.net/downloads/clearsilver-0.10.3.tar.gz
# tar xvzf clearsilver-0.10.3.tar.gz
# cd clearsilver-0.10.3
# ./configure
# make && make install

如果發現有找不到 neo_cgi.so 的訊息,可以試試以下的指令:

1
# cp /usr/lib/python2.3/site-packages/site-packages/neo_cgi.so /usr/lib/python2.3/site-packages/

註:這個動作不一定要,可能是我先前裝錯了。

安裝 setuptools

這個是 Python 的套件安裝工具,照以下步驟執行即可安裝完成:

1
2
3
# cd /usr/local/src
# wget http://peak.telecommunity.com/dist/ez_setup.py
# python ez_setup.py

安裝 Trac

Trac 的安裝方式也很簡單,按照以下步驟執行即可:

1
2
3
4
5
# cd /usr/local/src
# wget http://ftp.edgewall.com/pub/trac/trac-0.10.4.tar.gz
# tar xzvf trac-0.10.4.tar.gz
# cd trac-0.10.4
# python setup.py install

為了要讓 Trac 可以辨識出 Subversion ,必須執行以下指令:

1
2
3
# ln -sf /usr/local/lib/svn-python/svn/ /usr/lib/python2.3/site-packages/svn
# ln -sf /usr/local/lib/svn-python/libsvn/ /usr/lib/python2.3/site-packages/libsvn
# ln -sf /usr/local/lib/svn-python /usr/lib/python2.3/site-packages/svn-python

接下來安裝幾個 Trac 常用的模組:

1
2
3
# easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin/
# easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.10
# easy_install http://trac-hacks.org/svn/iniadminplugin/0.10/

最後要設定 httpd.conf ,讓 Apache 可以呼叫 Trac 來執行:

1
2
3
4
5
6
7
8
9
10
11
<Location /trac>
SetHandler mod_python
SetEnv PYTHON_EGG_CACHE /tmp/python-egg # 這行重要!!沒設的話會使得 Trac Plugin 動作不正常
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir /home/trac
PythonOption TracUriRoot /trac
AuthType Basic
AuthName "CompanyName"
AuthUserFile "/etc/project-users.db"
Require valid-user
</Location>

專案設定

主要可以參考「在 Windows 上使用 Trac on Apache - 專案建置篇」,大致上只是把 Windows 的路徑改成 Linux 而已。

不過有個小地方要注意,因為 Apache 執行時是使用 nobody 權限,所以 trac.db 的寫入權限也要開放:

1
# chown -R 777 /home/trac/projectname/db/trac.db

參考文章

其實我還有一些小細節沒有記得很詳細,有需要的話,以下連結可以參考看看,當然 Google 大神也是要拜一拜的。

Comments