网络安全 频道

FreeBSD网站平台建设全过程(中)

第三步:安装配置web服务器 

注意:在进行这步操作前建议把squid关掉,因为在进行主页更新测试时squid的cache会使更新后的主页不能及时反映出来! 
为了不使用squid,除了关掉squid外,还要删除ipfw的透明代理端口转发语句: 
# cd /usr/local/etc/rc.d 
# ./squid.sh stop 
# mv squid.sh squid.sh.bak 
# ipfw del 500 fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to any 80 

本web服务器的其本组成为 
Apache 1.3.27+modssl +mod_php4+mod_gzip+mod_fastcgi +mod_perl +mysql3.23 

为了简化安装过程并发挥FreeBSD安装软件的优势,本文后续部分将采用ports安装。Ports 使在FreeBSD下安装各种软件变得很轻松。 

首先安装ports:(如果已经有/usr/ports目录则证明已经安装过了) 
# /stand/sysinstall 
选Configure—Distributions—ports,ports将被安装在/usr/ports目录中。 

下面安装apache1.3.27+modssl 
# cd /usr/ports/www/apache13-modssl 
# make install 
系统会自动下载安装包并安装完毕。 
安装后系统会自动产生启动脚本apache.sh,在/usr/local/etc/rc.d目录中。可以通过运行apache.sh start|stop来启动或停止apache。 

安装mysql3.23: 
# cd /usr/ports/databases/mysql323-server 
# make install 
安装后产生启动脚本/usr/local/etc/rc.d/mysql-server.sh 

安装apache模块mod_php4: 
# cd /usr/ports/www/mod_php4 
首先编辑scripts目录下的configure.php文件,加入对OpenSSL的支持 
# vi scripts/configure.php 
找到下面一句 
OpenSSL "OpenSSL support" ON \ 
改成 
OpenSSL "OpenSSL support" YES \ 

# make install 
出现对话框时直接选ok继续 

安装完成后编辑apache的配制文件/usr/local/etc/apache/httpd.conf ,添加如下内容: 

# 设置默认可以使用的主页名称,这句系统一般已经有了,不用添加了 
DirectoryIndex index.php index.html 

# 这2句需要手工添加 
AddType application/x-httpd-php .php 
AddType application/x-httpd-php-source .phps 

安装其他apache常用模块mod_gzip+mod_fastcgi +mod_perl 

# cd /usr/ports/www/mod_gzip 
# make install 

# cd /usr/ports/www/mod_fastcgi 
# make install 
编辑/usr/local/etc/apache/httpd.conf文件 
添加下面一句 
AddHandler fastcgi-script fcgi fcgi fpl 

# cd /usr/ports/www/mod_perl 
# make install 

重新启动让所有软件自动运行。 

测试 
首先以root身份执行线程察看命令top,列表中应该有下面几个线程正在运行: 
PID USERNAME PRI NICE SIZE RES STATE COMMAND 
69 root 2 0 440K 296K select natd # 网络地址转换进程 
132 root 2 0 3692K 3052K select httpd # apache进程 
166 mysql 2 0 27480K 4824K poll mysqld # mysql进程 
在浏览器地址栏输入http://192.168.0.1 ,如果显示apache的欢迎页面,证明web服务器安装成功!web页面文件存放在/usr/local/www/data目录中,你可以把自己的网页拷贝到这个目录,就可以访问自己的主页了! 
键入命令 
# mysql 
出现下面显示证明mysql安装成功! 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 2 to server version: 3.23.52 

Type "help;" or "\h" for help. Type "\c" to clear the buffer. 

mysql> 
键入exit退出mysql。 

为mysql的root用户设置一个口令123456 
# mysqladmin -u root password "123456" 

现在我们来安装一个支持php+mysql的论坛。到http://www.faeryboard.com/去下载完美版的仙境论坛程序。将下载的rar压缩包解开,然后使用ftp上传到/home/ylf/app目录。 

事先备份web服务器演示页面 
# cd /usr/local/www/data 
# mkdir backup 
# mv * backup 

