Linux搭建自動虛擬主機

火星人 @ 2014-03-05 , reply:0
←手機掃碼閱讀

 用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登錄,則以其申請的用戶名(同時也是域名)命名的目錄就已經自動建好。
 
  至此,一個完全自動化管理的虛擬主機系統搭建完成,感興趣的讀者不妨一試。               





[火星人 via ] Linux搭建自動虛擬主機已經有155次圍觀

http://www.coctec.com/docs/service/show-post-43077.html