流浪者家园


逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:12  资料  个人空间  短消息  加为好友  QQ

第九章 系统调校
FreeBSD 是一个高效能的操作系统,预设的系统参数已符合大多数应用的需求。然而,针对不同的系统服务及软件应用,我们可以使用系统内附的工具来进行细部的调校。
本章包含下列关于效能调校的几个主题:
如何监看系统使用情形。
何谓 sysctl,如何使用它来进行调校。
如何提高硬盘效率。
9.1 监看系统效能
在进行调校之前,我们可以先使用一些系统内附的工具来查看目前系统效能。我们之前已经介绍过 top 这个指令,它可以让我们看目前系统中所有行程的状况、CPU、内存、及虚拟内存的使用情形。这里我们介绍另一个好用的工具 systat。systat 可以用来显示网络使用情形、硬盘 I/O、CPU 等信息,可以说是最完整的系统监看工具。它的使用方法如下:systat [-display] [refresh-interval]
其中 display 为我们所要显示的信息项目,我们也可以在进入 systat 后变更显示项目,而 refresh-interval 为多久要更新一次屏幕,单位是秒。以下为可用的 display 参数:
显示模式
意义
pigs
显示目前系统中使用 CPU 最多的行程名称。如果所有行程的 CPU 使用量未满 100%,则多出来的部份显示为 IDLE。
icmp
统计目前 ICMP 封包的进出情形。
icmp6
显示 IPv6 的 ICMP 封包进出情形。
ip
显示 IP 层的封包统计及 UDP 封包信息。
ip6
和 IP 一样,但只显示 IPv6 的封包。
tcp
显示 TCP 的封包统计。
iostat
显示 I/O 状况统计,并分类为各种模式显示。
swap
显示目前各个储存空间上的虚拟内存的使用情形。
mbufs
显示 mbufs 被使用的状态。
vmstat
这是我们最常用的显示模式,它显示了最多的信息,包含 I/O、虚拟内存、mbufs、网络等信息。
netstat
显示网络的使用情形。
ifstat
显示各个网络适配卡的使用情形。
进行 systat 之后,我们可以先按冒号「:」再打上述各种显示模式来变更显示的信息,如果要离开,则先按冒号,再按 quit 即可,或者也可以直接打「:q」。
让我们来看一下 vmstat 的情形,并指定每一秒钟更新一次画面:# systat -vm 1
   4 users    Load  0.02  0.02  0.00                   6 11 13:35
Mem:KB    REAL            VIRTUAL                     VN PAGER  SWAP PAGER
        Tot   Share      Tot    Share    Free         in  out     in  out
Act   39068    4900   130008    10864   80100 count
All  182200    7440  2692520    17828         pages
                                                                Interrupts
Proc:r  p  d  s  w    Csw  Trp  Sys  Int  Sof  Flt        cow     368 total
             48       751    2  467  543   20       58304 wire    100 0: clk
                                                    66744 act         1: atkb
2.3%Sys   0.0%Intr  0.8%User  0.0%Nice 96.9%Idl    47532 inact   128 8: rtc
|    |    |    |    |    |    |    |    |    |      10760 cache    71 9: vr0
=>                                                  69340 free     69 11: vr1
                                                          daefr       12: psm
Namei         Name-cache    Dir-cache                     prcfr       13: npx
   Calls     hits    %     hits    %                      react       14: ata
                                                          pdwak       15: ata
                                          zfod            pdpgs
Disks   ad0                               ofod            intrn
KB/t   0.00                               %slo-z    35664 buf
tps       0                               tfree        54 dirtybuf
MB/s   0.00                                         17812 desiredvnodes
% busy    0                                         16909 numvnodes
                                                     8706 freevnodes
如果您对于 systat 所显示的各个字段有疑问,请 man systat。
9.2 使用 sysctl 调校
sysctl 是一个用来在系统运作中查看及调整系统参数的工具。有的 sysctl 参数只是用来回报目前的系统状况,例如回报目前已开机时间、所使用的操作系统版本、核心名称等等;而有的可以让我们修改参数以调整系统运作的行为,例如网络暂存内存的大小、最大的上线人数等等。而这些可以调整的参数中必须在一开机系统执行其它程序前就设定好,有的可以在开机完后任意调整。
首先我们可以使用下列指令来查看目前所有的 sysctl 参数及其状况:# sysctl -a | more
kern.ostype: FreeBSD
kern.osrelease: 5.2.1-RELEASE
kern.osrevision: 199506
kern.version: FreeBSD 5.2.1-RELEASE #0: Sun Apr 11 16:16:08 CST 2004
   alex@alexwang.com:/usr/src/sys/i386/compile/ALEX
kern.maxvnodes: 17812
kern.maxproc: 2020
kern.maxfiles: 4040
kern.argmax: 65536
kern.securelevel: -1
kern.hostname: alexwang.com
kern.hostid: 0
kern.clockrate: { hz = 100, tick = 10000, profhz = 1024, stathz = 128 }
kern.posix1version: 200112
kern.ngroups: 16
kern.job_control: 1
kern.saved_ids: 0
kern.boottime: { sec = 1081672724, usec = 885137 } Sun Apr 11 16:38:44 2004
kern.domainname:
kern.osreldate: 502010
kern.bootfile: /boot/kernel/kernel
kern.maxfilesperproc: 3636
kern.maxprocperuid: 1818
kern.ipc.maxsockbuf: 262144
kern.ipc.sockbuf_waste_factor: 8
kern.ipc.somaxconn: 128
kern.ipc.max_linkhdr: 16
kern.ipc.max_protohdr: 60
kern.ipc.max_hdr: 76
kern.ipc.max_datalen: 132
kern.ipc.nmbclusters: 9024
………略………
我们也可以使用 sysctl 显示单一的参数值,例如:# sysctl kern.ipc.maxsockbuf
kern.ipc.maxsockbuf: 262144
并非所有的参数都可以使用 sysctl 进行调整,而且有的参数对于效能的影响并不大。我们仅在此说明一些影响较明显的设定。
9.2.1 kern.ipc.maxsockets
这是用来设定系统最大可以开启的 socket 数目。如果您的服务器会提供大量的 FTP 服务,而且常快速的传输一些小档案,您也许会发现常传输到一半就中断。因为 FTP 在传输档案时,每一个档案都必须开启一个 socket 来传输,但关闭 socket 需要一段时间,如果传输速度很快,而档案又多,则同一时间所开启的 socket 会超过原本系统所许可的值,这时我们就必须把这个值调大一点。除了 FTP 外,也许有其它网络程序也会有这种问题。
然而,这个值必须在系统一开机就设定好,所以如果要修改这项设定,我们必须修改 /boot/loader.conf 才行。例如,我们要将它改成最多同时可以有 16424 个 socket,则必须在 /boot/loader.conf 中加入下列这一行:
kern.ipc.maxsockets="16424"
9.2.2 net.inet.ip.portrange.*
net.inet.ip.portrange.* 是用来控制 TCP 及 UDP 所使用的 port 范围,这个范围被分成三个部份,低范围、预设范围、及高范围。让我们看一下目前各范围 port 的情形:# sysctl -a|grep portrange
net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 1024
net.inet.ip.portrange.last: 5000
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535
一般的网络程序都会用到预设范围的 port,然而,这个预设范围只从 1024 到 5000,这对于一台忙碌的 FTP server 或 proxy server 可能会有不足的情形。所以我们可以手动调整一下 net.inet.ip.portrange.last 这个值,将它调为 10000、20000、甚至 40000 都是合理的。如果要在一开机就调整这个值,我们可以修改 /etc/sysctl.conf,并增加下列这一行:
net.inet.ip.portrange.last=40000
9.2.3 kern.ipc.shm_use_phys
kern.ipc.shm_use_phys 这个选项预设为 0 (关闭),我们可以将它设为 1 (打开)。如果我们将它设成 1,则所有 System V 共享内存 (share memory,一种程序间沟通的方式)部份都会被留在实体的内存 (physical memory) 中,而不会被放到硬盘上的 swap 空间。我们知道物理内存的存取速度比硬盘快许多,而当物理内存空间不足时,部份数据会被放到虚拟的内存上,从物理内存和虚拟内存之间移转的动作就叫作 swap。如果时常做 swap 的动作,则需要一直对硬盘作 I/O,速度会很慢。因此,如果我们有大量的程序 (数百个) 需要共同分享一个小的共享内存空间,或者是共享内存空间很大时,我们可以将这个值打开。
这个值可以在开机完成后才设定,因此只要放在 /etc/sysctl.conf 中即可:
kern.ipc.shm_use_phys=1
9.2.4 vfs.vmiodirenable
这个选项预设被设为 1,也就是打开的状态。它被用来决定一个目录中的结构 (目录下的其它文件名称等等) 被快取在内存中的行为。一般的目录结构可能都不大,而这些目录结构会被快取在物理内存中。物理内存中所存放的目录结构快取有限,所以不管我们的物理内存有多大,预设都只会快取一定大小的目录结构。如果我们将这个选项打开,系统将 buffer cache 放在虚拟内存的快取中,目录结构也就会被存放在虚拟内存中。这样的好处是所有的内存空间都可以被拿来做目录的快取,而缺点是最小用来存放目录结构的快取会从 512 bytes 变成 4K。
如果您的系统物理内存空间有限,建议您将这个选项关闭。但如果您的系统需要进行大量档案操作,例如 proxy、多人使用的邮件服务器、或是 news server 等,建议将这个选项打开。
9.2.5 vfs.write_behind
这个选项预设为 1,也就是打开的状态。在打开时,在系统需要写入数据在硬盘或其它储存设备上时,它会等到收集了一个 cluster 单位的数据后再一次写入,否则会在一个暂存区空间有写入需求时就立即写到硬盘上。这个选项打开时,对于一个大档案写入速度非常有帮助。但如果您遇到有很多行程延滞在等待写入动作时,您可能必须关闭这个功能。
9.2.6 vfs.hirunningspace
这个值决定了系统可以将多少数据放在写入储存设备的等候区。通常使用默认值即可,但当我们有多颗硬盘时,我们可以将它调大为 4MB 或 5MB。但必须注意的是,太大的值反而会造成效能低落。
9.2.7 net.inet.tcp.sendspace 及 net.inet.tcp.recvspace
这二个选项分别控制了网络 TCP 联机所使用的传送及接收暂存区的大小。预设的传送暂存区为 32K,而接收暂存区为 64K。如果需要加速 TCP 的传输,可以将这二个值调大一点,但缺点是太大的值会造成系统核心占用太多的内存。如果我们的机器会同时服务数百或数千个网络联机,那么这二个选项最好维持默认值,否则会造成系统核心内存不足。但如果我们使用的是 gigabite 的网络,将这二个值调大会有明显效能的提升。传送及接收的暂存区大小可以分开调整,例如,假设我们的系统主要做为网页服务器,我们可以将接收的暂存区调小一点,并将传送的暂存区调大,如此一来,我们就可以避免占去太多的核心内存空间。
还有要注意的是,除了这二个选项可以控制网络传输暂存区大小外,route 这个指令也可以用来依路由路径的不同指定暂存区大小。另外 ipfw 等防火墙软件也可以用来限制每个联机所能使用的网络频宽。
如果我们将传送或接收的暂存区设为大于 65535,除非我们的服务器本身及客户端所使用的操作系统支持 TCP 协议的 windows scaling extension (请参考 RFC 1323 文件)。FreeBSD 预设已支援 rfs1323 (即 sysctl 的 net.inet.tcp.rfc1323 选项)。
9.2.8 net.inet.tcp.always_keepalive
当这个选项打开时,系统会定期送出「keepalives」以检查一个 TCP 联机是否中断。在打开的状况下,所有运作的网络程序都会有定时检查联机是否中断的功能,否则只有当应用程序本身支持时才有此功能。这个选项打开的好处是让系统更便于管理网络联机,尤其是当我们系统中常有一些莫名其妙就中断联机的使用者时。例如,当一个使用者利用拨接连到系统时,很可能在完成一个完整的 TCP 联机之前,就因为拨接中断而造成联机异常中断。当然,在某些情况下,也有可能会造成系统误判网络联机已中断而结束这个 TCP 联机。
9.2.9 net.inet.tcp.delayed_ack
TCP 协议有一个特性,就是当收到客户端的数据时,会传回一个 ACK (acknowledgement) 的封包,以确认已收到数据。然而,我们也可以将 ACK 封包和所要回传的资料一起送出。例如,当我使用 telnet 进入系统时,在输入指定时,当我们在键盘上敲打一个字符,系统会送回一个表示已接收到该字符的 ACK 封包,并传回一个含有该字符的封包以在终端机上显示。当 net.inet.tcp.delayed_ack 打开时,系统会将 ACK 和显示该字符的封包一传送,而不需分成二个封包。所以这个选项打开时,可以将封包数量减少一半,以加速网络传输。其它的网络服务,例如,WWW、SMTP、POP3 等也都具有这种特性。
9.2.10 kern.ipc.somaxconn
这个选项控制了 TCP 联机等候区最多可以等待的联机数量,其默认值为 128,不过这个值对于一台忙碌的服务器而言可能小了点。例如大型的网页服务器、邮件服务器,我们可以将它设为 1024。要注意的是在一些网络服务的程序中,如 Apache 及 sendmail 也有自己的等待数量设定,我们可能也要在那些软件上做一些设定才会让 kern.ipc.somaxconn 发生作用。将这个选项的值调大一点还有一个好处,就是在面对 Denial of service 的攻击时,有较好的防卫能力。
9.2.11 kern.maxfiles
这个选项控制了系统中支持最多开启的档案数量,这个值通常是几千个档,但对于一台忙碌的数据库系统或是会开启许多档案的服务器而言,我们可以将它调高为一、二万。
9.2.12 kern.maxusers
这是用来控制系统内部表格(internal system tables)大小的参数,它的值大约是您期望系统同一时间会上线使用的使用者数量。我们在核心设定档中有一个 maxusers 的选项,如果您使用的是 FreeBSD 4.5 以上的版本,建议您只要在核心设定档中将它 0 即可,系统会在一开机时自动依您的内存大小调整这个值。如果我们使用的是 FreeBSD 4.5 以后的版本,要调整这个值时,我们可以在 /boot/loader.conf 中加入该选项的设定,例如:
kern.maxusers=256
如果您使用 FreeBSD 4.4 以前的版本,则只能重新编译核心以改变这项设定。
这个值一定要设定大于四,maxusers 的值决定了处理程序所容许的最大值,20+16*maxusers 就是你将得到的所容许处理程序。系统一开机就必须要有 18 个处理程序 (process),即便是简单的执行指令 man 又会产生 9 个 process,所以将这个值设为 64 应该是一个合理的数目。如果你的系统会出现 proc table full 的讯息的话,可以就把它设大一点,例如 128。除非您的系统会需要同时开启很多档案,否则请不要设定超过 256。
9.2.13 kern.ipc.nmbclusters
这个值用来调整系统在开机后所要分配给网络 mbufs 的 cluster 数量,由于每个 cluster 大小为 2K,所以当这个值为 1024 时,也是会用到 2MB 的核心内存空间。我们可以简单的估计出大约需要的大小,例如,假设我们的网页同时约有 1000 个联机,而 TCP 传送及接收的暂存区大小都是 16K,则最糟的情况下,我们会需要 (16K+16K) * 1024,也就是 32MB 的空间,然而所需的 mbufs 大概是这个空间的二倍,也就是 64MB,所以所需的 cluster 数量为 64MB/2K,也就是 32768。对于内存有限的机器,建议值是 1024 到 4096 之间,而当拥有海量存储器空间时,我们可以将它设定为 4096 到 32768 之间。我们可以使用 netstat 这个指令并加上参数 -m 来查看目前所使用的 mbufs 数量。
当我们要修改这个值是,必须在一开机就修改,所以只能在 /boot/loader.conf 中加入修改的设定,例如:
kern.ipc.nmbclusters=16384
9.2.14 hw.ata.wc
这个选项用来打开 IDE 硬盘快取。当打开时,如果有数据要写入硬盘时,硬盘会假装已完成写入,并将数据快取起来。这种作法会加速硬盘的存取速度,但当系统异常关机时,比较容易造成数据遗失。不过由于关闭这个功能所带来的速度差异实在太大,建议您还是保留原本打开的状态吧。
9.3 调整硬盘参数
磁盘空间的配置对于系统效能影响很大,当我们在分割磁盘时,应该分割一个小型的空间给根目录,接着再分割一个空间给 swap,让这二个空间放在硬盘最外圈,以加速存取速度。最后再慢慢的分割其它的空间,并将最大的空间放到最后。例如,我们在建立磁盘空间时,可以依序建立以下的空间:/ (256MB)、Swap (512MB)、/tmp (512MB)、/var (256MB)、/usr (4GB)、/home (25GB),让最大的空间放到最后。
在分割硬盘时,我们可以依我们所提供的服务来决定各个分割区的大小。将整个硬盘只分割一个大的 / 分割区往往不一个好主意。首先,对于主要作为读取用途的目录和以写入为主的目录最好分开为不同的分割区,如此一来,我们可以针对这些不同用途的分割区进行调校。例如,/var 及 /var/tmp 常会被写入数据,而 /usr 通常只用来读取,在分割磁盘时,我们将最常写入的 /var、/var/tmp 放在最大的磁盘分割区 /home 之前,将有助于速度的提升。另外,我们将 / 独立分割成一个只会做读取动作的空间,在异常关机时,磁盘空间也比较不会损毁。分割成多个磁盘空间可以让我们使用 newfs 或 tunefs 等工具来进行调效,这也是只分割一个单一的空间所做不到的事。
FreeBSD 的档案系统在 block size 为 8K 或 16K 时有最好的表现,而使用 newfs 进行格式化时,预设的 block size 为 16K。然而,当我们的服务器是做为数据库用途时,由于数据库的存取是随机存取,所以在 block size 为 8K 时会有比较好的表现。如果我们将 block size 设为 16K 以上,比较容易造成空间浪费及空间破碎的问题,进而造成效能低落。
当我们的分割区主要存放大量小型档案时,例如 BBS 或 news server,我们会将 block size 调小一点,如 8K 或是 4K。而在 newfs 时,我们也会指定 fragment size,它的值最好是 block size 的八分之一,例如当 block size 为 8K 时,我们会使用 newfs -b 8192 -f 1024 来格式化硬盘。如果您使用的是 /stand/sysinstall 来分割硬盘,您可以在分割硬盘时按 N 来设定 newfs option。
当我们的分割区主要用来存放少量大文件时,例如数据库,我们可以使用 newfs 参数 -i 设定 inode 所占空间大一点以减少 inode 的数量 (也就是可以建立的档案及目录数量),让系统在不正常关机后,开机时进行 fsck 时可以快一点。不过在修改 inode 数量时要注意,否则您可能会遇到硬盘空间明明未满却无法新增档案的窘境。若要使用大型的 inode,FreeBSD 建议的 inode 大小为 32768、65536、或 262144,再大的话只会降低效能。
我们在使用 /stand/sysinstall 新增一个分割区时,您会发现在 Newfs 字段中,除了 / 及 swap 外,其它的分割区 newfs 字段都有一个 UFS2+S 的设定,如图 9-1 所示:
图 9-1