论坛程序拷贝到/usr/local/www/data目录 
# cd /home/ylf/app/vbb2.3.0final 
# cp –r * /usr/local/www/data 
编辑论坛配置文件 
# vi /usr/local/www/data/admin/config.php 
内容如下 
^M 
/////////////////////////////////////////////////////////////^M 
// Please note that if you get any errors when connecting, //^M 
// that you will need to email your host as we cannot tell //^M 
// you what your specific values are supposed to be //^M 
/////////////////////////////////////////////////////////////^M 
^M 
// type of database running^M 
// (only mysql is supported at the moment)^M 
$dbservertype="mysql";^M #数据库类型 
^M 
// hostname or ip of server^M 
$servername="localhost";^M #主机名 
^M 
// username and password to log onto db server^M 
$dbusername="root";^M #登录数据库用户 
$dbpassword="123456";^M #密码 
^M 
// name of database^M 
$dbname="fin230";^M #论坛所使用的数据库名称 
^M 
// technical email address - any error messages will be emailed here^M 
$technicalemail="webmaster@yoursite.com";^M #管理信息 
^M 
// use persistant connections to the database^M 
// 0 = don"t use^M 
// 1 = use^M 
$usepconnect=1;^M 
^M 
?> 
(完) 

除了root用户的密码需要添入外,其他部分可以不改。 
保存后,在浏览器地址栏输入http://192.168.0.1/admin/install.php ,根据提示一步步安装即可。 
安装成功后,在在浏览器地址栏输入http://192.168.0.1 ,就可以看到论坛了!怎么样,挺漂亮吧!关于论坛的其他问题,请仔细看论坛安装包里面的说明文档,或者到仙境论坛的主页,那里有仙境论坛的一切! 
下一节,我们要讨论关于虚拟主机的问题。 

配制虚拟主机: 
Apache的虚拟主机支持有两种方式,一是基于用户访问Apache主机时所使用的域名,另一种是通过指定IP地址来提供。这里我们只介绍如何通过不同的域名来实现虚拟主机的支持。 
要实现基于域名的虚拟主机的前提条件是必须有两个域名同时指向Apache主机的IP地址,这里我们假设这两个域名分别是www01.3322.org和www02.3322.org ,这两个域名的文档都分别放置于 /home/www01 和 /home/www02这两个目录内,同时这两个目录已经设置好权限,对于目录让所有的人都可以读取、运行,对于文件,让所有的人都可以读取。 
以下是具体的配置过程: 
首先到希网去注册2个域名。然后为这2个域名分别建立文档目录 
# mkdir /home/www01 
# mkdir /home/www02 

编辑apache的配制文件httpd.conf 
# vi /usr/local/etc/apache/httpd.conf 
在文件最后找到下面2行 
 

在2行中间添加如下内容: 
NameVirtualHost * # 指定运行虚拟主机服务的主机ip地址 
# 静态ip方式可以将*替换为你的ip地址,动态ip直接用*即可 


ServerAdmin webmaster@www01.3322.org #指定WEB管理员的邮箱 
DocumentRoot /home/www01 #指定本虚拟主机的文档目录 
ServerName www01.3322.org #指定本虚拟主机的域名 
ErrorLog /var/wwwlogs/www01.3322.org.error.log #指定错误记录应该存放于那里 
CustomLog /var/wwwlogs/www01.3322.org.log common #指定常规记录应该存放于那里 
 


ServerAdmin webmaster@www02.3322.org 
DocumentRoot /home/www02 
ServerName www02.3322.org 
ErrorLog /var/wwwlogs/www02.3322.org.error.log 
CustomLog /var/wwwlogs/www02.3322.org.log common 
 
(完) 

创建/var/wwwlogs目录 
# mkdir /var/wwwlogs 
重新启动apache 
# /usr/local/etc/rc.d/apache.sh stop 
# /usr/local/etc/rc.d/apache.sh start 
分别在/home/www01和/home/www02目录拷入不同的网页文件进行测试,注意主页名称必须是index.html或index.php 

测试 
确认注册的2个域名已经指向了你的主机ip。 
在浏览器地址栏输入域名http://www01.3322.org 和http://www02.3322.org ,如果分别显示你拷入的主页证明虚拟主机配置成功! 

利用上面的方法我们可以建立更多的虚拟主机,甚至对外提供主页空间服务! 

如果要对外提供虚拟主机服务,需要为使用者提供ftp上传功能。下一节我们将讨论如何通过Proftpd1.2.7+proftpd-mod-quotatab-1.2.4+mysql实现带有空间限额和数据库用户验证功能的ftp服务器。

第四步:安装配置ftp服务器 

