会员控制台 会员登陆 会员注册 最后更新 高级搜索 会员投稿 退出登陆
设为首页
收藏本站
留言给我
  首页 | 操作系统类 | 程序设计类 | 数据库类 | 应用服务类 | 网络及硬件类 | 其他技术 | GBunix论坛
操作系统类
程序设计类
数据库类
应用服务类
网络及硬件类
其他技术
Unix中文 / 应用服务类 / WebServer / 用Linux搭建全自动的虚拟主机
用Linux搭建全自动的虚拟主机
2004-08-08          点击:
用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 </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。

最后安装完成:

#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
"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,
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认证部分基本配置完成,接下来的将是磁盘限额部分。

了解更多详情,参与讨论,请进入GBUNIX论坛

http://www.gbunix.com/bbs/index.php
责任编辑: trotter
用Linux搭建全自动的虚拟主机(二) »

相关文章
Linux系统中集群技术及其配置实例 - 08-23 11:38 am - 点击: 198
详解Linux系统集群的安装与并行计算 - 08-23 11:23 am - 点击: 305
用Linux下的LVS软件实现Linux集群 - 05-28 11:37 am - 点击: 614
简单构划 Linux 集群 - 11-23 09:17 pm - 点击: 322
基于linux的负载均衡技术 - 08-22 10:37 pm - 点击: 351
Redhat ADS 2.1集群的安装与管理 - 08-03 10:21 pm - 点击: 288
Linux下实现集群负载均衡 - 07-02 11:23 pm - 点击: 891
架设基于LINUX的服务器集群 - 07-02 11:02 pm - 点击: 580

发表评论 查看评论 加入收藏 Email给朋友 打印本文
给该文章评分
1 2 3 4 5 6 7 8 9 10
平均得分 0, 共 0 人评分
1 2 3 4 5 6 7 8 9 10
发表评论
标题:
内容:
声明:本站资讯均来自互联网,所有文章版权归原作者和出版者所有,如涉及版权问题,请来信告知!
Copyright © 2002-2004 GBunix.com. All rights reserved.