您所看到的 S 表示使用 Soft Updates。Soft Updates 可以用来加速系统写入档案及目录的系统数据,对于新增及删除档案的速度有明显的提升。Soft Updates 可以让我们在写入资料时保有完整性,在面临系统不正常关机时,能让所写入的数据尽量完整。而其缺点是在删除或更新档案时,硬盘空间的释放较慢,这个缺点在于一个快要满的分割区中比较明显。例如,当我们的 / 目录快满时,我们更新该分割区的数据时,可能会因为分割区在删除数据后空间释放较慢而使空间不足而失败,进而造成某些档案无法使用。所以 FreeBSD 预设并未在 / 目录中使用 Soft Updates。
Soft Update 除了可以在格式化硬盘时就将它启动外,FreeBSD 有一个用来调整硬盘参数的指令 tunefs 可以在分割完硬盘后启用 Soft Updates。不过 tunefs 只能在该储存空间尚未被挂入前使用,所以如果您要使用 tunefs,只能在单人模式下使用。
9.4 虚拟内存管理
如果您的内存很小,或者是您会跑一些需要用到海量存储器的程序时,您可能常常使用到虚拟内存 (swap partition)。当我们在分割 Swap 空间时,它的大小最少必须是物理内存的2.5 倍。例如,当我们有 128 MB RAM 时,最小应该要有 384MB 的 Swap。因为 FreeBSD 核心对于虚拟内存的管理上,当 Swap 有物理内存二倍以上时有最佳的效能。现在的内存价格都不高,建议您最好让内存大一点以免使用到硬盘做为虚拟内存。如果一定会用到虚拟内存,太小的 swap 空间会造成效能低落,即使您不必用到那么大的空间,因为目前硬盘都很大,建议您还是将它的值调大一点。另外,当我们有多颗硬盘时,建议将 Swap 空间分别存放在每一个硬盘上,而且每颗硬盘上的 Swap 空间大小要一致,虽然大小不一致时,FreeBSD 还是可以处理,但效能会差很多。

顶部
逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:13  资料  个人空间  短消息  加为好友  QQ

第十章 软件安装
安装了 FreeBSD 后,您一定还会需要安装其它非 FreeBSD 内附的软件。在 FreeBSD 上安装软件有许多种方法,我们将一一为各位介绍。
本章包含了下列软件安装必备的课题:
各种安装方式的优缺点。
如何使用 package。
如何使用 port。
如何使用传统安装方法自行编译软件。
10.1 概论
传统上,要在一个 UNIX 系统上安装其它软件时,有几个步骤:
下载该软件,有可能是 binary 档或是原始码。
解压缩该档案,通常是以 tar 或 gzip 压缩的。
读一下该目录中的说明文件,可能是 readme 或是 doc/ 的文件,来了解如何安装该软件。
如果所下载的是原始码,可能要先编辑一下 Makefile 或是执行 configure,接着再编译该软件。
最后再测试与安装。
当然,我们可以在 FreeBSD 上使用传统的方式来安装软件,但是还有更简单的选择。FreeBSD提供了 package 和 ports 这二种简单的安装软件方式。
所谓的 pakcage 是别人帮你将程序编译成 binary 文件,并定义了该安装在什么地方。我们只要下载一个压缩档,并使用 pkg_add 这个指令就可以快速的将软件安装在 FreeBSD 上。这是安装软件最简单的步骤,所安装的东西也是最标准的,和自己依需求修改并编译原始码比较起来较缺乏弹性。
而 port 就是使用原始码来安装软件。我们只要进入 /usr/ports/ 里想要安装的软件目录中,打指令 make install 就可以完成安装了。FreeBSD 己经帮我们定义了安装该软件所须的步骤、所要求的其它套件。不管是 package 或是 ports,当安装的软件需要依靠其它软件才能继续安装时,它们会自动帮你安装该软件。所有安装好的软件都将记录在 /var/db/pkg 中,日后如果我们想要移除软件时,可以用一个简单的指令 pkg_delete 加上软件名称就可以了。
即然 port 这么好用,为什么 FreeBSD 要同时有 package 和 ports 呢?我们来比较一下 ports 和 package 的优点:
package 的优点:
一个己经编译过的压缩档通常比包含原始码的档案还要小。
使用 pakcage 并不需要再做任何的编译动作,如果你的计算机速度很慢,在安装像 KDE、GNOME 等大型软件时,不用编译可以省下很多时间。
使用 package 来安装软件时,你不必事先了解在 FreeBSD 上编译时所使用的软件及其过程。
ports 的优点:
package 为了要在多数的计算机执行,考虑兼容性问题,通常编译的比较保守。而使用 ports 你可以依自己的系统修改,例如选择使用 Pentium III 或是 Athlon 的处理器。
在编译 package 时,就已经限制了该软件的功能,无法再依自己需求扩充。例如 Apache 这套软件就有许多的功能可以在编译时挂进来,使用 ports 来安装时,你可以依自己的需求来加以修改。
我们可以经由更新 Port Tree 来使用较新的软件,而 package 通常只和系统一起 release。
有些软件不允许使用 binary 文件的方式散播,只能下载原始码。
有了原始码,你可以自己修改并加以应用。
有的人喜欢拥有原始码,他们可以读它、从中学习。
接着我们就针对 package 及 ports 来说明它们的使用方式。   
10.2 使用 package
10.2.1 安装 Package
安装package 有二种方式,第一种是使用 sysinstall (也就是我们安装 FreeBSD 时所看到的画面) 来安装,另一种是使用手动安装。使用 sysinstall 安装时,我们必需选择安装的来源,最常使用的来源是网络及光盘片。但是由于光盘片容量有限,所以在 FreeBSD 安装光盘中所含的 package 软件数量并不多,因此我通常都选择使用网络安装。而使用手动安装必须自行抓回所需的档案,并以指令安装。以下我们就分别针对这二种方式来说明:
方式一:使用 sysinstall
假设我们要安装在 FreeBSD 上收信的软件 pine,首先我们要执行 sysinstall 以进入安装时的画面:# sysinstall
图 10-1

接着选取 Configure选项,进入图 10-2 的画面:
图 10-2

我们选 Packages 选项来安装 package:
图 10-3

在图 10-3 中,我们必须选择安装来源,在这里我们选择 FTP ,从 FTP 中我们可以找到较多的软件。选择了 FTP 之后,将出现图 10-4 的画面,让我们选择要使用哪一个 FTP 站台:
图 10-4

我们选择「URL」来自订要使用的 FTP 站台。接着便会出现一个要求我们输入站台地址的窗口,如图 10-5 所示,假设我们要使用交大资工的站台,则输入 freebsd.csie.nctu.edu.tw/pub/releases/i386/:
图 10-5

输入站台后,会问您是否要使用目前的网络设定。如果我们己经连上网络,则选 YES,否则请选 NO 来设定网络。接着会出现一个软件分类选单,这一份分类选单将各个软件分门别类放在不同的选项下,其中 All 是所有软件的所在,如图 10-6。
图 10-6

我们以安装邮件软件 pine 为例,由于 pine 位于 mail 分类下,所以我们选择mail。如果您要安装中文版本的 pine ,应该选择 Chinese 选项而非 mail。选择了 mail 之后,将出现 mail 分类下的所有软件,我们选 pine-4.58 这一项,如图 10-7:
图 10-7

选了pine 之后,就可以选 OK 回到前一个分类画面,接着按照这种方式选了其它我们要安装的软件之后,就可以选「Install」来安装了。选了 Install 之后,将出现所有我们已选取的软件列表,如图 10-8,如果要继续安装则选 OK 即可。
图 10-8

