查看: 8344|回复: 13
打印 上一主题 下一主题

用Linux搭建全自动虚拟主机

[复制链接]
跳转到指定楼层
1#
发表于 2007-9-16 13:53:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
台州网址导航
一般,作为一所高校都会为各院系、部门,及老师、学生提供虚拟主机服务。一般要求有一个二级域名,能由用户自主管理,能支持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注入攻击行为的模块。更多信息请参考相关资料。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
2#
 楼主| 发表于 2007-9-16 13:53:37 | 只看该作者
台州网址导航
2.软件的下载

可将所有软件都下载到/root/vhosts/下。

(1)Apache1.3.28

#wget ftp://ftp.linuxaid.com.cn/pub/mi ... pache_1.3.28.tar.gz

(2)PHP4.3.3

#wget http://php.linuxaid.com.cn/get/p ... m/cn.php.net/mirror

(3)MySQL4.0.16

#wget http://mysql.linuxforum.net/"> http://www.mysql.com/get/Downloa ... sql.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 ... otatab-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解析权指向该服务器,然后可在其上配置域。
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
3#
 楼主| 发表于 2007-9-16 13:53:46 | 只看该作者
台州网址导航
/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
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
4#
 楼主| 发表于 2007-9-16 13:54:01 | 只看该作者
台州网址导航
(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 </usr/local/mysql/include/mysql/mysql.h>

(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。
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
5#
 楼主| 发表于 2007-9-16 13:54:15 | 只看该作者
台州网址导航
最后安装完成:

#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
<Global>
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
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
6#
 楼主| 发表于 2007-9-16 13:54:28 | 只看该作者
台州网址导航
"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
</Global>
MaxInstances 30
User ftp
Group ftp
<Directory /*>
AllowOverwrite on
</Directory>

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,
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
7#
 楼主| 发表于 2007-9-16 13:54:42 | 只看该作者
台州网址导航
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认证部分基本配置完成,接下来的将是磁盘限额部分。

9.磁盘限额配置

(1)磁盘限额配置

磁盘限额中的磁盘使用情况记录:

QuotaDirectoryTally on


磁盘限额单位 b"|"Kb"|"Mb"|"Gb":

QuotaDisplayUnits "Kb"
QuotaEngine on


磁盘限额日志记录:
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
8#
 楼主| 发表于 2007-9-16 13:54:52 | 只看该作者
台州网址导航
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中插入如下数据即可:
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
9#
 楼主| 发表于 2007-9-16 13:55:04 | 只看该作者
台州网址导航
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 [current/limit]:
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 [PID $pid] already running"
exit
fi
if [ -r $FTPD_CONF ]; then
echo "Starting proftpd..."
$FTPD_BIN -c $FTPD_CONF
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
10#
 楼主| 发表于 2007-9-16 13:55:18 | 只看该作者
台州网址导航
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文件,加上下面两句:
<ccid_nobr>
<table width="400" border="1" cellspacing="0" cellpadding="2"
bordercolorlight = "black" bordercolordark = "#FFFFFF" align="center">
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
11#
 楼主| 发表于 2007-9-16 13:55:34 | 只看该作者
台州网址导航
<tr>
    <td bgcolor="e6e6e6" class="code" style="font-size:9pt">
    <pre><ccid_code> AddType application/x-httpd-php .php .inc .class
AddType application/x-httpd-php-source .phps


并在httpd.conf文件中加入如下语句:

<IfModule mod_security.c>
     AddHandler application/x-httpd-php .php
     SecAuditEngine On
     SecAuditLog logs/audit_log
     SecFilterScanPOST On
     SecFilterEngine On
     SecFilterDefaultAction "deny,log,status:500"
     SecFilter "<(.| )+>"
</IfModule>


更多关于mod_security的配置信息请阅读参考资料。

(4)测试

#vi test.php
<?phpinfo();?>


(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


错误日志文件的位置。

下一篇:用Linux搭建全自动虚拟主机(三)
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
12#
 楼主| 发表于 2007-9-16 13:55:51 | 只看该作者
台州网址导航
用Linux搭建全自动虚拟主机(三)  
作者:王光辉 发文时间:2004.04.02
上一篇:用Linux搭建全自动虚拟主机(二)
12.Zend Optimizer的安装
解压Zend Optimizer的安装文件后进入文件夹,运行install.sh,按照提示一步一步向下做。安装时需要注意如图1所示的地方,以保证PHP的解析速度和加密代码的解析。
<IMG src=" ">
图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/DisplayLinkshttp://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
<http-server>
<!--
- The root file directory of the server. Apache users will change
- this to /usr/local/apache/htdocs and IIS users will change it
- to d:\inetpub\wwwroot
-->
<app-dir>/usr/local/apache/htdocs/</app-dir>
--默认是doc,更改为Apache的主页发布目录。
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
13#
 楼主| 发表于 2007-9-16 13:56:08 | 只看该作者
台州网址导航
<http port='8080'/>
<!--
- The srun port, read by both JVM and plugin
- 127.0.0.1 is the localhost
-->
<srun host='127.0.0.1' port='6802'/>
  

修改环境变量,在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模块。
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
14#
 楼主| 发表于 2007-9-16 13:56:22 | 只看该作者
台州网址导航
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登录,则以其申请的用户名(同时也是域名)命名的目录就已经自动建好。
至此,一个完全自动化管理的虚拟主机系统搭建完成,感兴趣的读者不妨一试。
台州维博网络(www.tzweb.com)专门运用PHP+MYSQL/ASP.NET+MSSQL技术开发网站门户平台系统等。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

网站推广
关于我们
  • 台州维博网络(Tzweb.com)拥有多年开发网站平台系统门户手机客户端等业务的成功经验。主要从事:企业网站建设、网站程序开发、手机APP客户端、平面设计、主机域名、虚拟空间、网站推广、网站优化、后期维护等服务,满足不同企业公司的需求,是台州地区领先的网络技术服务商!

Hi,扫描关注我

Copyright © 2005-2024 站长论坛 All rights reserved

Powered by 站长论坛 with TZWEB Update Techonolgy Support

快速回复 返回顶部 返回列表