本文根据网上流行的一篇文章整理改编而成,并修正了原文的一些小错误。 
由于为每一个需要使用ftp服务的用户建立系统帐户会影响系统的安全,所以我们使用数据库用户进行ftp用户验证。 
系统组成:Proftpd1.2.7+proftpd-mod-quotatab-1.2.4+mysql 
因为ports里没有proftpd-mod-quotatab-1.2.4模块,我们下载源代码安装。 
下载源代码包:(必须下载相同版本的源代码包) 
http://www.proftpd.org 或ftp://ftp.servus.at/ProFTPD/distrib/source/proftpd-1.2.7.tar.gz/。 
http://www.castaglia.org/proftpd/ 去下载proftpd-mod-quotatab-1.2.4.tar.gz。(1.2.5 版本的mod_quotatab是用在1.2.8rc1上的) 
用ftp将它们上传到/home/ylf/app目录。 
然后解压缩源代码包 
# cd /home/ylf/app 
# tar zxvf proftpd-1.2.7.tar.gz 
# tar zxvf proftpd-mod-quotatab-1.2.4.tar.gz 
进入mod-quotatab目录 
# cd mod_quotatab 
把mod_quotatab中的文件拷贝到proftpd 中的modules 目录中 
# cp * ../proftpd-1.2.7/modules 

在开始运行configure之前,我们要先改动一个文件 
进入 proftpd-1.2.7/contrib 目录 
# cd /home/ylf/app/proftpd-1.2.7/contrib 
修改 mod_sql_mysql.c 
# vi mod_sql_mysql.c 
找到#include  把他该为你实际路径,这里是: 
#include  

然后编译安装 
# cd /home/ylf/app/proftpd-1.2.7 
#./configure --prefix=/usr/local/proftpd --with-modules=mod_sql:mod_sql_mysql:mod_quotatab:mod_quotatab_sql --with-includes=/usr/local/include/mysql --with-libraries=/usr/local/lib/mysql 
# make 
# make install 

进入到proftpd配置文件所在目录 
# cd /usr/local/proftpd/etc 
备份原配置文件 
# mv proftpd.conf proftpd.conf.bak 
然后编辑新的配置文件proftpd.conf 
# vi proftpd.conf 
我的proftpd.conf内容如下: 

# This is a basic ProFTPD configuration file (rename it to 
# "proftpd.conf" for actual use. It establishes a single server 
# and a single anonymous login. It assumes that you have a user/group 
# "nobody" and "ftp" for normal operation and anon. 

ServerName "ftpx.3322.org" 
ServerType standalone 
DefaultServer on 

# 用户登陆时不显示ftp服务器版本信息 
ServerIdent off 

# Port 21 is the standard FTP port. 
Port 21 

# Umask 022 is a good standard umask to prevent new dirs and files 
# from being group and world writable. 
Umask 022 

MaxLoginAttempts 3 
TimeoutLogin 120 
TimeoutIdle 600 
TimeoutNoTransfer 900 
TimeoutStalled 3600 

MaxClients 100 

#设置每台主机最多并发连接数 
MaxClientsPerHost 3 

AllowOverwrite no 
AllowStoreRestart on 
UseReverseDNS off 

#设置如果shell为空时允许用户登录 
RequireValidShell off 

#将用户限制在自己的主目录下 
DefaultRoot ~ ftpusers 
DefaultRoot ~ FTPGRP 

# To prevent DoS attacks, set the maximum number of child processes 
# to 30. If you need to allow more than 30 concurrent connections 
# at once, simply increase this value. Note that this ONLY works 
# in standalone mode, in inetd mode you should use an inetd server 
# that allows you to limit maximum number of processes per service 
# (such as xinetd). 
MaxInstances 30 

# Set the user and group under which the server will run. 
User FTPUSR 
Group FTPGRP 

# Normally, we want files to be overwriteable. 
 
AllowOverwrite on 
 

# A basic anonymous configuration, no upload directories. 
# 匿名登录设置。匿名用户目录为/ftp 
 
User ftp 
Group ftpusers 

# We want clients to be able to login with "anonymous" as well as "ftp" 
UserAlias anonymous ftp 

# Limit the maximum number of anonymous logins 
MaxClients 10 

# We want "welcome.msg" displayed at login, and ".message" displayed 
# in each newly chdired directory. 
DisplayLogin welcome.msg 
DisplayFirstChdir .message 

# Limit WRITE everywhere in the anonymous chroot 
# 
# DenyAll 

#数据库联接的信息,FTP是数据库名,localhost是主机名,root是连接数据库的用户名,#123456是密码(如果没有密码留空) 
SQLConnectInfo FTP@localhost root 123456 