方式二:使用手动安装
如果以手动的方式安装,我们必须先取回所要安装的package。只要是 package ,它的扩展名就是 .tgz。我们可以用 pkg_add 这个指令来安装它。下面是一个简单的范例,使用 package 来安装 lsof-4.66.1.tgz:# ftp -a freebsd.csie.nctu.edu.tw
Connected to freebsd.csie.nctu.edu.tw.
220---------- Welcome to Pure-FTPd ----------
220-You are user number 139 of 200 allowed.
220-Local time is now 17:49. Server port: 21.
220-Only anonymous FTP is allowed here
220-IPv6 connections are also welcome on this server.
220 You will be disconnected after 15 minutes of inactivity.
331 Any password will work
230 Any password will work
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /pub/FreeBSD/ports/packages/sysutils/
250 CWD command successful.
ftp> get lsof-4.71.tgz
local: lsof-4.71.tgz remote: lsof-4.71.tgz
227 Entering Passive Mode (140,113,17,209,189,16)
150-Accepted data connection
150 96.1 kbytes to download
100% |*********************************************************| 98372 136.87 KB/s 00:00 ETA
226-File successfully transferred
226 0.362 seconds (measured here), 265.35 Kbytes per second
98372 bytes received in 00:00 (136.70 KB/s)
ftp> bye
221-Goodbye. You uploaded 0 and downloaded 97 kbytes.
221 Logout.
# pkg_add lsof-4.71.tgz
要使用 package 安装软件,首先必须取得想要安装的软件。我们可以先 ftp 到各大学 FTP 站台去取得。packaeg 的副档案是 .tgz,可以在各 FTP 站台的 ports/packages 中取得。以交大资工的 FTP 站而言是放在 ftp://freebsd.csie.nctu.edu.tw/pub/ports/packages ;而中央资工的 FTP 是放在 ftp://freebsd.csie.ncu.edu.tw/FreeBSD/ports/packages 。当进入 ports 的目录后,我们会发现还有一堆目录,您可以依您的系统版本选择要使用哪一个目录,其中 packages 这个目录包含了最新的 packages。如果您想要使用 packages-5.4-release 的 packages,我们就可以选择进入 packages-5.4-release 这个目录。进入这个目录后,又有一堆目录,这里的目录结构和你系统中 /usr/ports/ 下的目录一样,每个目录都是软件的分类,而 All 这个目录是所有软件。
如果您只知道想要安装的软件名称,却不知道版本及完整的档名,例如您要下载 popa3d 这个软件,但不知道是哪一版的,你可以先进入 All 的目录下,再以下列方式查询:ftp> ls popa3d*
227 Entering Passive Mode (140,113,209,200,159,54)
150 Opening ASCII mode data connection for /bin/ls.
-r--r--r-- 1 FTP CSIE 19007 Nov 11 12:43 popa3d-0.6.4.1.tgz
226 Transfer complete.
ftp> get popa3d-0.6.4.1.tgz
找到了想要下载的版本是 0.6.4.1,接着就以 get 指令去取回该软件,最后下 exit 离开。
接着你就可以使用 pkg_add popa3d-0.6.4.1.tgz 来安装该软件。
10.2.2 管理 Package
如果我们后悔了,想要移除之前安装过的软件,可以下指令 pkg_delete popa3d-0.6.4.1 来移除 popa3d-0.6.4.1 这套软件,所有我们安装过的软件都会记录在 /var/db/pkg 的目录中。
我们可以使用 pkg_info 这个指令来得到软件的信息。例如在我们下载完一个 package 后,你想要知道这个软件的信息,以 popa3d-0.6.4.1.tgz 而言,如果我们想知道它的信息,你使用下列指令来取得:# pkg_info popa3d-0.6.4.1.tgz
您也可以只打 pkg_info 来得知所有你安装过的软件有哪些。
10.3 使用 ports
如果你要使用 ports 安装软件,你必须先确认 /usr/ports 这个目录是否有安装。如果没有的话,使用 /stand/sysinstall 来安装 ports 的目录:
以 root 执行 /stand/sysinstall
选择 Configure 后按 Enter
选择 Distributions 后按 Enter
选择 ports 后按空格键
选择 Exit 后按 Enter
选择你要从 CDROM 或 FTP 安装等
跟着选单照做,最后离开 sysinstall
或者我们也可以到 http://www.freebsd.org/ports/ 去手动抓回 port.tar.gz 这个档案,将它放在 /usr/ 下。并以下列指令来安装:# cd /usr
# tar zxvf port.tar.gz
现在可以进入 /usr/ports 的目录中,安装软件了。
通常每一个软件都有一个独立的目录,而目录中都存在着一些档案,每个档案都有其特定用途,我们简列如下:
Makefile
安装软件的编译设定,您可以修改这个档案来设定我们在编译及安装软件时的参数。
README.html
我们可以经由浏览 README.html 来查看所有 ports 目录下的软件说明。
distinfo
说明安装所需要的档案及其 MD5 的检查数据。
pkg-comment
简单的软件描述。
pkg-descr
较详细的描述,我们通常可以在里面找到该软件网页的位置,使我们能到该网页得到更多信息。
pkg-plist
列出软件将安装的清单,安装后会放在硬盘中的什么地方。
如果您想安装某一个软件,却不知道它的目录位置,您可以使用 whereis 这个指令来找出它来。例如我们想安装 qpopper ,可以使用 whereis qpopper 来找出它所在的目录。 或者果我们只知道某个程序的关键词,确不知道它放在哪个目录,我们可以使用下列指令:# cd /usr/ports
# make search key='关键词'
进入该目录后,最简单的安装方式是直接打 make install,系统就会自动去网络上抓取需要的软件回来安装。安装 ports 时,make 时找档案的顺序是:先去 /usr/ports/distfiles 、再去找 /cdrom/ports/distfiles、最后是网络中下载。如果您不使用网络安装的话,您可以自己去抓回软件,并将它放在 /usr/ports/distfiles/ 下,这样子在我们打 make install 时,就不会去网络上抓取档案。如果您所需档案存在光盘中,在安装软件之前,必须先将光驱 mount 在 /cdrom 中。。但有的软件并不会到光盘中去寻找档案,所以建议您还是将光盘中 /ports/distfiles 目录内容复制到 /usr/ports/distfiles 目录中,或者先连上网络吧。
当使用网络取得档案时,预设抓取档案的服务器通常在国外,因此,您可以修改 /etc/make.conf 来指定使用国内的 FTP 站台,例如编辑 /etc/make.conf 并加入:
MASTER_SITE_BACKUP?= \
   ftp://freebsd.csie.ncu.edu.tw/distfiles/${DIST_SUBDIR}/ \
   ftp://freebsd.csie.nctu.edu.tw/pub/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?=    ${MASTER_SITE_BACKUP}
当安装完 ports 后,我们可以再下指令 make clean 来清除编译过程产生的档案,建议最好这么做,否则有的过程中产生大量档案可是很惊人的。如果您安装了一堆软件之后,才想到之前没有 make clean,没关系,在安装 ports 时,编译过程的档案都存在于该软件目录下的 work 目录中。我们可以使用下列指令来找出所有未 make clean 的软件,并将暂存数据删除:# find /usr/ports -depth -name work -exec rm -rf {} \;
如果您使用网络安装,它会将所下载的原始码存在 /usr/ports/distfiles 中,当你下 make clean 后,并不会将它们清除。
当你安装完后,想要移除该软件时,只要在该软件的 ports 目录中打 make deinstall 即可。请注意,不要在 /usr/ports 的目录中打 make deinstall,这样可是会将 "所有" 软件都移除喔。
还有一些较不常用的 make 方式,简述如下:
make fetch:抓回所需的原始档。
make fetch-list:显示安装所需的档案。
make checksum:抓回原始档并以 MD5 检查其正确性。
make extract:抓回并解开原始档。
make configure:进行组态,但不继续编译。
make all install:抓回原始档、编译且安装。
make reinstall:若先前发生意外中断,以此命令继续尝试安装。
make package:将做好的 ports 打包制作成 packages。
如果安装完新的软件之后,如果使用的 Shell 是 Csh 或 Tcsh,我们可能必须执行指令 rehash 来重建 hash table,之后才能在所设定的指令路径中找到刚安装的程序,不然的话就必须输入该程序的完整路径或重新登入才能使用。
我们可以在 /var/db/pkg 的目录中看到我们已安装的软件,每一个软件有一个目录,目录中存放着软件安装的信息,包含了软件说明、安装到哪些目录中。有的软件要安装前,会要求先安装某一套软件,如果你事先没有安装它所要求的软件,通常该软件会自动帮你安装。所以我们会在 /var/db/pkg 下看到一些不是我们主动安装的软件。既然软件之间可能会相互依赖,我们要如何得知这些软件彼此间的关系呢?pkg_tree 这套软件可以让我们检视软件间的关系。我们可以使用 port 来安装这套软件:# cd /usr/ports/sysutils/pkg_tree
# make install clean
之后我们就可以使用 pkg_tree | more 来看各个软件之间的关系了 (别忘了要 rehash 喔)。
10.4 更新 port tree
当 FreeBSD release 时,会事先测试过 ports 目录中的所有软件是否能正常安装。因为不同软件之间时常是相互依赖的,有的时候我们要安装 A 软件,系统会自动抓取所需要的其它软件。这些软件对于彼此的版本可能会有相互依赖,所以在 release 之前,ports 会暂停更新各个软件的版本,以确保 release 的版本能正常运作。
但在 release 之后,ports 目录中的软件版本可能已有更新,有的软件版本更新可能只是增加新的功能,而有的更新更涉及系统安全。如果您想使用 ports 安装软件最新的版本,在安装软件之前,我们可以先使用一些工具来更新整个 port tree。
有时候更新了 port tree 之后,因为版本相依问题,有些软件可能会因此而无法顺利安装,您只要在过几天后重新做一次 port tree 的更新应该就可以解决了。
更新 port tree 的方法很简单,我们可以使用 CVSup 来保持 ports 在最新状态。CVSup 是一套用来维持软件原始码和开发团队同步的工具,在我们执行了 CVSup 之后,它会经由网络向所设定的软件服务器检查并更新原始码的版本。我们可以使用 CVSup 来更新 port tree,也可以用来更新 /usr/src 目录下的 FreeBSD 原始码。
首先,我们必须安装 CVSup,因为我们不使用图形接口,所以安装 cvsup-without-gui:# cd /usr/ports/net/cvsup-without-gui
# make install clean
在系统中有一份以 CVSup 更新 port tree 的设定文件范例,您可以直接加以修改或着先复制一份后再修改。我们将该设定文件范例复制到 /root 之后再加以修改:# cp /usr/share/examples/cvsup/ports-supfile /root/
接着请以文书编辑软件打开 /root/ports-supfile 后,找到 host 的部份来设定所要使用的 CVSup 服务器。
# Defaults that apply to all the collections
#
# IMPORTANT: Change the next line to use one of the CVSup mirror sites
# listed at http://www.freebsd.org/doc/handbook/mirrors.html.
*default host=cvsup.tw.freebsd.org
*default base=/usr
*default prefix=/usr
*default release=cvs tag=.
*default delete use-rel-suffix
# If your network link is a T1 or faster, comment out the following line.
*default compress
## Ports Collection.
#
# The easiest way to get the ports tree is to use the "ports-all"
# mega-collection.  It includes all of the individual "ports-*"
# collections,
ports-all
# These are the individual collections that make up "ports-all".  If you
# use these, be sure to comment out "ports-all" above.
#
# Be sure to ALWAYS cvsup the ports-base collection if you use any of the
# other individual collections below. ports-base is a mandatory collection
# for the ports collection, and your ports may not build correctly if it
# is not kept up to date.
#ports-base
#ports-archivers
#ports-astro
#ports-audio
#ports-benchmarks
………略…………
上面的范例中,我们将 CVSup 服务器设为 cvsup.tw.freebsd.org,这一台服务器是由交大资工所维护,您可以依您所在位置使用其它 cvsup1 ~ cvsup13.tw.freebsd.org 的服务器。例如 cvsup3 位于中山大学,cvsup13 是 giga 和信超媒体的服务器。最后一行的 ports-all 表示我们要更新 /usr/ports 目录下的所有档案。您也可以只更新其中的部份目录,只要将 ports-all 以井字号 "#" 标示起来,并将档案中 ports-base 那一行的 # 移除,接着您就可以依您所要更新的目录来要移除其它的 # 字号。例如,我们只要更新 /usr/ports/www 这个目录,将 ports-all 以 # 标示起来之后,我们还要移除 ports-base 及 ports-www 开头的 #。
设定完毕之后,我们就可以开始进行 ports 的更新了。# cvsup -g -L 2 /root/ports-supfile
上述指令中,参数 g 表示不使用图形接口,而参数 L 及其后所跟随的数字 2 表示我们要看到更新过程的记录的详细程度,数字可以从 0 ~ 2,最后的档名表示所要使用的设定档。
在使用 ports 安装软件之前,先执行 CVSup 是一个不错的习惯,您可以随时取得软件的最新版本,不过您的机器一定要连上因特网才能进行更新。
10.5 使用 portupgrade 更新软件
在使用 Port 安装了一堆软件后,如果软件有新的版本出来怎么办?FreeBSD 的 ports 管理工具中有一个好用的软件 - portupgrade。
通常 ports 中的软件都有相依性,例如安装 Apache 会自动安装 libexpat、安装防垃圾信软件会自动安装一堆 Perl 模块。而在更新软件时,我们必须要确定更新过后,相依的软件都一并更新,才不会造成更新后有东西不能运作的情形。不过这并不表示我们一定要常常更新软件,建议您只有在必要时才使用 portupgrade 来更软件,不要有事没事就跑一次。因为软件并不是最新的就最好,没有人能保证更新的软件是否还维持您原本期望的行为。
portupgrade 在更新软件时,会保留您原本的设定档。例如,在更新 Apache 时,它会保留 httpd.conf 的设定。使用 portupgrade 是更新 ports 软件比较安全的方式。
在您使用 cvsup 更新 port tree 后,我们可以使用下列指令查看目前安装的软件版本是否和 port tree 中的版本一样:# pkg_version -v
ispell-3.2.06_12 = up-to-date with port
jasper-1.701.0 = up-to-date with port
jpeg-6b_3 = up-to-date with port
kde-3.3.0
上列输出中需要更新的软件会有「# cd /usr/ports/sysutils/portupgrade
# make install clean
如果您只想要升级某一个软件本身,而非所有相依的软件,只要使用 portupgrade pkgname 即可。如果您要升级所有和该软件相依的其它软件,则可以加上参数 -r。如果您要更新包含相依软件的相依软件,则可以使用参数 -R。另外,您可以使用参数 -m 来要求编译 (make) ports 时多传入一些参数,还可以使用参数 -f 要求就算版本一样也强制更新。
假设我们要更新的软件是 perl-5.8,我们可以使用下列指令来更新:# portupgrade -rf "perl-5.8.*" -m "ENABLE_SUIDPERL=yes"

