用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 ftpuser@localhost 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 ftp@localhost: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 DatabaseName@HostName: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 root@localhost 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登錄,則以其申請的用戶名(同時也是域名)命名的目錄就已經自動建好。 至此,一個完全自動化管理的虛擬主機系統搭建完成,感興趣的讀者不妨一試。
[火星人
]
Linux搭建自動虛擬主機 已經有933 次圍觀
本文地址: http://coctec.com/docs/service/show-post-43077.html