#数据库认证的类型 
SQLAuthTypes Backend Plaintext 

#指定用来做用户认证的表的有关信息。("FTPUSERS"和"FTPGRPS"是数据表名字,等一会 
#在下面建立) 
SQLUserInfo FTPUSERS userid passwd uid gid homedir shell 
SQLGroupInfo FTPGRPS groupname gid members 

#数据库的鉴别 
SQLAuthenticate users groups usersetfast groupsetfast 

#如果home目录不存在,则系统会根据它的home项新建一个目录 
SQLHomedirOnDemand on 

#启用磁盘限额 
QuotaDirectoryTally on 

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

QuotaEngine on 

#磁盘限额日志记录 
QuotaLog "/var/log" 

# 打开磁盘限额信息,当登陆FTP帐户后,使用命令 "quote SITE QUOTA" 后可显示当前用#户的磁盘限额 
QuotaShowQuotas on 

#SQL调用语句,不用修改 
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 
(完) 

下面为ftp用户建立相应的数据库和表 
进入mysql数据库命令状态: 
# mysql –p 
提示输入密码 

建立数据库FTP(注意大小写和每句话后面的“;”) 
CREATE DATABASE FTP; 

然后在这个数据库中建立一个用户表FTPUSERS,这个表是必须的: 
use FTP; 

create table FTPUSERS ( 
userid TEXT NOT NULL, 
passwd TEXT NOT NULL, 
uid INT NOT NULL, 
gid INT NOT NULL, 
homedir TEXT, 
shell TEXT 
); 

此表格是为了用户认证所需要的,其中userid、passwd是必不可少的,userid是用做FTP服务的用户名;passwd是指此用户的密码;uid是系统用户的ID,也就是所映射的系统用户;gid是所属系统组的ID;homedir是该用户所在的HOME目录;shell可以为该用户指定相应的shell。当然你可以建立更多的字段,例如:用来记录用户登录次数的count,或者是日期的date,如果你对配置熟悉了之后,你可以根据自己的喜欢添加更多的功能。在此就不多讲。 

如果需要更多的功能,可以添加另外一个需要的表:FTPGRPS,也就是确定组的表格,当然也可以不用,这里讲一个它的格式: 
create table FTPGRPS ( 
groupname TEXT NOT NULL, 
gid SMALLINT NOT NULL, 
members TEXT NOT NULL 
); 
其中groupname是组的名称,gid是系统组的ID,members是组的成员。注意:多成员,他们之间要用逗号隔开,不能使用空格。 

为FTP用户建立相应的系统用户。 
在本例中,将整个FTP服务只提供一个有效的系统用户FTPUSR和组FTPGRP,当然你也可以设置多个系统用户。但出于安全的考虑,我只设一个,用他来启动FTP daemon,并把所有的FTP用户映射过这个用户。 

先建立FTPGRP组: 
# pw groupadd FTPGRP -g 2001 
建立FTPUSR用户: 
# pw adduser FTPUSR -u 2001 -g 2001 -d /home/FTP -s /sbin/nologin 

为FTPUSR建立HOME,把所有的FTP user 活动空间全放在此目录下: 
# mkdir /home/FTP 
# chown FTPUSR /home/FTP 
# chgrp FTPGRP /home/FTP 

下面为磁盘限额建立数据表: 
# use FTP 
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 
); 

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表不需要作修改,它记录了用户当前的磁盘使用情况,由程序自动记录 
要注意的是quotalimits 表中一些字段的含意 
quota_type 磁盘限额的鉴别,可以设置单个用户,也可以设置一个组中的全部用户,还可以设置全部用户 
bytes_in_avail 上传最大字节数,就是FTP用户空间容量 (设置这个字段的时候是以byte(字节)为单位,如果要限额在10M,那就是10240000,下面也一样) 
bytes_out_avail 下载最大字节数,需要注意的是,这个字段中记录的是用户总共能从服务器上下载多少数据,数据是累计的。 
bytes_xfer_avail 总共可传输的文件的最大字节数(上传和下载流量)需要注意的是,这个字段中记录的是用户总共能传输文件的最大字节数,数据是累计的。 
files_in_avail INT 总共能上传文件的数目 
files_out_avail INT 能从服务器上下载文件的总数目 
files_xfer_avail INT 总共可传输文件的数目(上传和下载) 

测试 
首先停掉inetd的ftp服务 
# ps ax|grep inetd 
得到inetd的线程号 
# kill 得到的线程号 

