用Linux搭建全自動虛擬主機
一般,作為一所高校都會為各院系、部門,及老師、學生提供虛擬主機服務。一般要求有一個二級域名,能由用戶自主管理,能支持PHP、JSP等動態網頁技術,並且需要給用戶一個空間限制,要求他們不能任意上傳大量文件。
對於熟悉Web的系統管理員實現以上要求並不困難:二級域名可以通過在域名系統做一個CNAME記錄,並在Apache的配置文件里為其做一個基於名稱的虛擬主機實現;自主管理可以通過給每個用戶一個FTP賬號實現;支持PHP和JSP則可以通過安裝相應模塊實現。但是問題隨之而來,每次修改完Apache的配置文件后都要重新啟動Apache;在域名系統里添加記錄后還要做ndc reload(Red Hat 9.0下為mdc reload);隨著用戶的增加,系統的httpd.conf文件變大,/etc/passwd文件里的用戶變多,這樣一個大的系統對於管理、安全來說都是災難性的。
怎麼能高效、安全、方便地管理這樣一個系統呢?筆者作為一名高校的網路管理員,經過仔細地研究和實踐,成功地利用自由軟體在Linux伺服器上實現了該系統的自動管理。一切工作都可以在Web頁面上自助完成,系統會要求身份驗證,管理員通過Web頁面核對該用戶資料是否屬實,確認后可為用戶開通服務。目前該系統運行良好。
準備工作
1.軟體的選擇
按照需求提供服務是最基本的原則。這裡提供服務的實際環境為一台DNS/Web伺服器(IBM x232),要求有固定IP。
這裡選擇Apache來提供虛擬Web服務。Apache是一個可自由使用、功能完備的Web伺服器,被廣泛地應用,許多商業Web服務軟體都採用Apache作為前端服務軟體。Apache有各種模塊供用戶選擇,基本上能滿足用戶要求,這裡使用兩個重要的非默認模塊。
考慮現在普及的方式和系統成本,採用FTP來管理文件,實現用戶的自我管理。FTP服務軟體種類很多,選擇的原則是:不能使用系統賬號,安全性高,易用性強。經典的wu-ftpd在許多Unix平台是默認的FTP服務軟體,但其使用了系統賬號,安全性較差;與Red Hat搭配的vsftpd安全性高、穩定性好,但其易用性沒有達到本系統要求。所以最後選擇了proftpd。proftpd是一個非常流行的FTP服務軟體,配置方便,並有MySQL和Quota模塊可供選擇,利用它們的完美結合可以實現非系統賬號的管理和用戶磁碟的限制。
用戶域名服務選擇Bind。可在Red Hat系統安裝時選擇Bind。
實現PHP動態網頁服務當然少不了PHP。JSP則採用Resin,沒有採用常見的Tomcat,主要是考慮Apache和Resin的結合會更好。當然,也可以選擇其它服務軟體。
最後還必須安裝MySQL軟體。安裝MySQL軟體可以在Red Hat系統安裝時進行,也可以安裝完系統后再手工安裝。這裡選擇手工編譯安裝,儘管RPM包安裝要方便很多,但手工編譯帶來的是更方便的選擇。
除以上軟體外,該系統還安裝了Zend Optimizer和mod_security。Zend Optimizer軟體不僅能提供加密代碼的執行,更關鍵的是能夠提高PHP代碼的執行效率。mod_security則是一個為了防範某些SQL注入攻擊行為的模塊。更多信息請參考相關資料。
2.軟體的下載
可將所有軟體都下載到/root/vhosts/下。
(1)Apache1.3.28
#wget ftp://ftp.linuxaid.com.cn/pub/mirrors/apache/dist/httpd/apache_1.3.28.tar.gz
(2)PHP4.3.3
#wget http://php.linuxaid.com.cn/get/php-4.3.3.tar.gz/from/cn.php.net/mirror
(3)MySQL4.0.16
#wget http://www.mysql.com/get/Downloads/MySQL-4.0/mysql-4.0.16.tar.gz/from/http://mysql.linuxforum.net/
(4)proftpd1.2.8
#wget ftp://ftp.proftpd.org/distrib/source/proftpd-1.2.8.tar.gz
(5)proftpd-mod-quotatab-1.2.7
#wget http://www.castaglia.org/proftpd/modules/proftpd-mod-quotatab-1.2.7.tar.gz
(6)Resin2.1
#wget http://www.caucho.com/download/resin-2.1.11.tar.gz
(7)Zend Optimizer
http://www.zend.com/store/getfreefile.php?pid=13&zbid=548
這裡要有一個Accept的用戶授權協議,然後才能下載。
(8)mod_security
#wget http://www.modsecurity.org/download/mod_security-1.6.tar.gz
系統安裝和配置
下面就進入具體的實現步驟。具體實現前請注意,安裝系統時要求選擇開發包,即把GCC及關聯軟體包選擇上。
1.DNS伺服器的安裝
安裝Red Hat 9.0時需選擇伺服器安裝方式,選擇域名服務,其它軟體均可不裝。安裝需要的安裝系統是安全的一個基本原則。
2.域名伺服器的配置
首先將申請域名的解析權利交給該台DNS伺服器。具體辦法是申請的時候要求把DNS解析權指向該伺服器,然後可在其上配置域。
/etc/named.conf文件配置示例如下:
options {
directory "/var/named";
};
zone "." in {
type hint;
file "named.root";
};
zone "0.0.127.in-addr.arpa" in {
type master;
file "localhost.rev";
};
zone "yourdomain.com" in {
type master;
file "yourdomain.hosts";
};
zone "176.118.202.in-addr.arpa" in {
type master;
file "176.rev";
};
域名裡面的yourdomain是配置的關鍵,將採用泛域名形式。
/var/named/yourdomain.hosts文件內容如下:
$TTL 3600
@ IN SOA hrbeu.hrbeu.edu.cn. root.mail.hrbeu.edu.cn. (
2003080812 ; serial
360000 ; refresh every 100 hours
3600 ; retry after 1 hour
4w ; expire after 4 weeks
3600 ; default ttl is 1 hours
) ; Define the nameservers and mail servers
IN NS hrbeu.hrbeu.edu.cn.
IN NS lion.hrbeu.edu.cn.
IN MX 10 mail.yourdomain.com.
; Define localhost
localhost IN A 127.0.0.1
; Define hosts in this zone
*.yourdomain.com. IN A 218.7.43.21
其中主要用的就是這個*.yourdomain.com. IN A 218.7.43.21。以後任何像abc.yourdomain.com、hello.yourdomain.com的域名都將解析到218.7.43.21。這樣就不用每開一個虛擬主機都必須在域名系統上做一個CNAME記錄,並reload域名配置文件。特別要注意的是,*.yourdomain.com.後面有一個「.」。
3.MySQL的安裝和配置
(1)添加mysql用戶和mysql組
#cd /root/vhosts/
#groupadd mysql
#useradd -g mysql mysql
(2)編譯安裝
#tar -zxvf mysql-3.23.52.tar.gz
#cd mysql-3.23.52
#./configure --prefix=/usr/loca/mysql
#make
#make install
(3)初始化資料庫,修改目錄許可權並啟動資料庫
#scripts/mysql_install_db
#chown -R root /usr/local/mysql
#chown -R mysql /usr/local/mysql/var
#chgrp -R mysql /usr/local/mysql
#cp support-files/my-medium.cnf /etc/my.cnf
#/usr/local/mysql/bin/safe_mysqld --user=mysql &
(4)設置MySQL自啟動
#cp support-files/mysql.server /etc/init.d/
#ln -s /etc/init.d/mysql.server /etc/rc3.d/S99mysqld
注意,修改mysql.server和S99mysqld為可執行。
為了方便以後進入MySQL,最好把MySQL的客戶端程序路徑加入到/etc/profile中。在該文件末尾加入export PATH=/usr/local/mysql/bin:$PATH。
到此MySQL的安裝已經完成,可以使用MySQL命令進入。注意要先退出再進入,因為已經修改/etc/profile,重新進入后才能自動搜索MySQL路徑。進入后,請注意修改MySQL的root密碼。命令如下:
#mysqladmin -u root password newpassword
注意,還應刪除自己的.bash_history文件,否則可能造成密碼泄露。
4.proftpd的安裝
(1)將proftpd的源碼包解壓縮到目錄下
#tar -zxvf proftpd-1.2.8.tar.gz
解壓縮mod_quotatab-1.2.7:
#tar -zxvf proftpd-mod-quotatab-1.2.7.tar.gz
進入mod_quotatab目錄,把mod_quotatab中的文件拷貝到proftpd的modules目錄中:
#cd mod_quotatab
#cp -Rpf * ../proftpd-1.2.8/modules
(2)在開始運行configure之前,先修改mod_sql_mysql.c文件
#cd ../proftpd-1.2.8/contrib
#vi mod_sql_mysql.c
把#include 改為實際路徑,如MySQL安裝在/usr/local/mysql下,將其修改為:
#include;
(3)配置proftpd
#cd ..
#./configure--prefix=DIR
--with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql
--with-includes=DIR
--with-libraries=DIR
需要修改的三個地方是:
◆--prefix=DIR,DIR為要安裝到的目錄名,如在本例中DIR為/usr/local/proftpd。
◆--with-includes=DIR,DIR為MySQL的includes目錄,如在本例中DIR為/usr/local/mysql/include/mysql。
◆--with-libraries=DIR,DIR為MySQL的lib目錄,如在本例中DIR為/usr/local/mysql/lib/mysql。
最後安裝完成:
#make
#make install
5.配置proftpd.conf
由於利用了MySQL,所以要在MySQL中建一個庫,並賦予一個用戶許可權。
mysql>; create database ftp;
mysql>; grant all privileges on ftp.*
to
[email protected] identified by 'test#@' with grant option;
接下來,進入安裝好的proftpd目錄,修改etc/proftpd.conf文件進行配置。基本配置講解示例:proftpd.conf。
ServerName "HRBEU's ftp server"
ServerType standalone
DefaultServer on
Port 21
Umask 022
DefaultRoot ~
SystemLog /usr/local/proftpd/logs/ftp.log
TransferLog /usr/local/proftpd/logs/ftp.transferlog
MaxLoginAttempts 30
AllowRetrieveRestart on
#for quota configure
QuotaDirectoryTally on
QuotaDisplayUnits Kb
QuotaEngine on
QuotaLog /usr/local/proftpd/logs/Quota.log
QuotaShowQuotas on
#for sql configure
;
SQLConnectInfo
[email protected]:3306 ftpuser test#@
SQLAuthTypes Backend Plaintext
SQLUserInfo FTPUSERS userid passwd uid gid home shell
SQLGroupInfo FTPGRPS groupname gid members
RequireValidShell off
SQLAuthenticate users
SQLHomedirOnDemand on
#MySQL部分配置講解見后.
SQLNamedQuery get-quota-limit SELECT "name, quota_type, per_session, limit_type,
bytes_in_avail, bytes_out_avail, bytes_xfer_avail, files_in_avail, files_out_avail,
files_xfer_avail FROM quotalimits WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery get-quota-tally SELECT "name, quota_type, bytes_in_used,
bytes_out_used, bytes_xfer_used, files_in_used, files_out_used,
files_xfer_used FROM quotatallies WHERE name = '%{0}' AND quota_type = '%{1}'"
SQLNamedQuery update-quota-tally UPDATE
"bytes_in_used = bytes_in_used + %{0}, bytes_out_used = bytes_out_used + %{1},
bytes_xfer_used = bytes_xfer_used + %{2}, files_in_used = files_in_used + %{3},
files_out_used = files_out_used + %{4},
files_xfer_used = files_xfer_used + %{5} WHERE name = '%{6}' AND quota_type = '%{7}'"
quotatallies
SQLNamedQuery insert-quota-tally INSERT "%{0}, %{1}, %{2}, %{3}, %{4}, %{5}, %{6}, %{7}
" quotatallies
QuotaLimitTable sql:/get-quota-limit
QuotaTallyTable sql:/get-quota-tally/update-quota-tally/insert-quota-tally
;
MaxInstances 30
User ftp
Group ftp
;
AllowOverwrite on
;
6.MySQL部分配置講解
資料庫連接的信息:
SQLConnectInfo
[email protected]:Port UserName Password
其中DatabaseName是資料庫名,HostName是主機名,Port是埠號,UserName是連接資料庫的用戶名,Password是密碼。
資料庫認證的類型:
SQLAuthTypes Backend Plaintext
指定用來做用戶認證的表的有關信息。「FTPUSERS」和「FTPGRPS」是數據表名字,會在後面建立。
SQLUserInfo FTPUSERS userid passwd uid gid homedir shell
SQLGroupInfo FTPGRPS groupname gid members
設置如果Shell為空時允許用戶登錄:
RequireValidShell off
資料庫的鑒別:
SQLAuthenticate users groups usersetfast groupsetfast
如果HOME目錄不存在,則系統會根據其HOME項新建一個目錄:
SQLHomedirOnDemand on
7.數據表的建立
在該資料庫中建立一個用戶表FTPUSERS,該表是必須的:
use ftp;
create table FTPUSERS (
userid TEXT NOT NULL,
passwd TEXT NOT NULL,
uid INT NOT NULL,
gid INT NOT NULL,
home TEXT,
shell TEXT
);
此表為用戶認證所需,其中userid、passwd必不可少。userid是FTP服務的用戶名;passwd是對應用戶的密碼;uid是系統用戶的id,即所映射的系統用戶;id是所屬系統組的id;home是該用戶所在的HOME目錄;shell可以為該用戶指定相應的Shell。
如果還需要組的功能,可以添加另一個表:FTPGRPS,即確定組的表格。也可不用該表,本文基本上就沒有使用到它,下面是它的格式:
create table FTPGRPS (
groupname TEXT NOT NULL,
gid SMALLINT NOT NULL,
members TEXT NOT NULL
);
其中grpname是組的名稱,gid是系統組的id,members是組的成員。注意,如果是多成員他們之間要用逗號隔開,而不能使用空格。這樣可以對一個組賦予許可權,比一個個單獨賦予更方便。
為空用戶表FTPUSERS插入記錄:
INSERT INTO FTPUSERS (userid, passwd, uid, gid, home, shell)
VALUES ('test', '88888888', '1000', '1000', '/usr/local/apache/htdocs/test', '' );
按此格式可以為用戶添加一個記錄。如果為組添加記錄,一定要注意在members欄位多個成員之間用逗號隔開,如:
INSERT INTO FTPGRPS VALUES ('Webusers', '1000', 'test,test2,test3');
8.為FTP用戶建立相應的系統用戶
本例中,為FTP服務只提供一個有效的系統用戶ftp和組ftp,用其來啟動FTP daemon,並把所有的FTP用戶映射到該用戶。
先建立ftp組:
# groupadd -g 1000 -r ftp
然後建立ftp用戶:
# useradd -u 1000 -g 1000 -d /usr/local/apache/htdocs -s /bin/bash -r ftp
為ftp用戶建立HOME,把所有的FTP user活動空間全部放置在此目錄下:
# chown ftp /usr/local/apache/htdocs
# chgrp ftp /usr/local/apache/htdocs
到這裡MySQL認證部分基本配置完成,接下來的將是磁碟限額部分。
我們在上一期介紹了利用Linux來搭建全自動虛擬主機的準備工作及系統部分軟體的安裝與配置。下面繼續講解磁碟限額的具體配置。
9.磁碟限額配置
(1)磁碟限額配置
磁碟限額中的磁碟使用情況記錄:
QuotaDirectoryTally on
磁碟限額單位 b"|"Kb"|"Mb"|"Gb":
QuotaDisplayUnits "Kb"
QuotaEngine on
磁碟限額日誌記錄:
QuotaLog /usr/local/proftpd/logs/Quota.log
打開磁碟限額信息顯示:
QuotaShowQuotas on
當登錄FTP賬戶后,使用命令「quote SITE QUOTA」可顯示當前用戶的磁碟限額。
(2)建立磁碟限額的MySQL數據表
CREATE TABLE quotalimits (
name VARCHAR(30),
quota_type ENUM("user", "group", "class", "all") NOT NULL,
per_session ENUM("false", "true") NOT NULL,
limit_type ENUM("soft", "hard") NOT NULL,
bytes_in_avail FLOAT NOT NULL,
bytes_out_avail FLOAT NOT NULL,
bytes_xfer_avail FLOAT NOT NULL,
files_in_avail INT UNSIGNED NOT NULL,
files_out_avail INT UNSIGNED NOT NULL,
files_xfer_avail INT UNSIGNED NOT NULL
);
quotalimits表中部分欄位的含義如下。
quota_type:磁碟限額的鑒別。
bytes_in_avail:上傳最大位元組數,即FTP用戶的空間容量。
bytes_out_avail:下載最大位元組數。
bytes_xfer_avail:總共可傳輸文件的最大位元組數(上傳和下載流量)。
files_in_avail:總共能上傳文件的數目。
files_out_avail:能從伺服器上下載文件的總數目。
files_xfer_avail:總共可傳輸文件的數目(上傳和下載)。
CREATE TABLE quotatallies (
name VARCHAR(30) NOT NULL,
quota_type ENUM("user", "group", "class", "all") NOT NULL,
bytes_in_used FLOAT NOT NULL,
bytes_out_used FLOAT NOT NULL,
bytes_xfer_used FLOAT NOT NULL,
files_in_used INT UNSIGNED NOT NULL,
files_out_used INT UNSIGNED NOT NULL,
files_xfer_used INT UNSIGNED NOT NULL
);
quotatallies表不需要做修改。它記錄了用戶當前的磁碟使用情況,由程序自動記錄。
(3)建立用戶並測試
開始使用磁碟限額,如對上期文章中建立的test賬號給予100MB空間,最多能上傳5000個文件到伺服器,文件傳輸流量為200M,最多只能傳輸10000個文件。只要在MySQL中插入如下數據即可:
INSERT INTO `quotalimits`
( `name` , `quota_type` , `per_session` , `limit_type` , `bytes_in_avail` ,
`bytes_out_avail` , `bytes_xfer_avail` , `files_in_avail` , `
files_out_avail` , `files_xfer_avail` )
VALUES ('test', 'user', 'false', 'soft', '102400000', '0', '20480000', '5000', '0', '10000');
不需要設置的部分可用0代替。
現在運行proftpd,登錄test,使用「quote SITE QUOTA」命令就會顯示test用戶的磁碟使用情況。
ftp>; quote SITE QUOTA
200-The current quota for this session are :
Name: test
Quota Type: User
Per Session: False
Limit Type: Soft
Uploaded Kb: 0.00/100000.00
Downloaded Kb: unlimited
Transferred Kb: 0.00/20000.00
Uploaded files: 0/5000
Downloaded files: unlimited
Transferred files: 0/10000
200 Please contact
[email protected] if these entries are inaccurate
至此,磁碟限額配置部分完成。
10.啟動和關閉proftpd腳本
#!/bin/sh
#ProFTPD files
FTPD_BIN=/usr/local/proftpd/sbin/proftpd
FTPD_CONF=/usr/local/proftpd/etc/proftpd.conf
PIDFILE=/usr/local/proftpd/var/proftpd.pid
#If PIDFILE exists, does it point to a proftpd process?
if [ -f $PIDFILE ]; then
pid=`cat $PIDFILE`
fi
if [ ! -x $FTPD_BIN ]; then
echo "$0: $FTPD_BIN: cannot execute"
exit 1
fi
case $1 in
start)
if [ -n "$pid" ]; then
echo "$0: proftpd already running"
exit
fi
if [ -r $FTPD_CONF ]; then
echo "Starting proftpd..."
$FTPD_BIN -c $FTPD_CONF
else
echo "$0: cannot start proftpd -- $FTPD_CONF missing"
fi
;;
stop)
if [ -n "$pid" ]; then
echo "Stopping proftpd..."
kill -TERM $pid
else
echo "$0: proftpd not running"
exit 1
fi
;;
restart)
if [ -n "$pid" ]; then
echo "Rehashing proftpd configuration"
kill -HUP $pid
else
echo "$0: proftpd not running"
exit 1
fi
;;
*)
echo "usage: $0 {start|stop|restart}"
exit 1
;;
esac
exit 0
11.Apache和PHP的安裝和配置
(1)解壓縮Apache和PHP安裝文件:
#tar -zxvf php-4.3.3.tar.gz
#tar -zxvf apache_1.3.28.tar.gz
#tar -zxvf mod_security-1.6.tar.gz
(2)本例中/usr/local是一個單獨分區,所以將Apache和PHP安裝到該目錄,這也是默認安裝目錄。
#cd apache.1.3.28
#./configure
#cd ../php.4.3.3
#./configure --with-mysql=/usr/local/mysql --with-apache=../apache_1.3.28
#make
#make install
#cd apache_1.3.28
#cp ../php4.3.3/libs/libphp4.a src/modules/php4/libphp4.a
#cp ../mod_security-1.6/apache1/mod_security.c src/modules/extra/
#./configure --prefix=/usr/local/apache
--activate-module=src/modules/extra/mod_security
--enable-module=security
--activate-module=src/modules/php4/libphp4.a
--enable-module=vhost_alias --enable-module=so
#make
#make install
(3)配置Apache
#cp /root/php4.3.3/php.ini-dist /usr/local/lib/php.ini
然後打開/usr/local/apache/conf/httpd.conf文件,加上下面兩句:
;
<table width="400" border="1" cellspacing="0" cellpadding="2"
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">;
;
;
;; AddType application/x-httpd-php .php .inc .class
AddType application/x-httpd-php-source .phps
並在httpd.conf文件中加入如下語句:
;
AddHandler application/x-httpd-php .php
SecAuditEngine On
SecAuditLog logs/audit_log
SecFilterScanPOST On
SecFilterEngine On
SecFilterDefaultAction "deny,log,status:500"
SecFilter "<(.|>;"
;
更多關於mod_security的配置信息請閱讀參考資料。
(4)測試
#vi test.php
;
(5)Apache的啟動配置
#cp /usr/local/apache/bin/apachectl /etc/init.d/
#ln -s /etc/init.d/apachectl /etc/rc3.d/S99apache
#ln -s /etc/init.d/apachectl /etc/rc3.d/K99apache
(6)PHP的安全配置
PHP的安全配置主要是關於php.ini文件的安全配置。基本原則是一定要正確設置如下各設置選項,否則對於伺服器的安全危害是非常嚴重的。
safe_mode=On
打開safe_mode,PHP腳本將只能訪問和自己屬主一樣的文件,如/etc/passwd等文件將不能被訪問。這是PHP安全體系裡最重要的選項之一。
register_globals=Off
對於GET、POST、Cookie、Environment、Session的變數可以直接註冊成全局變數。但是某些時候會引起安全問題。所以,自從PHP 4.2.0以來,php.ini中的該選項默認就是Off。
display_errors=Off
這樣設置后,那些利用PHP的錯誤來定位目錄等信息的攻擊將失效。
log_errors=On
打開錯誤信息記錄,可以把警告和錯誤信息記錄放到下一項定義的日誌文件里。這樣可以方便檢查程序的問題所在,也可以查看一些攻擊行為。
error_log=/usr/local/apache/logs/php_error.log
錯誤日誌文件的位置。
12.Zend Optimizer的安裝
解壓Zend Optimizer的安裝文件後進入文件夾,運行install.sh,按照提示一步一步向下做。安裝時需要注意如圖1所示的地方,以保證PHP的解析速度和加密代碼的解析。
圖1 Zend Optimizer Installation Script
13.Resin的安裝與配置
安裝Resin需要軟體j2sdk-1_4_1_03-linux-i586-rpm.bin和resin-2.1.11.tar.gz,注意加入與Apache結合的模塊。可分別從http://java.sun.com/webapps/download/DisplayLinks和http://www.caucho.com/download/index.xtp處下載。
(1)安裝jdk
#cp j2sdk-1_4_1_03-linux-i586-rpm.bin /usr/local
#chmod +x j2sdk-1_4_1_03-linux-i586-rpm.bin
#./j2sdk-1_3_1_06-linux-i586.rpm.bin
--生成RPM文件,其中會有提問,回答yes。
#rpm -ivh j2sdk-1_4_1_03-linux-i586-rpm
#ln -s /usr/java/j2sdk-1_4_1_03 /usr/local/jdk
#ln -s /usr/java/j2sdk-1_4_1_03/jre /usr/local/jre
(2)安裝resin
#cp resin-2.1.11.tar.gz /usr/local
#cd /usr/local/
#tar -zxvf resin-2.1.11.tar.gz
#cd resin-2.1.11
#./configure --with-apxs=/usr/local/apache/bin/apxs
#make
#make install
(3)Resin的配置
#cd conf
#vi resin.conf
;
;
;/usr/local/apache/htdocs/;
--默認是doc,更改為Apache的主頁發布目錄。
;
;
;
;
修改環境變數,在profile中添加如下內容:
#vi /etc/profile
PATH=$PATH:/usr/local/jdk/bin:/usr/local/jre/bin
export PATH
JAVA_HOME=/usr/local/jdk
export JAVA_HOME
CLASSPATH=/usr/local/jdk/lib:/usr/local/jre/lib:/usr/local/resin-2.1.11/lib
export CLASSPATH
(4)測試
#vi /usr/local/apache/htdocs/index.jsp
<%@page language="java">;
1+1=<%=1+1%>;
#vi /usr/local/apache/conf/httpd.conf
DirectoryIndex index.htm index.html index.php index.jsp
--添加index.jsp
#/usr/local/apache/bin/apachectl start
#/usr/local/resin-2.1.11/bin/httpd.sh
在瀏覽器中輸入地址http://yourip,頁面顯示「1+1=2」表示成功安裝。
(5)Resin的自啟動
將make install生成的$RESIN_HOME/contrib/init.resin複製到/etc/rc.d/init.d/resin:
#chmod +x resin
#cp contrib/init.resin /etc/rc.d/init.d/resin
#chmod +x /etc/rc.d/init.d/resin
#/sbin/chkconfig resin reset
如果機器速度不是很快,那麼需要加一個延遲。在/etc/init.d/resin文件第41行左右加入如下內容:
if test -n "$USER"; then
su - $USER -c "$EXE -pid $PID start $ARGS"
else
$EXE -pid $PID start $ARGS
fi
#服務啟動后,加上一個10秒的延時。
sleep 10
具體實現
通過以上步驟,已經可以在伺服器上面運行所需要的服務了。但是仍然有兩個問題沒有解決:第一是添加用戶較麻煩;第二是用戶域名還沒有和該用戶對應上。解決了這兩個問題即可實現全自動化的虛擬主機。
1.虛擬主機和域名實現
首先,應該明確目標是當用戶用域名test.yourdomain.com訪問時,會自動訪問到/usr/local/apache/vhosts/test/下面的文件。其次,應該檢查手中的工具。這裡要用到mod_vhost_alias模塊。
2.mod_vhost_alias的配置
配置前請注意把mod_alias和mod_userdir在Apache配置文件中的指令註釋掉。
例如,下面的配置將在任何情況下把/cgi-bin/script.pl映射為/usr/local/apache2/cgi-bin/script.pl:
ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
VirtualScriptAlias /never/found/%0/cgi-bin/
這裡使用的配置文件如下:
UseCanonicalName Off
ServerName www.hrbeu.net
VirtualDocumentRoot /usr/local/apache/vhosts/%1/html
VirtualScriptAlias /usr/local/apache/vhosts/%1/cgi-bin
注意前面的DocumentRoot和ScriptAlias需要被註釋掉,否則會引起mod_vhost_alias設置的重載。
本模塊中的所有指令都將字元串替換為路徑名。
%% 插入一個%。
%p 插入虛擬主機的埠號。
%N.M 插入名稱(或者名稱的一部分)。
N和M被用來指定名稱(Name)的子字元串。N為名稱中用小數點分隔的某一個部分,而M為被選中的N中的字元串。M是可選的,如果不寫M的話默認為0。當且僅當M存在時小數點必須書寫。替換操作如下:
0 整個名稱。
1 第一部分。
2 第二部分。
-1 最後一個部分。
-2 倒數第二部分。
2+ 第二個開始到最後的所有各個部分。
-2+ 倒數第二個以及之前的所有各個部分。
1+ and -1+ 等同於0(整個名稱)。
顯然前面的例子中「%1」是代表了名稱的第一部分,輸入test.hrbeu.net時,搜尋的目錄就是/usr/local/apache/vhosts/test/html。對於cgi目錄則是/usr/local/apache/vhosts/test/cgi-bin。
3.Web管理的實現
前面已經在MySQL里添加了數據,只要改為用Web方式添加數據即可實現自動管理。Apache、MySQL、PHP被譽為Web服務的最佳組合。用PHP程序完全可以實現Web申請,讓用戶提交申請的同時在資料庫里建立自己的賬號。因為採用了泛域名解析,所以其申請的用戶對應的就是他的二級域名。主頁目錄不需要再手工創建,因為前面的proftpd.conf配置中已經指明只要用戶通過FTP登錄,則以其申請的用戶名(同時也是域名)命名的目錄就已經自動建好。
至此,一個完全自動化管理的虛擬主機系統搭建完成,感興趣的讀者不妨一試。