小提示
笔者并不建议您使用 portupgrade 来安装所有软件,尤其不建议使用参数 -a 来更新所有软件。一方面新的软件不一定会更好,另一方面,我们很难保证更新后的软件会正常运作。而且我们在安装软件时,并不一定只使用 make install,还有可能在 make 后加上一些参数以支持更多的功能,直接使用 portupgrade 并不一定还能保留这些功能。我们介绍 portupgrade 的目只是为了让您在安装 Open WebMail 时更新 perl 时更顺畅。
10.6 传统安装方式
我们介绍了 FreeBSD 独有的 package 及 port 安装方式后,接下来我们还是要详细说明一下传统上在 UNIX 机器上安装软件的方式。
有的时候,我们要想要装的软件可能不在 port 里,或者 port 中的软件版本尚未更新,这时候我们就必须使用传统的安装方式来安装软件。基本上,传统安装方式就像本章开头所说的,大多必须要有下列步骤:
从该软件网站或其它 FTP 站台下载该软件,有可能是 binary 档或是原始码。
解压缩该档案,通常是以 tar 或 gzip、bzip2 压缩的。
读一下该目录中的说明文件,可能是 readme 或是 doc/ 的文件,来了解如何安装该软件。
如果所下载的是原始码,可能要先编辑一下 Makefile 或是执行 configure,接着再编译该软件。
最后再测试与安装。
我们以 MySQL 这个软件为例。
下载及解压缩
首先我们到 MySQL 网站上下载最新的原始码。一般原始码大多以指令 tar 包成一个档案,再压缩成 gzip 或是 bzip2 格式。所以您下载的档案扩展名大多为 .tar.gz、.tgz、或是 .tar.bz2。
扩展名为 .tar.gz 或是 .tgz 的档案为 tar + gzip 格式,MySQL 的原始码就是这一种类型。我们可以使用下列指令来解压缩:# tar zxvf mysql-4.1.13.tar.gz
如果扩展名为 .tar.bz2 的档案,则是 tar + bzip2 的格式,遇到这种格式时,我们可以使用下列指令解压缩:# tar jxvf mysql-4.1.13.tar.bz2
我们可以看到上述二种格式都可以使用 tar 来解压缩,只是 gzip 格式必须使用参数 z,而 bzip2 的格式必须使用参数 j。指令 tar 的其它参数所代表的意义为:x 是解开的意思、v 是要观看解开的过程、f 是指定要解压缩的文件名称。
解开之后,我们就可以进入下一步开始安装。
查看说明档
每个软件在安装上大同小异,但有的软件除了一般安装流程外,可能还有自己独特步骤。所以在安装之前,我们必须先看一下说明档,以了解如何进行安装。
大部份的开放原始码软件都会有 README 或是 INSTALL 这二个档案,用以说明安装的步骤。有的软件可能有其它档案,但我们可以从档名了解应该要看哪一个说明档。以 MySQL 为例,在它的原始码包装中,有一个档名为 INSTALL-SOURCE 的档案,应该就是我们要看的安装说明档。我们使用文书编辑器打开该档后,可以看到一些关于安装的说明。MySQL 的说明档写的蛮详细的,但我们可以将重点放在 Installation 的地方:
2.8.1 Source Installation Overview
----------------------------------
The basic commands you must execute to install a MySQL source
distribution are:
    shell> groupadd mysql
    shell> useradd -g mysql mysql
    shell> gunzip  cd mysql-VERSION
    shell> ./configure --prefix=/usr/local/mysql
    shell> make
    shell> make install
    shell> cp support-files/my-medium.cnf /etc/my.cnf
    shell> cd /usr/local/mysql
    shell> bin/mysql_install_db --user=mysql
    shell> chown -R root  .
    shell> chown -R mysql var
    shell> chgrp -R mysql .
    shell> bin/mysqld_safe --user=mysql &
我们可以看到它的安装步骤写的很详细,还有指令范例。简单来看,应该就是要先增加一个使用者为 mysql,并增加 mysql 群组。接着再解压缩原始码、进行编译、安装、并做一些安装后的设定。
编译
在 MySQL 的安装步骤中,编译前要先进行 configure。事实上,大多数的开放原始码软件编译流程都使用下列三个步骤:# ./configure
# make
# make install
第一个指令是 configure,这个指令可以用来检查您目前系统的设定,并依您的使用环境决定要不要加入某些功能。您也可以使用下列指令查看 configure 指令中可以使用哪些参数:# ./configure --help | more
原则上,除非有特殊要求,否则我们直接执行 configure 即可。以 MySQL 为例,我们在 configure 指令后面加上下列参数:# ./configure --prefix=/usr/local/mysql \
    --with-low-memory \
    --with-charset=big5
我们使用 --prefix 以指定要安装的路径,这是所有使用 configure 的软件都会有的参数。另外,我们还指定编译时不要使用太多内存 (--with-low-memory),并设定 MySQL 支持中文字集 (--with-charset=big5)。
执行完 configure 检查环境并设定安装的项目后,我们就可以使用 make 来进行编译。指令 make 会呼叫编译器 gcc 来将原始码转换成执行档。
安装
编译完后,我们可以使用下列指令安装:# make install
您可以看到程序安装的过程。安装完成后,我们必须依不同的软件要求进行安装后的设定。以 MySQL 为例,我们必须先使用 mysql_install_db 以初始化数据库,并将一些目录的拥有者设定为 mysql。
最后就可以启动 mysql 了。而如果我们要在开机时启动 MySQL,必须将它的启动指令加入 /etc/rc.local 中,或是在 /usr/local/etc/rc.d 中加入一个 mysql.sh 并将启动的指令写在该档案中,然后将 mysql.sh 设为可执行。如此一来,FreeBSD 在开机时就会自动执行它。
以上就是一般传统软件安装的流程:configure、make、make install,其实使用上也不太难。

小提示
传统的安装流程比较容易遇到的问题可能是在执行 make 时发生错误,如果您遇到问题,可以在 google 上查找 make 所产生的第一个错误的关键词,应该可以找到类似的问题及解决的方法。

顶部
逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:16  资料  个人空间  短消息  加为好友  QQ
第十一章 X Window 的使用
在 UNIX 的世界中,一样有图形化的接口可以使用。本章将介绍 UNIX 中最有名的窗口软件:X Window。X Window 提供了 FreeBSD 图形化的接口,但它只提供了图形化的能力,我们还必须另外安装一些常用的图形化程序及工具。读完本章后,您将了解下列主题:
X Windows 的介绍及安装。
KDE 窗口管理接口的使用。
中文化的图形接口。
11.1 安装 X Window
X11 是在 UNIX 系统下的窗口软件,它分为二种版本,一个是原本 FreeBSD 5.2.1 以前用的 XFree86,另一个是 FreeBSD 5.3 以后预设使用的 Xorg。
原本的 X11 是以 XFree86 为主,但最近由于版权争议及管理问题,分裂成二套软件。事实上,Xorg 也发展了很久,许多 Xorg 的人都是 XFree86 的开发者。在近期分裂时,Xorg 及 XFree86 的原始码做过同步,日后的开发才会有比较明显的差异。您可以选用 Xorg 或是 XFree86,不过 FreeBSD 预设是用 Xorg,而像 Redhat Linux 也都是使用 Xorg。照趋势及 Xorg 的开发愿景看来,似乎较多人会选用 Xorg。
我们在本章中会以 Xorg 设定为主,如果您使用 FreeBSD 5.2.1 以前的版本,您可以参考本章的设定,并将指令或设定名为 Xorg 的都改成 XFree86 即可。
X11 是一个 Client/Server 架构的软件,之所以会是 Client/Server 架构是因为在一开始设计 X 时,为了做到网络集中管理。「X Server」指的是有鼠标及键盘的机器,而「X Client」是画面显示的机器。不过我们在安装时,会将 Client 及 Server 都安装在同一台机器上。
X11 只是用来做基本的图形显示,我们除了介绍安装 X11 外,另外我们会再加装窗口管理软件,如果没有了它,X Windows 就只能看到白白一片。在众多的窗口管理软件中,我们选用 KDE,因为它提供了很多常用的工具,例如浏览器、Office 软件等。因此,我们将安装 X Windows + KDE 3 及并将其界面中文化。当然您也可以选用 GNOME 等其它的窗口管理接口。
您可以使用 port 来安装 X Window 及 KDE 3,但是必须花费很长的一段时间来进行编译。为了加快安装,我们使用 sysinstall 经由 packages 来快速安装。
Step1:安装X Window
在安装 FreeBSD 时,我们应该己经选择要安装 X Windows 套件,如果您安装 FreeBSD 时并未安装该套件,您可以在开机后执行 sysinstall 来进入安装时的选单。进入安装画面后,选择 [Configure]->[Distributions]->[X.Org],如图 11-1 所示。
图 11-1

接下来会出现一个选单让您选择所要安装的 X.Org 套件,如图 11-2 所示,请进入每一个目录选取 ALL。
图 11-2

接着选择 [EXIT] 回到选择安装来源。因为 X Window 已包含在 Installation CD 中,所以您可以选择 CD/DVD 为安装来源并放入本书所附的第一片 CD即可开始安装 X Window。
Step2:安装KDE 3
我们可以使用 Package 或 Ports 来安装 KDE,但是由于 Package 只会在 FreeBSD release 时产生,如果您之前有更新过 Port Tree,并安装过很多软件,则在使用 Package 安装 KDE 时,可能会发生无法安装的情形。而如果使用 Ports 来安装,光编译可能就要花很长的时间喔,大概要一、二天吧。所以,我们先试着使用 Package 来安装,以节省时间。
首先,请先将本书的第二片光盘放入光驱,并执行下列指令,以挂入光驱,并进入 sysinstall:# mount /cdrom
# sysinstall
进入 sysinstall 后,请选择 [Configure] -> [Packages] -> [CD/DVD] -> [kde] -> [kde-3.4.2]。选了 kde-3.4.2 后,系统会自动帮您选择其它需要的套件。接下来就可以按 OK 并回到上一页按 [Install] 开始安装。
万一您安装失败,可能是因为之前有安装过其它软件,造成冲突。这时候,我们可以改用 Port 来安装 KDE。如果您要使用 Port 安装,请使用下列指令:# cd /usr/ports/x11/kde3
# make BATCH=yes WITH_KDE_PATCHES=yes install
在使用 Ports 安装时,您可能会遇到有软件安装过其它类似的版本,结果就造成安装中断。这时候,您可以在 make 时,加上 「FORCE_PKG_REGISTER=y」,以强迫安装。
Step3:安装中文化字型
接着我们要让 KDE 支持中文的选单及讯息,我们必须先安装中文讯息文件 (i18n):# cd /usr/ports/chinese/kde3-i18n-zh_TW
# make install clean
接下来,我们要安装中文字型。XWindow 支持 TrueType 的字型,而在 MS Windows 上,我们常使用的细明体就是 TrueType 的字型。因此,您可以支接将「C:\WINDOWS\Fonts\mingliu.ttc」复制到 FreeBSD 的「/usr/X11R6/lib/X11/fonts/TrueType」目录中即可使用:# mkdir /usr/X11R6/lib/X11/fonts/TrueType
# cp mingliu.ttc /usr/X11R6/lib/X11/fonts/TrueType/
由于 mingliu.ttc 中实际上包含了二个字型:细明体及新细明体。KDE 在判断字型宽度及大小时有点问题,造成字型有点难看,所以,我们必须编辑 ~/.fonts.conf,并加入下列内容,以改善字型:
   
        MingLiU
        true
        true
        false
   
   
        MingLiU
        12
        false
        true
   
   
        MingLiU
        false
   
   
        MingLiU
        0
   