启动proftpd 
# cd /usr/local/proftpd/sbin 
# ./proftpd 
如果出现错误提示可以进入proftpd的调试模式进行调试: 
# ./proftpd -n -d 5 -c /usr/local/proftpd/etc/proftpd.conf 
proftpd就会将调试信息打印到consle上以供调试之用。 

添加一个测试用户并为他设置磁盘限额 
use FTP 

添加用户 
INSERT INTO FTPUSERS (userid, passwd, uid, gid, homedir, shell) 
valueS ("user1", "999999", "2001", "2001", "/home/FTP/user1", "" ); 

设置磁盘限额 
将上面建立的user1帐号给予10M空间,最多能上传500个文件到服务器上,文件传输流量为20M,只能传输10个文件。 
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 ("user1", "user", "false", "soft", "10240000", "0", "2048000", "500", "0", "10"); 
不需要设置的部分用0代替就可以了。 

在windows提示符下登录ftp服务器。输入用户名user1,密码999999 
c:\> ftp 192.168.0.1 

运行quote SITE QUOTA显示当前用户的磁盘限额 
ftp> quote SITE QUOTA 
200-The current quota for this session are [current/limit]: 
Name: user1 
Quota Type: User 
Per Session: False 
Limit Type: Soft 
Uploaded Kb: 0.00/10000.00 
Downloaded Kb: unlimited 
Transferred Kb: 0.00/2000.00 
Uploaded files: 0/500 
Downloaded files: unlimited 
Transferred files: 0/10 
200 Please contact root@wwwx.3322.org if these entries are inaccurate 

数据库用户验证和磁盘限额测试成功! 

另:如果添加了FTPGRPS表,也可以为此添加记录,不过一定要注意在members的字段多个成员一定要用逗号隔开。 
INSERT INTO FTPGRPS valueS ("FTPGRPS", 2001, "FTPUSR"); 

关于匿名登录: 
本文的ftp服务器提供了匿名登录服务。对于匿名登录用户,我专门在硬盘上划分了一个2G的分区/ftp,所有的匿名用户文件都放在这个单独的分区里。 

添加匿名系统用户组ftpusers和匿名用户ftp 
# pw groupadd ftpusers 
# pw useradd ftp -g ftpusers -d /ftp -s /sbin/nologin 
如果ftp用户已经存在使用如下格式 
# pw usermod ftp –g ftpusers –d /ftp –s /sbin/nologin 

在/ftp下建立匿名用户目录并设置权限 
# mkdir /ftp/incoming 
# mkdir /ftp/pub 
# mkdir /ftp/bin 
# mkdir /ftp/etc 
# chown ftp /ftp/incoming 
# chgrp ftpusers /ftp/incoming 

测试 
在浏览器地址栏输入ftp://192.168.0.1 ,应该显示刚才建立的几个目录。进入incoming目录,应该可以在里面新建文件夹或文件。这样就完成对匿名ftp的测试! 

注意:由于我的这个配置文件设置了每台主机的最多并发连接数为3 
MaxClientsPerHost 3 
所以打开多个ftp登录窗口时会报错。 


建立proftpd的启动脚本 
# cd /usr/local/etc/rc.d 
# vi proftpd.sh 
内容如下: 

#!/bin/sh 

case "$1" in 

start) 
/bin/mkdir -p /var/run/proftpd 
if [ -x /usr/local/proftpd/sbin/proftpd ]; then 
/usr/local/proftpd/sbin/proftpd && echo -n " proftpd" 
fi 
;; 

stop) 
killall proftpd 
;; 
*) 
echo "$0 start | stop" 
;; 

esac 
(完) 

设置脚本可执行 
# chmod 750 proftpd.sh 

Proftpd全部安装结束后,就可以不用inetd(Internet超级服务器)了。 
编辑/etc/rc.conf文件,将inetd=”YES”改成inetd=”NO”。 
编辑/etc/inetd.conf文件,将带有ftp字样的行前面加上#号。 
这样在重新启动后,inetd将不会自动运行。 

使用本文的ftp服务器加上第三步介绍的web服务器应该可以提供比较基本的虚拟主机服务了。以上面建立的测试用户user1为例,其方法是: 
设置了数据库用户和磁盘限额后,编辑apache的配置文件/usr/local/etc/rc.d/httpd.conf,为用户配置虚拟主机并将文档目录指向/home/FTP/user1。这样user1就可以自己更新主页了。http://netadmin.77169.com/HTML/20031106203800.html

0
相关文章