LAMP - WEBHOSTING 實作全紀綠


作者: ericshei <eric.shei@msa.hinet.net>
日期: 01/11/05 17:53


由於小弟的公司希望多增加一部走linux平台的WEBHOSTING SERVER,
也因為自己前沒有實作過整個環境,在加上對linux的熟悉也是入門階段,
也因為自己一直想為study-area做一點小貢獻(因為受這個地方的幫助太多了)所以寫
出自己學習的架設的過程,希望對須要的網友有一點小小的幫助,如果
文章中有錯誤的地方,也請大家一定要用力指正小弟(?死我好了啦! ^_^).

整個實做的過程,除了自己在網路上和大家討論的資料外,另外參考了
,知城出版社所出版的Linux 網路實作經典 與 企業級網路應用,這二本
書的作者高健智老師,在市網中心上有很多他所寫的文章都很具參考價值
有興趣的朋友可以去市網中心看看 http://www.tp.edu.tw/

此篇文章,只討論平台的建立,並不著重其中各項的使用與設定,因為範圍甚廣,
且不是小弟的能力可以達成的,LINUX 、 APACHE 、 MySQL 、 PHP各完整的說明
請參考相關網站或書籍.

所謂的LAMP - WEBHOSTING就是使用LINUX + APACHE + MySQL + PHP
所建制的虛擬網頁伺服器主機以達到多個網站放置在同一部主機上的功能
,並可以使用PHP語法寫動態網頁,進而達到結合後端的MySQL資料庫,而小弟使用的平台如下:
RedHat Linux 7.1 + APACHE-1.3.19-5 + MySQL-3.23.36 + PHP-4.0
使用上面的平台,在配合FTP與PHPADMIN等軟體,可以達到不錯的功能.


首先檢查安裝的軟體是否完整:

#rpm -qa | grep "套件名稱"
利用上面的指令可以查詢該套件的版本及是否有安裝該套件,
檢查是否有安裝如下套件,如果沒有的話可皆可在光碟片中找到,
使用rpm指令安裝(想了解rpm的用法可參考http://www.study-area.org/linux/linuxfr1.htm的Linux System )

#rpm -qa | grep apache
apache-1.3.19-5

# rpm -qa | grep mysql
mysql-server-3.23.36-1
mysql-3.23.36-1
php-mysql-4.0.4pl1-9

# rpm -qa | grep php
php-imap-4.0.4pl1-9
php-4.0.4pl1-9
php-ldap-4.0.4pl1-9
php-pgsql-4.0.4pl1-9
php-mysql-4.0.4pl1-9

如果有的話表示您的PHP4、APACHE、MYSQL階安裝完成

第二測試環境

一、APACHE
可在瀏覽器上輸入HTTP://"您的IP"應可看到APACHE的預設網頁.
若沒有的話可以輸入如下指令啟動:
#/etc/rc.d/init.d/httpd start
若想每次重開機會自動起動的話請輸入:
#setup
選擇System services
在將"[ ] httpd"打上"*"號
關於APACHE可參考:
http://www.study-area.org/linux/linuxfr1.htm的Linux Servers

二、PHP4
請先編輯/etc/httpd/conf/httpd.conf確定有如下二行的設定
LoadModule php4_module modules/libphp4.so
AddModule mod_php4.c
尋找"DirectoryIndex"的設定,這裡是設定首頁檔的名稱,可加入index.php等可能會用到的php首頁名稱,如下:
DirectoryIndex index.html index.htm index.shtml index.php index.php4 index.php3 index.cgi
在來編輯/etc/httpd/conf/srm.conf這一行設定php網頁文件檔案的附檔案的名稱,如下:
AddType application/x-httpd-php .php .php3 .php4
重新啟動Apache如下:
#/etc/rc.d/init.d/htpd restart
接下來請在/var/www/html建立一個測試檔案如test.php 內容如下:
<?
phpinfo();
?>
存檔後請在瀏覽器輸如http://"您的IP"/test.php如看到PHP的版本就表示php可正常作業了. ^_^

三、MySQL
第一次使用MySQL可以輸入如下指令啟動:
#/etc/rc.d/init.d/mysqld start
若想每次重開機會自動起動的話請輸入:
#setup
選擇System services
在將"[ ] mysqld"打上"*"號

MySQL預設值,是沒有設定密碼的,所以只要在提示符號下輸入"mysql"即可.
看到提示符由"#"變為"mysql>"就可以控制資料庫了.

其實mysql指令,是以mysql這個用戶端軟體與MySQL伺服器建立連結,建立時同時傳送了
主機、帳號與密碼三個參數,語法如下:
#mysql [-h 主機] [-u 使用者] [-p密碼]

而我們之前操作並沒有輸入這些參數,是因為執行時會使用其預設值:
#mysql -h localhost -u 登入linux的系統帳號
而密碼則不傳送.

為了安全起見,我們將mysql的root帳號設定密碼,如下:
#mysqladmin -u root -p password <新的密碼>
mysqladmin則是另一個用戶端軟體.
設定完成後,往後要登入時就使用如下格式登入:
#mysql -u 使用者 -p

第三虛擬主機的建立(WEBHOSTING)

也就是可以把一個以上的網站放在部機器上
在linux上實作webhosting有二種方式
第一種為「Address-Based虛擬主機」
這種方式是用IP aliase配合DNS實作.
第二種為「Name-Based虛擬主機」
此種方式只有用一個IP ,但使用多個FQDN 對應到此IP上,再配合DNS實作.

我想大家可利用的ip並不多(我就是這一種)所以我是使用第二種方式實作出來的

步驟如下:
1.須用網域名稱才可實作,請先申請欲使用的網域名稱,目前TWNIC己不提供申請,若您還沒有網域可用,請由下列擇一申請:

協志聯合科技股份有限公司(http://reg.tisnet.net.tw)
亞太線上服務股份有限公司(http://rs.apol.com.tw/)
中華電信數據通信分公司(http://nweb.hinet.net)
網路中文資訊股份有限公司(http://www..net-chinese.com.tw)
網路家庭資訊服務股份有限公司(http://myname.pchome.com.tw)
數位聯合電信股份有限公司(http://rs.seed.net.tw)

2.我們假設您己經申請了二個網域:
aaa.com.tw與bbb.com.tw
而ip為123.123.123.123
而在裝linux時可將主機名稱,由上述網域擇一取名:
如www.aaa.com.tw或www.bbb.com.tw
到您註冊的網域公司,將您的主機名稱與ip位罝設定上去(一般要等24小時才會生?哦)
例如我的主機名稱為www.aaa.com.tw
那我在aaa.com.tw的設定就是,主機名稱www.aaa.com.tw而ip是123.123.123.123
另外在www.bbb.com.tw設定是,主機名稱www.aaa.com.tw而ip是123.123.123.123(注意是同上一個設定哦!而不是www.bbb.com.tw)
這樣在網域的解析就設定完成了,要是您有自己的dns則加在您的正解檔中即可.

3.接下來是Apache的設定:
編輯/etc/httpd/conf/httpd.conf尋找</VirtualHost>設定

<VirtualHost "您的ip">                                                                    --
ServerAdmin "網站管理者的E-mail"                                                |
DocumentRoot "網站的目錄位置"                                                    |
ServerName "填入您完整的網址"                                                    |     這樣一個區段
Options Indexes FollowSymlinks ExecCgi                                          |-->是一個虛擬
ScriptAlias /cgi-bin/ "如要用到cgi在這輸入您的cgi目錄"               |     主機的設定
TransferLog "定義虛擬主機的存取記錄檔"                                    |
Errorlog "定義虛擬主機的錯誤記錄檔"                                          |
</VirtualHost>                                                                                  --

可參考下面設定
</VirtualHost>

</IfDefine>
NameVirtualHost 123.123.123.123

<VirtualHost 123.123.123.123>
ServerAdmin admin@aaa.com.tw
DocumentRoot /home/www.aaa
ServerName www.aaa.com.tw
Options Indexes FollowSymlinks ExecCgi
ScriptAlias /cgi-bin/ "/home/www.aaa/cgi-bin/"
TransferLog /home/www.aaa/logs/access_log
Errorlog /home/www.aaa/logs/error_log
</VirtualHost>

<VirtualHost 123.123.123.123>
ServerAdmin admin@bbb.com.tw
DocumentRoot /home/bbb.com
ServerName www.bbb.com.tw
Options Indexes FollowSymlinks ExecCgi
ScriptAlias /cgi-bin/ "/home/www.bbb/cgi-bin/"
TransferLog /home/www.bbb/logs/access_log
Errorlog /home/www.bbb/logs/error_log
</VirtualHost>

設定完成請先別重新啟動Apache請繼續往下看.

3.若照著上面的設定,是將每個虛擬的網站放在家目錄下,也就是一個使用者有一個家目錄,
而一個家目錄就是一個虛擬網站.
Linux的預設值,會在每個人的家目錄下產生一些目錄與檔案,但在架站時這些東資料是用不到的,而會
產生那些資料是由/etc/skel/的目錄下來設定的,也就是skel下有那些東西,您在建帳號時,就會一並複
製到user的家目錄下,所以您可以將原本下面的東西刪除或備份起來,在第2點設定中會用到家目錄下的
logs及cgi-bin所以我們也隨便將這二個目錄建到skel下,這樣以後每建一個帳號就會自動產生logs及cgi-bin
這二個目錄.

所以我們接著用adduser指令建立使用者.
#adduser www.aaa
#adduser www.bbb
這時在重新啟動Apache (因為重新啟動Apache若找不到cgi-bin或logs目錄,會有錯誤)

4.我們可以搭配ftp讓每個網站的管理者藉由ftp維護自己的網站,請輸入如下的指令
# telnet localhost 21
 查看是否有類示如下的訊息
 Trying 127.0.0.1...
 Connected to webhosting.gus.net.tw.
 Escape character is '^]'.
 220 webhosting.gus.net.tw FTP server (Version wu-2.6.1-16) ready.
 有的話表示您的ftp有起動.
 若沒有請檢查/etc/xinetd.d/wu-ftpd
是否有如下設定disable = no
 然後重新起動xinetd如下:
#/etc/rc.d/init.d/xinetd restart
這樣ftp應該就啟動了.
往後在建立使用者時,為了不讓使用者FTP上來後還能出家目錄,請在
/etc/ftpaccess 檔案中加入如下設定﹕

guestgroup ftp

然後在將帳號加入至/etc/grpup的ftp群組中,如下:

ftp:x:50:www.aaa,www.bbb

關於ftp的設定,請參考http://www.study-area.org/linux/linuxfr1.htm

5.因為要瀏覽到家目錄以下的網頁,所以家目錄的權限應改成755如下:
#chmod 755 www.aaa
#chmod 755 www.bbb
關於權限的設定可參考http://www.study-area.org/linux/linuxfr1.htm中的”檔案權限屬性”

6.在來我們應該加入磁碟配額的設定,總不能讓每個網站的站長肆無忌憚的使用server上的空間吧! ^_^

請先停止所有人,對要設定配額的磁區做存取(應該是/home這個目錄所在的磁區)

#vi /etc/fstab

請在欲設定配額的磁區,於defaults後加入" ,usrquota "

重新啟動電腦

#sync;sync;sync;reboot

在以root權限切入到欲設定配額的磁區,執行如下指令:

#quotacheck -ugav

然後對要限制配額的使用者,以下面的格式輸入指令:
#edquota 使用者帳號

#edquota www.aaa

會執行vi出現如下的畫面

Edit block and inode quota for user ericshei:
Device /dev/sda8 (/var/spool/mail):
Used 9904KB, limits: soft=20480 hard=20480 ------>這裡是設定要限制的大小(1024=1MB)
Used 1 inodes, limits: soft=0 hard=0 ---------->這裡是設定要限制的檔案數量設定0就是不限制.

設好磁碟限制之後,並不會馬上發生作用,須執行如下指令將磁碟配額起動:

#quotaon -avug

可用如下指令檢查使用者配額的情形:

#quota -v 使用者

#quota -v www.aaa

往後要新增使用者,如不想重新設可套用其他使用者的設定值,如下:

#edquota -p 被套用者 套用者

#edquota -p www.aaa www.bbb

6.到這webhosting的建制大概完成,往後欲新增加虛擬網站,請如下設定,在將網頁上傳即可.
A.到網域申請單位,註冊您的IP及主機名稱(再次強調約24小時生?)
B.用adduser建立新帳號
C.在/etc/httpd/con/httpd.conf中加入虛擬網站設定.
D.將帳號加到/etc/grpup的ftp群組中,限制登出家目錄以外的地方.
 E.在將家目錄的權限改成755
(小弟一直希望能將B~E的設定寫成shell script檔,但自己能力不足,希望有高手願意幫忙)

關於虛擬主機的設定也可參考http://www.study-area.org/linux/linuxfr1.htm的WWW部份中的
"架設虛擬主機"

第四安裝PHPADMIN

phpadmin是一套MySQL的web控制介面,可讓使用者透過網頁就能設定MySQL資料庫,這方便於讓
網站管理者,在利用PHP做後端資料庫的結合時較為方便.
先用上述的第六小點建立一個給phpadmin用的網頁空間,如phpadmin
然後請移駕至http://phpmyadmin.sourceforge.net/download.html下載phpMyAdmin-2.2.1-php3.tar.gz
這個檔將它複製到phpadmin的家目錄下,用phpadmin這個帳號將此檔解開:
tar -zxvf phpMyAdmin-2.2.1-php3.tar.gz
解開後會出現phpMyAdmin-2.2.1將裡面的資料搬到/home/phpadmin下,在刪除phpMyAdmin-2.2.1-php3.tar.gz
檔和phpMyAdmin-2.2.1

接下來編輯/home/phpadmin/config.inc.php3
1 $cfgServers[1]['host'] = 'localhost'; // MySQL hostname
2 $cfgServers[1]['port'] = ''; // MySQL port - leave blank for default port
3 $cfgServers[1]['socket'] = ''; // Path to the socket - leave blank for default socket
4 $cfgServers[1]['connect_type'] = 'tcp'; // How to connect to MySQL server ('tcp' or 'socket')
5 $cfgServers[1]['stduser'] = '這裡輸入root'; // MySQL standard user settings (this user must have read-only
6 $cfgServers[1]['stdpass'] = '這裡輸入root的密碼'; // access to the "mysql/user" and "mysql/db" tables)
7 $cfgServers[1]['adv_auth'] = 這裡改成true; // Use advanced authentication?
8 $cfgServers[1]['user'] = 'root'; // MySQL user

還記得我們有設MySQL的root的帳號及密碼嗎?這裡要設的是MySQL的帳號及密碼(不是系統的哦!)
最後在用瀏覽器測試,輸入您的phpadmin虛擬主機網址,應該會看到詢問帳號密碼的對話框,輸入您的
root帳號及密碼?應該就可以看到phpadmin的畫面了(又方便又安全哦!).

PHPADMIN的官方網站為http://phpwizard.net/projects/phpMyAdmin/
也可參考http://www.ysps.tp.edu.tw/about/download/phpmyadmin/phpmyadmin.htm

第五php與MySQL的連結測試
接下來我們用PHPADMIN建立一個MySQL的使用者與資料庫,在用PHP寫一個網頁查詢資料庫裡的資料,如此
一來就可以知道PHP與MySQL是否可以連結了.


資料庫的設定如下:
1.進入PHPADMIN後在"建立新資料庫"下的表單欄位輸入您欲建立的資料庫名稱,然後按"建立"
假設為: try

2.在"建立新資料表於資料庫"的區段裡輸入資料表名稱及欄位數量
假設名稱為"clients"欄位數為"2",按"go"

3.接著會看到有二例的欄位設定.
"欄位"一個輸name另一個輸tel
"型態"都選"CHAR"
"長度/集合*"二個都輸20
 "屬性"二個都留白
 "Null"二個都選"not null"
剩下全部留白,點選"儲存"

4.接下來點選"新增"
在"name"欄"值"的部份,輸eric
在"tel"欄"值"的部份,輸7654321
按"儲存"
在點選"新增"
在"name"欄"值"的部份,輸roger
在"tel"欄"值"的部份,輸1234567
按"儲存"
此動作為,輸入幾筆資料,以提供查詢.

2.點選左上角的"主目錄"再點選"使用者"在"新增使用者"區段裡輸入相關資料,主機選項輸入localhost即可,然後按下面的"go"

3.點選剛建立使用者"Grants"選項
 在"加新權限"選擇我們剛建立的"try"資料庫
接著"權限"區段除了Grant、Reload、Process、Shutdown、File不選,其它皆選取,按"go"
 然後在點選左上角的"主目錄"在點選"重新載入 MySQL "在點選"登出系統"
這樣即完成資料庫這一部份的設定.

php網頁的撰寫請存成test.php內容如下:


==========================================
<html>

<head>
<meta http-equiv="Content-Language" content="zh-tw">
<meta http-equiv="Content-Type" content="text/html; charset=big5">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>新網頁1</title>
</head>

<body>
<p align="center"><font size="4" color="#FF0000">&lt;&lt;PHP+MySQL連結範例&gt;&gt;</font></p>
<hr>
<p align="center">&nbsp;</p>
<p align="center"><font size="6">查詢資料區</font></p>
<?
if($old_name){
$link_ID=mysql_connect("localhost","輸入剛才建立的帳號","輸入密碼");
mysql_select_db("輸入剛才建立的資料庫名稱如try");
$str="select * from 指定資料表名稱如clients where 指定欄位如name='$old_name';";
$result = mysql_query($str,$link_ID);
mysql_close($link_ID);
$record=mysql_fetch_row($result);
}
?>
請在下列欄位輸入資料後按下
<font color="red">查詢</font>按鈕
<br><br>
<form action="test.php" method="post">
姓名:<input type="text" name="old_name">
<input type="submit" value="查詢"
</from>
<br><hr>
<h2 align="center">查詢結果</h2>
<?
echo "姓名:";echo $record[0];
echo"<br>";
echo"電話:";echo $record[1];
?>
</form>
</body>
</html>
===============================================

最後將該檔案上傳至使用者的網頁虛擬空間做測試吧.
如www.aaa.com.tw/test.php
然後輸入eric再按"查詢"下方應該會秀出姓名稱及電話.
輸入roger也應會有相同的情形.


希望這篇文章對您有些許的幫助
整篇文章到些結束,若有任何錯誤的地方請一定指正小弟<eric.shei@msa.hinet.net>,小弟一定感激不盡!