您可以在直接打开本书电子文件,并使用复制贴上的方式来编辑上列档案,以节省时间。
Step4:产生设定档
我们接着要执行 Xorg -configure 来产生设定档 XF86Config.new,然后将它搬到 /etc/X11/:# Xorg -configure
# cp /root/xorg.conf.new /etc/X11/xorg.conf
接着编辑 /etc/X11/xorg.conf,在 FontPath 区段最前面加入 TrueType 及 local 二个路径,以期使 X Window 能找到正确的字型路径:
Section "Files"
       RgbPath      "/usr/X11R6/lib/X11/rgb"
       ModulePath   "/usr/X11R6/lib/modules"
       FontPath     "/usr/X11R6/lib/X11/fonts/TrueType/"
       FontPath     "/usr/X11R6/lib/X11/fonts/local/"

       FontPath     "/usr/X11R6/lib/X11/fonts/misc/"
       FontPath     "/usr/X11R6/lib/X11/fonts/TTF/"
       FontPath     "/usr/X11R6/lib/X11/fonts/Type1/"
       FontPath     "/usr/X11R6/lib/X11/fonts/CID/"
       FontPath     "/usr/X11R6/lib/X11/fonts/75dpi/"
       FontPath     "/usr/X11R6/lib/X11/fonts/100dpi/"
EndSection
如果您有滚轮鼠标,您可以在下列「InputDevice」区段中加入「ZAxisMapping "4 5"」,以支援滚轮:
Section "InputDevice"
       Identifier  "Mouse0"
       Driver      "mouse"
       Option      "Protocol" "auto"
       Option      "Device" "/dev/sysmouse"
       Option      "ZAxisMapping" "4 5"
EndSection
接下来,我们来设定屏幕的分辨率等。请先找到 Section "Monitor" 的部份,并查看 Identifier 那行已经找到您所使用的屏幕。如果有,您可以不必设定水平及垂直更新频率。如果没有,请参考您的屏幕使用手册,并将 Horizsync(水平更新频率) 及 VerRefresh(垂直更新频率) 设定一个适合您的范围。
Section "Monitor"
        Identifier "Monitor0"
        VendorName "Monitor Vendor"
        ModelName "Monitor Model"
        Horizsync 30-70
        VertRefresh 50-100
接着要设定屏幕的分辨率,我希望以 16bit 色彩显示,1024x768 而且不要虚拟桌面。则请先找到 Section "Screen" 的部份:
Section "Screen"
        Identifier "Screen0"
        Device     "Card0"
        Monitor    "Monitor0"
        DefaultColorDepth 16
        SubSection "Display"
                Viewport   0 0
                Depth     1
        EndSubSection
        .......略......
        SubSection "Display"
                ViewPort 0 0
                Depth 16
                Modes "1024x768"
                Virtual 1024 768

        EndSubSection
我们加入了 DefaultColorDepth 16,表示内定以16 bit 的色彩显示。接着找到 Depth 16 的部份,加入了 Modes 及 Virtual。这二行表示可以用 1024x768 的分辨率、虚拟桌面为 1024x768。接着存档离开。
Step 5:进入 X Window
为了一进入 X Window 即有 KDE 要先编辑 ~/.xinitrc 加入下列二行:
#!/bin/sh -
export LANG=zh_TW.Big5  # 设定使用中文
exec /usr/local/bin/startkde
接着我们就可以执行 startx 来进入 X Window 了。如果您找不到 startx 的指令,请先执行来 rehash 更新指令,再执行一次 startx。
进入 X Window 后,画面会出现 KDE 的桌面设定选单,您只要依画面提示即可完成 KDE 的安装。设定完后,您就可以看到完整的 KDE 了:
图 11-3

如果您在X Window中无法使用鼠标,请先同时按 [Ctrl] + [Alt] + [Backspace] 离开 X Windows,再执行 sysinstall 来设定鼠标。设定鼠标的位置在 [Configure]->[Mouse],先设定 [Type] 选择鼠标的类型,再选 [Enable] 让一开机即驱动鼠标。
进入 KDE 后,您可以在控制中心里调整字型,建议您先将所有字型调为细明体 (MingLiu)。如果您要调整字型,请按画面左下角的 K 图示,并选择「控制中心」,即出现下列画面:
图 11-4

调整后,请重新启动 X Window。
在 KDE3 中有许多的附属软件,从简单的文字编辑器、绘图软件,到常用的办公室软件、浏览器及邮件软件都有。由于是图形接口,您可以自行摸索尝试。KDE 的浏览器是 Konqueror,它的使用接口和 IE 差不多,除了是网页浏览器外,也结合了档案总管的功能,下图即 Konqueror 的画面:
图 11-5

您也许会发现 KDE 简直可以和MS Windows 抗衡,它的办公室软件功能齐全,不论是 KWord、KExcel、KPowerPoint 都是威力强大的软件。
图 11-6


11.2 X Window下的中文软件
11.2.1 中文终端机
KDE 所附的终端机 Konsole 已经支持中文的显示,而且还有许多强大的功能。例如我们可以设定终端机背景、字型等,而且操作十分容易。只要您在 ~/.xinitrc 中有设定 LANG 为为 zh_TW.Big5 即可显示中文。
图 11.7

11.2.2 中文输入
我们安装的 X Window 目前为止只能看到中文,但无法使用中文输入,如果要使用中文输入,必须安装 Xcin 这套软件。xcin 是 X Chinese Input 的缩写,这个软件提供许多输入法,例如注音、大易、仓颉、简易、酷音、行列等。他们的网址是
http://xcin.linux.org.tw
,您可以在这里获得更多信息。
xcin 采用标准的 XIM 协议,XIM 协议是 X Window 下中文输入的标准,只要支持 XIM 的软件,我们都可以使用 xcin 来输入中文。而在 KDE 中,除了 Konsole 外,其它常用的软件都支持 XIM 中文输入。
安装 xcin 十分容易,我们可以使用 Ports 来安装:# cd /usr/ports/chinese/xcin25
# make install
安装完 Xcin 后,我们还要修改 ~/.xinitrc 来加入中文输入法的设定,请使用文书编辑软件来编辑 ~/.xinitrc 这个档案:
#!/bin/sh -
export LANG=zh_TW.Big5  # 设定使用中文
# 加入下列二行
export XMODIFIERS=@im=xcin
xcin2.5&

# 启动 KDE
exec /usr/local/bin/startkde
修改完后存盘,接着进入 X Window 您将看到输入法的窗口,然后我们就可以执行支持其它软件来输入中文了。例如我们开启 Konsole 的窗口后,就可以使用 Ctrl+Space 来切换中英文输入法。其它像 Konqueror 或 Kword 下的中文输入也没问题,如下图。
图 11-8

在输入法的切换方面,我们可以使用下列几个预设的热键来切换:
Ctrl+Space
中文 / 英文的切换
Ctrl+Shift
依序切换输入法 (正向切换)。
Shift+Ctrl
依序切换输入法 (反向切换)。
Ctrl+Alt+数字
选择输入法,数字部份由 1~8
预设的 XCIN 在输入中文时,输入法窗口不会在最上方,所以我们必须修改一下 XCIN 的设定档。设定文件的位置是 /usr/X11R6/etc/xcinrc,使用文书编辑软件打开后,找到 "OVERSPOT_WINDOW_ONLY" 的部份,并修改成 YES:
;  XIM Input Style Adjustments.
(define INPUT_STYLE            '(Root OverTheSpot))
(define OVERSPOT_USE_USRCOLOR   "YES")
(define OVERSPOT_USE_USRFONTSET "YES")
(define OVERSPOT_WINDOW_ONLY    "YES")
接着重新启动 X 窗口,当要输入中文时,只要以 Ctrl+Space 就可以打开输入法窗口。
在 X Window 中,有一些使用上的小技巧,例如您可以使用 Ctrl+Alt+Backspace 来强迫离开 X Window。如果您要使用鼠标在 Konsole 中来做复制贴上,你只要用鼠标选取所要复制的地方,就已完成复制的动作,接着再按 Shift+Insert 即可贴上。你可以发掘更多的小技巧喔。

顶部
逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:17  资料  个人空间  短消息  加为好友  QQ
第十二章 NAT 及防火墙
如果您家中有多台计算机需要同时上网,但却只有一个 IP 可以使用,这时 NAT 就派上用场了。NAT 可以让很多计算机经由一台 FreeBSD 服务器上网,而且还可以让 FreeBSD 的防火墙功能保护内部网络的计算机。本章将介绍以 FreeBSD 架设 NAT 服务器及使用 FreeBSD 防火墙功能。读完本章后,您将了解下列主题:
如何使用 FreeBSD 架设 NAT 服务器。
如何限制每一台计算机的最大上下传频宽。
如何架设防火墙。
如何架设具封包过滤功能的桥接器。
12.1 概论
这个部份我们将说明如何以 FreeBSD 做为防火墙,介绍 FreeBSD 内建的封包过滤功能。欲建立一台防火墙,就是要将一台机器放在二个网域的中间,并经由它来做封包过滤的工作。因此我们必须先确定网络封包能通过这台防火墙,再来设定要阻文件的规则。以 FreeBSD 作为二个网域中间的连接器,可以用路由器 (router)、网关、或是桥接器的方式来实作,再在该机器上设定防火墙的规则。当然,我们也可以只在一台单机上设定防火墙规则,以取代原本只能监控 inetd 服务的 TCP Wrapper。
我们举二种最常被应用结合防火墙设定来保护整个网络的方法,一个是 NAT,另一个是具封包过滤的桥接器。
12.1.1 NAT
所谓的 NAT 就是 (Network Address Translation),它可以让你在只有一个 IP 的情形下让多台计算机一起连上网络。举个实例而言,一个公司有三十台计算机,而 ISP 所提供的 ADSL 却只有八个实体 IP,这种情况下,我们可以将每台计算机的 IP 设定为 private IP,再让它们经由一台有实体 IP 的 NAT 服务器连上网络即可。
Private IP 是 RFC 所定义的私人 IP,这些 IP 不能够直接在因特网中出现,所以必需经由 NAT 的转换,将它们伪装成是由 NAT 服务器连向外部网络。这些可以用的私人 IP 如下:
Class
范围
子网掩码
Class A
10.0.0.0 ~ 10.255.255.255
255.0.0.0
Class B
172.16.0.0 ~ 172.31.255.255
255.255.0.0
Class C
192.168.0.0 ~ 192.168.255.255
255.255.255.0
我们只需在 NAT 服务器中做好设定,再将其它使用 private IP 的计算机设定 gateway 为该服务器的 IP 即可。另外,我们也可以在服务器中设定一些防火墙的规则,来保全内部网络。
12.1.2 具封包过滤的桥接器
如果我们的网络中有多台不同网域的计算机,这些计算机都有它们的 IP 及网络设定,我们可以将 FreeBSD 设定成为桥接器 (bridge),让这台桥接器作封包过滤的工作。这种做法对于网域内其它计算机原本的网络设定不会有影响,如果没有设定任何防火墙规则,对它们而言几乎不会发现桥接器的存在。我们可以使用桥接器来过滤同一个网域内的网络交通,如果您有一个很大的网域,想要降低同一网域内彼此网络封包的交互影响,却又不想将这个大网域分割成数个小网域,您可以使用具封包过滤功能的桥接器来达成网络封包分割的功能。我们也可以使用路由器来取代桥接器,但是路由器只能遶送二个不同网域,而且设定比较复杂,因此,我会使用桥接器来做为防火墙。
FreeBSD 内建有 ipfw 这个程序可以让我们轻易的设定一个简单的防火墙,我们只要在 kernel 中加上一些设定就可以打开它。在这里我们也将简单的介绍一些防火墙的语法,让我们可以保护我们不想、不需要被外界使用的网络服务。
在设定防火墙之前,有个观念必须先厘清。防火墙并不能够完全保护我们的网络安全,防火墙只是限制我们不想公开的服务、限制已知的 IP。就算架了防火墙,没有适当的管理也是枉然。
12.2 NAT
这里我们假设使用二张网络卡,一张是对外的网卡,代号是 fxp0;另一张是对内的网卡,代号 fxp1。以下的设定中请依您的网卡代号来加以修改。当然,你也可以只使用一张网络卡,将所有的计算机及对外网络都接在一台 HUB 上,再利用 alias 的功能将一张网卡设定二个 IP。在开始前,请先参考「网络设定」一章中的说明设定好第一张对外的网络卡喔。
在开始设定之前,请先检查一下内部网络的配置是否正确。我们内部网络的线路应该如图 12-1 所示。
图 12-1

上图中,内部网络的计算机全部都接到同一个 HUB 中,而 FreeBSD 有二个网络卡,对内的网络卡 fxp1 接在内部的 HUB 上,而对外的网络卡直接接在 ADSL Modem 或是对外的 HUB 上。上图的网络配置只是一个建议,您也可以将 fxp0、fxp1、及 ADSL Modem 全部接在内部的 HUB 上,只是这样 FreeBSD 就没有真正的隔离内外部网络了。
12.2.1 设定 kernel
首先,我们必须先确定核心有支持 NAT 及防火墙功能。FreeBSD 预设的 GENERIC 核心并未加入此功能,因此,请先编辑您的核心设定档,加入下列设定,并重新编译核心。如果您不知道如何修改核心设定,请参考「编译核心」一章的说明。假设我们要修改的核心设定档为 /usr/src/sys/i386/conf/GENERIC,先 cd /usr/src/sys/i386/conf/,再 ee GENERIC 加入下列几行:
# 防火墙
options IPFIREWALL
# 支援 NAT
options IPDIVERT
# 下面这一行是预设允许所有封包通过,如果没有这一行,
# 就必须在 /etc/rc.firewall 中设定封包的规则。
# 这条规则内定编号是 65535,也就是所有规则的最后一条
# 如果没有加这一条规则,内定就是拒绝所有封包,
# 只允许规则中允许的封包通过。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 这一行是让你可以在 ipfw 中设定要记录哪些封包,
# 如果没有这一行,就算设定了要留下记录也不会有作用。
options IPFIREWALL_VERBOSE
# 这一行是限制每一条规则所要记录的封包数量,
# 因为同样的规则可能有许多记录,加上这一条可以使
# 同样的记录重复数减少,以避免记录文件爆增。
options IPFIREWALL_VERBOSE_LIMIT=10
# 下面这一行是用来支援封包转向,
# 当你要使用 fwd 动作时必须要有这一项设定。
options IPFIREWALL_FORWARD
# 如果要使用 pipe 来限制频宽,必须加入下列选项以支持 dummynet。
options DUMMYNET
我们在上述设定中加入了许多项目,基本上,一定要有的项目为 IPFIREWALL 及 IPDIVERT,其它项目是为了支持限制频宽或记录信息使用。编辑完核心设定后,请重新编译并安装新的核心,重开机之后核心就己经支持防火墙及 NAT 了。
12.2.2 设定 rc.conf
请先参考「网络设定」一章,设定好您的第一张网络卡,并确定可以上网后,才开始下列设定。我们要修改 /etc/rc.conf 以启动 NAT 功能。我们假设网络卡代号是 fxp0 及 fxp1,请自行变更成您的网络卡代号:
# 设定第二张网络卡的 IP。
ifconfig_fxp1="inet 192.168.0.1  netmask 255.255.255.0"
# 设定启用 gateway 的功能。
gateway_enable="YES"
# 设定启用防火墙功能,并设定防火墙类型为 OPEN。
# FreeBSD 的防火墙设定档会自动为 NAT 加入相关的设定。
firewall_enable="YES"
firewall_type="OPEN"
# 设定 NAT 所使用的对外网络卡
natd_interface="fxp0"
natd_enable="YES"
设定结束之后,重开机应该就可以设定其它计算机使用这台 NAT 服务器来连上网络了。
12.2.3 设定 rc.firewall
我们在 /etc/rc.conf 中设定 firewall_type="OPEN",如果是使用原本 /etc/rc.firewall 的话,这样就已经就已经驱动了 NAT 的功能。
如果您想要加上更多的防火墙规则,可以编辑 /etc/rc.firewall ,并在档案最后加上您的设定。例如,我们要设定每一个内部计算机 (192.168.0.0/16) 最多只能使用的上传频宽为 64 Kb/s,下传频宽为 256 Kb/s,则可以在 rc.firewall 中加入下列设定:
# 限制频宽
/sbin/ipfw pipe 20 config bw 64Kbits/s
/sbin/ipfw pipe 21 config bw 256Kbits/s
/sbin/ipfw add pipe 20 ip from 192.168.0.0/16 to any
/sbin/ipfw add pipe 21 ip from any to 192.168.0.0/16
修改完后,执行 sh /etc/rc.firewall 就可以更新防火墙的设定了。其它关于防火墙规则的详细说明,请 man ipfw 或参考下一节的说明。
12.2.4 client 端的设定
在内部其它计算机方面,我们必须要再做一些设定才能让它们经由 FreeBSD 上网。首先,你的网络架构应该如图 12-1 所示。
而内部的其它的计算机设定方面,我们必须将其它计算机的 IP 设定为和 FreeBSD 服务器同一个子网络。以上列设定为例,您必须将其它计算机的 IP 设为 192.168.0.X (除了 192.168.0.1 以外的其它 IP)、子网掩码是 255.255.255.0,gateway 设定为 FreeBSD 连到局域网络的网络卡 IP,在此范例中是 192.168.0.1。然后再设定你的 DNS 为你 ISP 的 DNS 即可。
完成上述的设定后,我们就能享受以 FreeBSD 为NAT上网了。
如果您的其它计算机还是无法上网,您可以依下列步骤除错:
从 FreeBSD ping 因特网上的 IP,看看 FreeBSD 连到因特网是否正常。如果 ping 不到,表示 FreeBSD 对外网络设定有误。
从内部其它计算机 ping FreeBSD 对内的 IP。如果 ping 不到,请检查二方的 IP 及子网络设定是否正确,或是防火墙是否设定无误。
从内部计算机 ping 因特网上的 IP,如果 ping 不到,可能是 NAT 的设定有误。
12.2.5 NAT Port Forwarding
NAT 还有一个功能叫作 Port Forwarding,它的用途在于从连到本机的封包导向到别的计算机或本机其它连接埠。例如,我们对外有一台防火墙,在 DNS 设定方面,我们设定了 ftp.mydomain.com 及 www.mydomain.com 都指向这台防火墙。但我们希望所有 HTTP 联机都重新导向到内部的 192.168.0.2 这台机器上,而所有 FTP 联机都交由 192.168.0.3 来处理。这时候我们就可以使用 port forwarding 的方式来达成。
首先,我们知道 HTTP 使用 TCP 协议 port 80,而 FTP 使用了 TCP 协议 port 20 及 port 21,接着我们就可以在 /etc 目录下新增一个 NAT 的设定档,名为 natd.conf,并编辑内容如下:
redirect_port tcp 192.168.0.2:80 80
redirect_port tcp 192.168.0.3:20 20
redirect_port tcp 192.168.0.3:21 21
第一行的目的就是将 port 80 的 tcp 联机重新导向到 192.168.0.2 的 port 80,而二、三行是将 port 20 及 port 21 的联机交由 192.168.0.3 来处理。在 192.168.0.2 及 192.168.0.3 这二台机器上,我们只要设定它们的 gateway 为防火墙的 IP,例如 192.168.0.1 即可。
接下来我们必须在 /etc/rc.conf 中加入下列这一行,让 natd 在启动时能读取 /etc/natd.conf 的设定:
natd_flags="-f /etc/natd.conf"
重新启动后,您就可以进行测试了。假设防火墙的对外 IP 是 11.22.33.44,当我们从外部网络使用 HTTP 联机到该 IP 时,虽然该服务器并未架设 HTTP server,但你却可以看到网页,表示网络封包有被重导至内部的另一台服务器。

小提示
Port Forwarding 的功能是将外部联机转向到内部的计算机。所以,如果您从内部计算机连到 NAT 服务器时,并不会被转向到内部 IP 喔。
12.3 防火墙
ipfw 是 FreeBSD 内建的防火墙指令,我们可以用它来管理进出的网络交通。如果防火墙服务器是扮演着路由器 (gateway 例如上一篇中的 NAT 服务器) 的角色,则进出的封包会被 ipfw 处理二次,而如果防火墙扮演的是桥接器 (bridge) 的角色,则封包只会被处理一次。这个观念关系着我们以下所要介绍的语法,有的语法并不适用于桥接器。
另外,我们在设定防火墙时有二种模式,一种模式是预设拒绝所有联机,再一条一条加入允许的联机;另一种是预设接受所有联机,加入几条拒绝的规则。如果是非常强调安全性,应该是使用预设拒绝所有联机,再一条一条加入我们允许的规则。
我们会将 firewall 的设定写在 /etc/rc.firewall 中,每一条设定都是以先入为主 (first match wins) 的方式来呈现,也就是先符合的规则 (rules) 为优先。所有进出的封包都会被这些规则过滤,因此我们会尽量减少规则的数量,以加速处理的速度。
在 kernel 中,关于防火墙的设定有下列几条:
# 防火墙
options IPFIREWALL
# 支援 NAT
options IPDIVERT
# 下面这一行是预设允许所有封包通过,如果没有这一行,
# 就必须在 /etc/rc.firewall 中设定封包的规则。
# 这条规则内定编号是 65535,也就是所有规则的最后一条
# 如果没有加这一条规则,内定就是拒绝所有封包,
# 只允许规则中允许的封包通过。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 这一行是让你可以在 ipfw 中设定要记录哪些封包,
# 如果没有这一行,就算设定了要留下记录也不会有作用。
options IPFIREWALL_VERBOSE
# 这一行是限制每一条规则所要记录的封包数量,
# 因为同样的规则可能有许多记录,加上这一条可以使
# 同样的记录重复数减少,以避免记录文件爆增。
options IPFIREWALL_VERBOSE_LIMIT=10
# 下面这一行是用来支援封包转向,
# 当你要使用 fwd 动作时必须要有这一项设定。
options IPFIREWALL_FORWARD
# 如果要使用 pipe 来限制频宽,必须加入下列选项以支持 dummynet。
options DUMMYNET
ipfw 也支持状态维持 (keep-state) 的功能,就是可以让符合设定的规则以动态的方式来分配增加规则 (地址或连接端口) 来让封包通过。也就是说防火墙可以记住一个外流的封包所使用的地址及连接端口,并在接下来的几分钟内允许外界响应。这种动态分配的规则有时间的限制,一段时间内会检查联机状态,并清除记录。
所有的规则都有计数器记录封包的数量、位数、记录的数量及时间等。而这些记录可以用 ipfw 指令来显示或清除。
在说明 ipfw 规则的语法之前,我们先来看这个指令的用法。ipfw 可以使用参数:
指令
说明
ipfw add [rule]
新增一条规则。规则 (rule) 的语法请参考下一节的说明。
ipfw delete [number]
删除一条编号为 number 的规则。
ipfw -f flush
清除所有的规则。
ipfw zero
将计数统计归零。
ipfw list
列出现在所有规则,可以配合下列参数使用。
-a
使用 list 时,可以列出封包统计的数目。
-f
不要提出确认的询问。
-q
当新增 (add)、归零(zero)、或清除 (flush) 时,不要列出任何回应。当使用远程登入,以 script (如 sh /etc/rc.firewall) 来修改防火墙规则时,内定会列出你修改的规则。但是当下了 flush 之后,会立即关掉所有联机,这时候响应的讯息无法传达终端机,而规则也将不被继续执行。此时唯一的方法就是回到该计算机前重新执行了。在修改防火墙规则时,最好在计算机前修改,以免因为一个小错误而使网络联机中断。
-t
当使用 list 时,列出最后一个符合的时间。
-N
在输出时尝试解析 IP 地址及服务的名称。
-s [field]
当列出规则时,依哪一个计数器 (封包的数量、位数、记录的数量及时间) 来排序。
12.3.1 ipfw 规则
我们在过滤封包时,可以依据下列的几个封包所包含的信息来处理该封包:
接收或传送的接口,可以使用接口名称或地址。
方向,流入或流出。
来源或目的地的 IP 地址,也可以加上子网掩码。
通讯协议,TCP,UDP,ICMP 等。
TCP flags。
IP fragment flag。
IP options。
ICMP 的类型。
和封包相关的 socket User/group ID。
使用 IP 地址或 TCP/UDP 的端口号来做为规则可能蛮危险的,因为这二种都有可能被以假的信息所蒙骗 (spoof)。但是这二种却也是最常被使用的方法。
下列为 ipfw rules 的语法:[number] action [log] proto from src to dist [interface_spec] [option]
使用 [ ] 包起来的表示可有可无,我们一一为大家说明它们的意义:
number:
number 是一个数字,用来定义规则的顺序,因为规则是以先入为主的方式处理,如果你将规则设定放在一个档案中 ( 如 /etc/rc.firewall ),规则会依每一行排列的顺序自动分配编号。你也可以在规则中加上编号,这样就不需要按顺序排列了。如果是在命令列中下 ipfw 指令来新增规则的话,也要指定编号,这样才能让规则依我们的喜好排列,否则就会以指令的先后顺序来排。这个编号不要重复,否则结果可能不是你想要的样子。
action:
action 表示我们这条规则所要做的事,可以用的 action 有下列几个:
命令
意义
allow
允许的规则,符合则通过。也可以使用 pass,permit, accept 等别名。
deny
拒绝通过的规则。
reject
拒绝通过的规则,符合规则的封包将被丢弃并传回一个 host unreachable 的 ICMP。
count
更新所有符合规则的计数器。
check-state
检查封包是否符合动态规则,如果符合则停止比对。若没有 check-state 这条规则,动态规则将被第一个 keep-state 的规则所检查。
divert port
将符合 divert sock 的封包转向到指定的 port。
fwd ipaddr[,port]
将符合规则封包的去向转向到 ipaddr,ipaddr 可以是 IP 地址或是 hostname。如果设定的 ipaddr 不是直接可以到达的地址,则会依本机即有的 routing table 来将封包送出。如果该地址是本地地址 (local address),则保留本地地址并将封包送原本指定的 IP 地址。这项设定通常用来和 transparent proxy 搭配使用。例如: # ipfw add 50000 fwd 127.0.0.1,3128 tcp from \
  192.168.1.0/24 to any 80
如果没有设定 port ,则会依来源封包的 port 将封包送到指定的 IP。使用这项规则时,必须在 kernel 中设定选项 IPFIREWALL_FORWARD。
pipe pipe_nr
传递封包给 dummynet(4) "pipe",用以限制频宽。使用本语法必须先在核心中加入 option DUMMYNET。请 man ipfw 及 man dummynet。
基本语法是先将要设定频宽的规则加入: ipfw add pipe pipe_nr ....
再设定该规则的频宽:ipfw pipe pipe_nr config bw B delay D queue Q plr P
这里的 pipe_nr 指的是 pipe 规则编号,从 1~65535;B 是指频宽,可以表示为 bit/s、Kbit/s、Mbit/s、Bytes/s、KBytes/s、或 MBytes/s。D 是延迟多少 milliseconds (1/1000)。Q 是 queue size 的大小 (单位为 packages 或 Bytes)。P 是要随机丢弃的封包数量。
例如我们要限制内部网域的计算机对外上传的最大频宽是 20 KBytes:ipfw add pipe 1 ip from 192.168.0.1/24 to any in
ipfw pipe 1 config bw 20KBytes/s
log:
如果该规则有加上 log 这个关键词,则会将符合规则的封包记录在 /var/log/security 中。前提是在核心中有设定 IPFIREWALL_VERBOSE 的选项。有时因为同样的封包太多,会使记录文件保有大量相同的记录,因此我们会在核心中再设定 IPFIREWALL_VERBOSE_LIMIT 这个选项,来限制要记录多少相同的封包。
proto:
proto 表示 protocol,即网络协议的名称,如果使用 ip 或 all 表示所有协议。可以使用的选项有 ip,all,tcp,udp,icmp 等。
src 及 dist:
src 是封包来源;dist 是封包目的地。在这二个项目可以用的关键词有 any, me, 或是以 [ports] 的方式明确指定地址及端口号。
若使用关键词 any 表示使这条规则符合所有 ip 地址。若使用关键词 me 则代表所有在本系统接口的 IP 地址。而使用明确指定地址的方式有下列三种:
IP 地址,指定一个 IP,如 168.20.33.45。
IP/bits,如 1.2.3.4/24,表示所有从 1.2.3.0 到 1.2.3.255 的 IP 都符合规则。
IP:mask,由 IP 加上子网掩码,如 1.2.3.4:255.255.240.0 表示从 1.2.0.0 到 1.2.15.255 都符合。
而在 me, any 及 指定的 ip 之后还可以再加上连接埠编号 (ports),指定 port 的方法可以是直接写出 port ,如 23;或给定一个范围,如 23-80;或是指定数个 ports,如 23,21,80 以逗点隔开。或者是写出在 /etc/services 中所定义的名称,如 ftp,在 services 中定义是 21,因此写 ftp 则代表 port 21。
interface-spec:
interface-spec 表示我们所要指定的网络接口及流入或流出的网络封包。我们可以使用下列几个关键词的结合:
关键词
意义
in
只符合流入的封包。
out
只符合流出的封包。
via ifX
封包一定要经过接口 ifX,if 为接口的代号,X 为编号,如 vr0。
via if*
表示封包一定要经过接口 ifX,if 为接口的代号,而 * 则是任何编号,如 vr* 代表 vr0,vr1,...。
via any
表示经过任何界面的封包。
via ipno
表示经过 IP 为 ipno 界面的封包。
via 会使接口永远都会被检查,如果用另一个关键词 recv ,则表示只检查接收的封包,而 xmit 则是送出的封包。这二个选项有时也很有用,例如要限制进出的接口不同时:ipfw add 100 deny ip from any to any out recv vr0 xmit ed1
recv 接口可以检查流入或流出的封包,而 xmit 接口只能检查流出的封包。所以在上面这里一定要用 out 而不能用 in,只要有使用 xmit 就一定要使用 out。另外,如果 via 和 recv 或 xmit 一起使用是没有效的。
有的封包可能没有接收或传送的接口:例如原本就由本机所送出的封包没有接收接口,而目的是本机的封包也没有传送界面。
options:
我们再列出一些常用的 option 选项 ,更多选项请 man ipfw:
选项名称
意义
keep-state
当符合规则时,ipfw 会建立一个动态规则,内定是让符合规则的来源及目的地使用相同的协议时就让封包通过。这个规则有一定的生存期限 (lift time,由 sysctl 中的变量所控制),每当有新的封包符合规则时,便用重设生存期限。
bridged
只符合 bridged 的封包。
established
只适用于 TCP 封包,当封包中有 RST 或 ACK bits 时就符合。
uid xxx
当使用者 uid 为 xxx 则符合该规则。例如,我们如果要限制 Anonymous FTP 的下载速度最大为 64KB/s,则可以使用:ipfw pipe 1 config bw 512Kbit/s
ipfw add pipe 1 tcp from me to any uid 21
上列规则第一行是先建一个编号为 1 的 pipe,限制频宽为 512 Kbit/s (也就是 64 KByte/s),接着第二条是当使用者 uid 为 21 时,从本机 (me) 下载的 tcp 封包都使用编号 1 的 pipe。因为 Anonymous FTP 的使用者是 ftp,它的预设 uid 为 21,所以这条规则会被套用在 Anonymous FTP user 上。
setup
只适用于 TCP 封包,当封包中有 SYN bits 时就符合。
以上的说明只是 man ipfw 中的一小部份。如果你想要对 ipfw 更了解,例如如何使用 ipfw 来限制频宽等,建议你 man ipfw。
不知道您看了这么多的规则是否觉得眼花撩乱,如果不了解 TCP/IP 的原理,彻底了解 ipfw 的设定还真不容易。没关系,我们下面将举几个简单、常用的设定,这些范例应该够平常使用了。
12.3.2 范例
我将原本的 /etc/rc.firewall 备份成 rc.firewal.old,并将它改成下列内容,请注意,这里只是范例,只供参考:
# 设定我的 IP
myip="1.2.3.4"
# 设定对外的网络卡代号
outif="vr0"
# 设定对内的网络上代号
inif="vr1"
#清除所有的规则
/sbin/ipfw -f flush
# Throw away RFC 1918 networks
${ipfw} add deny ip from 10.0.0.0/8 to any in via ${oif}
${ipfw} add deny ip from 172.16.0.0/12 to any in via ${oif}
${ipfw} add deny ip from 192.168.0.0/16 to any in via ${oif}
# 只允许内部网络对 192.168.0.1 使用 telnet 服务
/sbin/ipfw add 200 allow tcp from 192.168.0.1/24 to 192.168.0.1 telnet
# 拒绝其它人连到 port 23,并记录尝试联机的机器
/sbin/ipfw add 300 deny log tcp from any to me 23
# 拒绝任何 ICMP 封包
/sbin/ipfw add 400 deny icmp from any to any
# 下面这台机器是坏人,不让它进来,并记录下来
/sbin/ipfw add 1100 deny log all from 211.21.104.102 to any
# NAT 的设定
/sbin/ipfw add divert natd all from any to any via vr0
# 限制内部网域对外下载最大频宽为 20KBytes/s,上传最大频宽为 5KBytes/s
ipfw pipe 20 config bw 20KBytes/s
ipfw add pipe 20 ip from any to 192.168.0.1/24 out
ipfw pipe 30 config bw 5KBytes/s
ipfw add pipe 30 ip from 192.168.0.1/24 to any in
# 允许本机对任何地方联机
/sbin/ipfw add check-state
/sbin/ipfw add 2000 allow udp from ${myip} to any keep-state
/sbin/ipfw add 2100 pass ip from ${myip}  to any
# 允许外界使用邮件服务
/sbin/ipfw add 3000 pass tcp from any to ${myip} 25 in via ${outif}
# 不允许内部的 IP 从外部连进来
/sbin/ipfw add 1200 add deny ip from ${myip}/24 to any in via ${oif}
# 其它都拒绝,如果没有在 kernel 中设定
# IPFIREWALL_DEFAULT_TO_ACCEPT 则内定就有下列这一条
/sbin/ipfw 65535 add deny all from any to any
存盘后就可以使用 sh rc.firewall 来执行新的规则了。如果您将规则放在 /etc/rc.firewall 中,则开机时会自动执行。
12.3.3 一些小建议
在建立一个封包过滤的防火墙时,应该尽可能阻挡一些不必要的服务。避免开放 port 1024 以下的 TCP 服务,例如只通过 SMTP 封包 (port 25) 给邮件服务器;拒绝所有 UDP 联机 (只有少部份服务如 NFS 会用到);一些只有内部才会使用的服务,如数据库等也不必对外开放。
另外,同样的防火墙限制可以使用不同的语法来展现,应该要试着让规则数量越少越好,以加快处理速度。
在更新 firewall 规则时,如果规则没有写好,而你又是以远程登入的方式修改规则,很可能会因此无法继续登入。因此建议更新规则时最好在 console 前执行,若迫不得已一定要使用远程登入,建议您执行 /usr/share/examples/ipfw/change_rules.sh 这支程序来编辑规则:# cd /usr/share/examples/ipfw
# sh change_rules.sh
接着会出现文书编辑软件并最动加载 /etc/rc.firewall 让你编辑,结束离开后,会询问是否要执行更新。如果执行新的规则后造成断线,它会自动加载旧的规则,让我们可以再次联机。
12.4 封包过滤桥接器
如果您有三台机器全部都有 public IP,而您想使用其中一台做为防火墙,在不改变另外二台机器的设定下,我们可以使具封包过滤的桥接器来架设防火墙。只要将这台桥接器放在另外二台和对外网络之间即可。
另外,当我们的内部网络有不同 class 的主机时,例如内部有 140.115.2.3 及 140.115.5.6 这二台计算机时,就无法使用传统的防火墙。如果要在这二台机器连到因特网中途中使用防火墙,我们必须使用新的方式,也可以使用这里介绍的桥接器。
我们可以使用 FreeBSD 为桥接器,利用它来做封包过滤的动作,而丝毫不影响内部的主机原本的设定。为了达到这个功能,我们必需要有二张支持 promiscuous mode 的网络卡,现在的网络卡大部份都有支持。二张网络卡当中,一张需要设定 IP,另一张不需要。至于您要将 IP 设定在哪一张卡都可以,建议是设在对外的网络卡上。
首先,我们必须在核心中加入关于桥接器的设定:
# 支援桥接器
options BRIDGE
# 防火墙设定
options IPFIREWALL
options IPFIREWALL_VERBOSE
# 我们这里不将防火墙预设为接收所有封包
#options IPFIREWALL_DEFAULT_TO_ACCEPT
如果您要让桥接器具有流量控制的功能,则可以加上之前提到的选项「options DUMMYNET」。重新编译核心后,在重开机前,我们先设定一下 /etc/rc.conf:
firewall_enable="YES"
firewall_type="open"
还有一件事要做,当在以太网络上跑 IP 协议时,事实上使用二种以太网络协议,一个是 IP,另一个是 ARP。ARP 协定是当机器要找出给定 IP 地址所对应的以太网络地址时使用的。ARP 并不是 IP 层的一部份,只是给 IP 应用在以太网络上运作。标准的防火墙规则中并未加入对于 ARP 的支持,幸运的是,高手们的在 ipfirewall 程序代码中加入了对封包过滤桥接器的支持。如果我们在 IP 地址 0.0.0.0 上建立一个特别的 UDP 规则,UDP 端口的号码将被使用来搭配被桥接封包的以太网络协议号码,如此一来,我们的桥接器就可以被设定成传递或拒绝非 IP 的协议。请在 /etc/rc.firewall 中接近文件顶端处理 lo0 的那三行之下(就是有写 Only in rare cases do you want to change these rules 的地方)加入下面一行:
${fwcmd} add allow udp from 0.0.0.0 2054 to 0.0.0.0
现在我们就可以重新开机了。重开机之后,先执行下列指令来启动桥接器:
如果您使用的是 FreeBSD 4.x:# sysctl -w net.link.ether.bridge_ipfw=1
# sysctl -w net.link.ether.bridge=1
如果您使用的是 FreeBSD 5.x:# sysctl -w net.link.ether.bridge.ipfw=1
# sysctl -w net.link.ether.bridge.enable=1
现在我们可以将机器放在内外二个网域之间了。因为我们之前在 /etc/rc.conf 中,设定防火墙完全打开,不阻挡任何封包,所以放在二个网域之间时,运作应该没有问题。我们之前只设了一张网络上的 IP,而在执行了上述的指令之后,第二张网络卡便开始运作。
下一步就是将我们启动桥接器的指令放在 /etc/rc.local 中,让系统在开机时自动执行。或者,我们可以在 /etc/sysctl.conf 中加入下面二行:
# 如果您使用的是 FreeBSD 4.x
net.link.ether.bridge_ipfw=1
net.link.ether.bridge=1
# 如果您使用的是 FreeBSD 5.2 以后的版本
net.link.ether.bridge.enable=1
net.link.ether.bridge.ipfw=1
接下来我们就可以依自己的需求在 /etc/rc.firewall 文件的最后面加上我们自己想要的防火墙规则了。以下是一个简单的设定规则,假设桥接器的 IP 是 140.115.75.137,内部有二台主机,一台提供网页服务,一台是 BBS:
us_ip=140.115.75.137
basrv_ip=140.115.3.4
bbs_ip=140.115.5.6
oif=fxp0
iif=fxp1
ipfw="/sbin/ipfw"
# Things that we've kept state on before get to go through in a hurry.
${ipfw} 1000 add check-state
# Throw away RFC 1918 networks
${ipfw} 1100 add deny ip from 10.0.0.0/8 to any in via ${oif}
${ipfw} 1200 add deny log ip from 172.16.0.0/12 to any in via ${oif}
${ipfw} 1300 add deny log ip from 192.68.0.0/16 to any in via ${oif}
# 允许桥接器本身所有想做的联机 (keep state if UDP)
${ipfw} 1400 add pass udp from ${us_ip} to any keep-state
${ipfw} 1500 add pass ip from ${us_ip} to any
# 允许内部网络任何想做的联机 (keep state if UDP)
${ipfw} 1600 add pass udp from any to any in via ${iif} keep-state
${ipfw} 1700 add pass ip from any to any in via ${iif}
# 允许任何的 ICMP 联机
${ipfw} 1800 add pass icmp from any to any
# 不允许使用 port 888 联机
${ipfw} 2000 add deny log tcp from any to ${bbs_ip} 888
# TCP section
# 任何地方都可以建立 TCP 联机
${ipfw} 3000 add pass tcp from any to any via ${oif}
# Pass the "quarantine" range.
${ipfw} 3100 add pass tcp from any to any 49152-65535 in via ${oif}
# Pass ident probes. It's better than waiting for them to timeout
${ipfw} 3200 add pass tcp from any to any 113 in via ${oif}
# Pass SSH.
${ipfw} 3300 add pass tcp from any to any 22 in via ${oif}
# Pass DNS. 当内部网络有名称服务器时才需要
#${ipfw} add pass tcp from any to any 53 in via ${oif}
# 只传递 SMTP 给邮件服务器
${ipfw} 3400 add pass tcp from any to ${bbs_ip} 25 in via ${oif}
${ipfw} 3500 add pass tcp from any to ${basrv_ip} 25 in via ${oif}
# UDP section
# Pass the "quarantine" range.
${ipfw} 4000 add pass udp from any to any 49152-65535 in via ${oif}
# Pass DNS. 当内部网络有名称服务器时才需要
#${ipfw} 4100 add pass udp from any to any 53 in via ${oif}
# 其它的都拒绝
${ipfw} 60000 add deny ip from any to any

顶部
逍遥
家园秀才
Rank: 3Rank: 3



UID 446
精华 1
积分 290
帖子 67
威望 290 威望值
家园币 500 家元
现金 1600 元
存款 0 元
阅读权限 30
注册 2006-3-24
状态 离线
 
发表于 2006-6-5 15:18  资料  个人空间  短消息  加为好友  QQ
第十三章 网页服务器
我们最常使用的网络应用莫过于网页服务器了, 这里我们将介绍如何安装一个功能完整的网页服务器。读完本章后,您可以了解下列网页服务器的管理项目:
如何安装 Apache+PHP+MySQL+PostgreSQL。
如何设定 Apache 及 PHP。
如何查看网页服务器的使用状态。
测试服务器效能。
经由记录文件分析网页使用情形。
13.1 概论
Apache 是 UNIX 系统中普遍使用的网页服务器软件。根据  Netcraft 的统计 (
http://news.netcraft.com/archives/web_server_survey.html
),目前因特网中,有超过百分之六十的服务器是使用 Apache 来提供网页浏览的服务。Apache 可以说是目前世界上使用人数最多的网页服务器软件,它不仅可以在 FreeBSD、UNIX、Linux 中运行,也可以安装在 Windows 操作系统中。
Apache 和 FreeBSD 一样,在软件版本上也有多个分支,目前较稳定的版本有 1.3.33 及 2.0.x。Apache 1.3 系列开发已久,已经十分稳定了,不会再有重大的修改。而 Apache 2 系列是一个开发较活跃的版本,它和 1.3 最大的不同在于多执行绪 (multithreaded) 的支援。目前 Apache 2.0.x 是最主要的稳定版本,而 2.1.x 则还处于开发中的状态。笔者建议您使用 Apache 2.0 来做为您的网页服务器。
Apache 之所以风行的原因,除了免费、历史悠久、稳定外,它提供了弹性化的接口,可以让我们依需求加入各种模块,以提供更强大的功能。例如,我们可以在网页服务器上加入 PHP,以支持更多的网页应用。PHP 是一个用来写网页程序的软件,就像 ASP、JAVA servlet、CGI 等等有类似的用途,我们可以使用 PHP 建立留言版、电子相簿、购物车等应用。PHP 十分容易学习,程序代码也很简洁,速度更是没话说。如果你有些微的程序语言基础,不出二个礼拜,你就能对 PHP 有十足的认识,并且可以自己写出留言版、权限控制等简单的程序。
如果要使用 PHP,那你一定也要使用一套数据库系统做为程序后端的数据储存。在众多免费的数据库软件中,最有名的应该是 MySQL 和 PostgreSQL 了。不论是 MySQL 或 PostgreSQL,它们的功能及速度都令人赞赏。使用 PHP 加上数据库软件,你可以制作出网页的各式数据库,如会员管理、产品数据库等等。总之,我十分建议使用 Apache+PHP+数据库的组合,就算目前不会用到,不久的将来也会使用它们的功能。全部一股脑的装起来,省得日后麻烦。
目前 PHP 一样有二个主要的版本分支:4.x 及 5.x,4.4.0 是目前 4.x 的最新版本,而 5.0.x 则是 5.x 中的稳定版。我们将介绍如何使用 PHP 5.0 及数据库。
13.2 安装及设定 Apache
13.2.1使用 ports 安装
使用 FreeBSD port 安装 Apache  十分容易,我们只要使用下列指令即可完成安装:# cd /usr/ports/www/apache2
# make install clean
我们已经完成了最基本的 Apache 服务器安装,如果您不需要支持 PHP 及数据库,可以跳过下列步骤。
安装 PHP# cd /usr/ports/www/mod_php5
# make install clean
执行了上述指令后,会出现一个窗口让您选择进阶设定,请记得选取 APACHE2,如下图所示:
图 13-1

接下来我们必须安装一些常用的 PHP 模块,请执行下列指令:# cd /usr/ports/lang/php5-extensions
# make install clean
执行了 make install 后,会出现一个选单,除了预设的项目外,我们必须再选择下列几个常用的项目:CTYPE、EXIF、GD、ICONV、IMAP、PCRE、SESSION、ZLIB。这些项目非常常用,尤其是 SESSION。
安装完 PHP 后,我们将下来要安装数据库,您可以选择安装 MySQL 或 PostgreSQL,或者干脆二者都安装,以利日后使用不同的数据库应用。
安装 MySQL# cd /usr/ports/databases/mysql41-server
# make WITH_CHARSET=big5 WITH_XCHARSET=all install clean
# cd /usr/ports/databases/php5-mysql
# make install clean
安装 PostgreSQL# cd /usr/ports/databases/postgresql80-server
# make install clean
# cd /usr/ports/databases/php5-pgsql
# make install clean
安装了 MySQL 及 PostgreSQL 后,必须再进行数据库的细部设定。相关的数据库详细设定说明,请参考「数据库系统」一章的说明。
13.2.2 Apache 基本设定
安装完 Apache 后,我们必须先进行一些基本设定才可以开始使用。本节中,我们先介绍较常使用的设定项目,让您可以快速的设定好网页服务器,而更详细的 Apache 设定将于下一小节中说明。Apache 的设定档位于 /usr/local/etc/apache2/httpd.conf,请使用文章编辑软件打开 httpd.conf。
我们按照设定项目在 httpd.conf 中出现的顺序说明每一个项目,您可以使用搜寻的方式查找每一个项目的关键词,以进行设定。
ServerAdmin 设定管理者邮件
设定您的信箱,这个信箱地址当网页出现错误讯息时将出现在该页面上。以下范例为默认值:
ServerAdmin you@example.com
ServerName 设定主机名称及端口号
ServerName 可以让您设定您的主机名称,如果您没有主机名称,可以设定为您机器所使用的 IP。ServerName 会被用来重新转向网址,例如,当您输入一个网址 「http://www.example.com/dir」时,Apache 会参考您在 ServerName 中的设定,将 www.example.com 改成 ServerName,并在您所输入的网址后加上一个斜线「/」以连到 dir 目录中,也就是将网址转向到「http://www.example.com/dir/」。如果您的网址设定不正确,则使用者可能会连到一个不存在的地址。
所以,如果您没有主机名称,可以将这个值设定为 IP,让网址转向后还是可以连到正确的地方。在 ServerName 的设定中,我们也指定了 HTTP 的连接埠 80。
如果您的服务器是位于 NAT 后面,使用 NAT 做 Port Forwarding,建议不要设定这个项目,改将下一个设定选项 UseCanonicalName 设为 On,才不会在转向网址时导到错误的位置。
ServerName www.example.com:80
UseCanonicalName 设定导向网址的方式
Apache 在导向网址时,会参考您所设定的服务器名称及端口号,但当主机使用 NAT Port Forwarding 时,主机名称及端口号可能会不同,这时候我们必须将这个选项设为 On,以免 Apache 转向到错误的地址。
UseCanonicalName Off
DocumentRoot 设定网页根目录
DocumentRoot 可以让我们指定网页根目录的位置,也就是我们存放网页的目录。
DocumentRoot "/usr/local/www/data"
设定好 DocumentRoot 后,我们必须要再设定该目录的权限。在 DocumentRoot 之后,有下列区段:
   Options Indexes FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
您必须将  也改成您的网页根目录位置。
DirectoryIndex 指定预设网页档名
当使用者使用网址「http://www.example.com/dir」连到一个目录中时,如果没有指定网页,Apache 会去查找 DirectoryIndex 中所设定的网页在不在,如果存在则秀出预设的网页。
预设的网页只有二个,我们可以再加上 index.htm、index.php 等常用的网页:
DirectoryIndex index.php index.htm index.html index.html.var
加入 PHP 支持
如果您要使用 PHP,则必须在 httpd.conf 中加入 PHP 的支持,请在 httpd.conf 档案最后加入下列内容:
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
上述设定完成后,您就可以存盘离开。
接下来,我们必在修改 /etc/rc.conf ,并加入下列设定以在开机时启动 Apache:
apache2_enable="YES"
最后,我们就可以使用下列指令以启动 Apache 了:# /usr/local/etc/rc.d/apache2.sh start
如果您要停止 Apache,可以使用下列指令:# /usr/local/etc/rc.d/apache2.sh stop
我们可以在网页根目录中新增一个档案来测试 PHP 是否有正常运作,请使用文书编辑软件开一个新文件 test.php,并加入下列内容:
接下来您就可以连到该网页 http://192.168.0.1/test.php (请将 192.168.0.1 改成您的主机 IP) 看看是否可以使用 PHP。如果有支持 PHP,则会显示 PHP 组态,如果没有,则只会出现上述档案内容。
13.3 http.conf 说明
/usr/local/etc/apache2/httpd.conf 是 Apache 的主要设定档。档案中有 # 为开头者是批注,用以说明设定的情形及方式,如果一行的开头有 # 的话,该行对 Apache 就不会产生作用。
我们按照 httpd.conf 中各选项出现的顺序说明几个重要的项目,比较不可能更动的项目我们就不在此说明。这些细部 Apache 的设定看起来有点无趣,但不看过一遍不知道有什么是我们可以调整的项目。建议您先大略浏览过即可,日后有调整的需要时,再回过头来参考即可。
ServerRoot 设定 Apache 执行的根目录
ServerRoot 用以设定 Apache 的根目录位置,记录文件、设定文件的相对目录位置。
ServerRoot "/usr/local"
必须注意的是,如果您的此目录设定为 NFS 或是其它以网络挂入的档案系统中,请先阅读
http://httpd.apache.org/docs-2.0/mod/mpm_common.html#lockfile
关于 LockFile 的说明,以避免一些不必须的问题发生。另外,请勿在 ServerRoot 的路径名称最后面加入 "/" 符号。
LockFile 设定 lock 文件的位置
LockFile 通常只有在您的网页数据使用 NFS 挂入时才会需要设定,否则使用默认值即可。如果您有设定 LockFile,LockFile 必须设定在非网络挂入的档案系统中。
#LockFile /var/log/accept.lock
我们看到 LockFile 这个项目被   包起来,这表示当没有使用 winnt 模块时这个设定才会生效。在下列其它设定中,我们会看到有其它的选项也是以   包起来,意思是一样的。
PidFile 设定 httpd.pid 位置
Apache 在启动时,会将自己的 process id 写入 PidFile 中。
PidFile /var/run/httpd.pid
Timeout 设定联机逾时
Timeout 设定了等待 Client 端响应的时间,以秒为单位。如果 Client 端在指定的时间内没有传送任何数据,即切断联机。
Timeout 300
KeepAlive 是否使用保持联机
设定是否使用保持联机的功能 (Presistent Connections)。当 KeepAlive 设为 On 时,一个已经建立的联机会用来处理多个 HTTP 的请求,也就是一个联机会用来传送多个档案,以避免每一个请求都要重新建立新的联机而降低效能。您可以将 KeepAlive 设为 Off 以关闭保持联机的功能。
KeepAlive On
MaxKeepAliveRequests 最多有几个保持联机
设定最多可以有几个 KeepAlive 的联机。您可以将这个项目设为 0 表示无限制。当有太多的保持联机时,会造成系统资源占用太多。但如果是一个忙录的服务器,建议您提高限制,以增加执行效率。
MaxKeepAliveRequests 100
KeepAliveTimeout 保持联机的逾时时间
同一个 Client 的「保持联机」功能,在多少秒后没有联机的请求即为联机逾时。如果二次请求的时间超过这个设定值,联机就会中断。
KeepAliveTimeout 15
prefork MPM 控制 process 数量
您会看到有很多个 StartServers、MinSpareServers、MaxClients 等设定,每个设定都使用   包起来。这是因为不同的平台会使用不同的模块,而设定就会依平台而有所不同。在 FreeBSD 中,我们使用的是 perfork 这个模块,因此,我们只要设定这个模块中的值即可。
在这个群组中,各个项目所代表的意义如下:
StartServers:设定 Apache 在启动时要产生多少个 process 来等待 Client 端的联机。我们使用默认值即可,除非您的服务器同时会有很多新的联机,则可以提高这个值。
MinSpareServers:最小要保持多少个空闲的 Apache process 以等待客户端的联机。除非您的网站真的很忙,否则这个值不需要设得太大,太大只会造成资源浪费。
MaxSpareServers:设定最多要有多少个空闲的 Apache process。如果您没有设定这个值,则 Apache 会自动将它设为 MinSpareServers+1。如果有太多闲置的 process,Apache 会自动将多余的 process 杀掉。
MaxClients:同时可以有多少个联机。MaxClients 应该是这个群组中最重要的设定,它关系着您的主机可以同时处理多少个联机。这个设定应该和您的系统资源相关,如果您的内存不大,