第二十章、WWW 伺服器

最近更新日期:2011/08/05
我们最常讲的『架站』其实就是架设一个 Web 网站啦!那麽什麽是 Web 呢?那就是全球资讯广播的意思 (World Wide Web),或者也可以称之为互连网吧!这个是我们目前的人类最常使用的 Internet 的协定之一啦!通常说的上网就是使用 WWW 来查询使用者所需要的资讯罗!目前在 Unix-Like 系统中的 WWW 伺服器主要就是透过 Apache 这个伺服器软体来达成的, 而为了动态网站,於是 LAMP (Linux + Apache + MySQL + PHP) 就这麽产生啦!让我们赶紧来进入 LAMP 的世界吧!

20.1 WWW 的简史、资源以及伺服器软体
  20.1.1 WWW 的简史、HTML与标准制订 (W3C)
  20.1.2 WWW 伺服器与浏览器所提供的资源设定 (URL)
  20.1.3 WWW 伺服器的类型:系统、平台、资料库与程式 (LAMP)
  20.1.4 https: 加密的网页资料 (SSL) 及第三方公正单位
  20.1.5 用户端常见的浏览器
20.2 WWW (LAMP) 伺服器基本设定
  20.2.1 LAMP 所需软体与其结构
  20.2.2 Apache 的基本设定 伺服器环境, 中文编码, 目录权限 (DocumentRoot, Directory)
  20.2.3 PHP 的预设参数修改PHP资安设定, 上传档案容量
  20.2.4 启动 WWW 服务与测试 PHP 模组
  20.2.5 MySQL 的基本设定启动与帐号设定, 修改 /etc/my.cnf, root 密码处理
  20.2.6 防火墙设定与 SELinux 的规则放行
  20.2.7 开始网页设计及安装架站软体,如 phpBB3
20.3 Apache 伺服器的进阶设定
  20.3.1 启动用户的个人网站(权限是重点)URL 权限与 SELinux
  20.3.2 启动某个目录的 CGI (perl) 程式执行权限
  20.3.3 找不到网页时的显示讯息通知
  20.3.4 浏览权限的设定动作 (order, limit)
  20.3.5 伺服器状态说明网页
  20.3.6 .htaccess 与认证网页设定
  20.3.7 虚拟主机的设定 (重要!)
20.4 登录档分析以及 PHP 强化模组
  20.4.1 PHP 强化模组 (eaccelerator) 与 Apache 简易效能测试
  20.4.2 syslog 与 logrotate
  20.4.3 登录档分析软体:webalizer
  20.4.4 登录档分析软体:awstats
20.5 建立连线加密网站 (https) 及防砍站脚本
  20.5.1 SSL 所需软体与凭证档案及预设的 https
  20.5.2 拥有自制凭证的 https
  20.5.3 将加密首页与非加密首页分离
  20.5.4 防砍站软体
20.6 重点回顾
20.7 本章习题
20.8 参考资料与延伸阅读
20.9 针对本文的建议:http://phorum.vbird.org/viewtopic.php?p=116564

20.1 WWW 的简史、资源以及伺服器软体


你知道网路为什麽会这麽流行吗?其实都是 WWW 造成的啦。早在 1993 年左右,鸟哥初次接触到网路, 当时的网路较热门的大概就是一些资源下载的 FTP 网站以及很多文字热烈讨论的 BBS 站了。 资料虽然丰富,不过,总是觉得少了点什麽。後来上了研究所,为了课业需要, 经常连上台湾的学术网路 (TANET) 进行一些学术资料的检索,当时大约是 1996 年左右。 因为上网就是要找资料而已,所以就慢慢的很少使用网路了。

过了几年後,再次使用图形介面的作业系统,竟然发现只要点几个小按钮,就会有很多网路上花花绿绿的文字与图案, 有的网站甚至提供影音的特效,当时真是相当的讶异!不过,由於图形影像的视觉方面要比 BBS 纯文字的资料吸引人,自然造成很多人喜欢流连在网际网路上,人潮多当然就有商机!由於奇货可居,才有後来 90 年代末期的浏览器大战,这个商业大战也造成後来 WWW 标准不被某些浏览器所支援的後果。

这些年由於搜寻引擎、个人网志 (blog)、社群网站 (例如 facebook 等)、智慧手机等的流行,又将网际网路推向另一个新境界!啊! 要学的东西真是很多啊~@_@。底下让我们来了解了解什麽是 WWW 以及他所需要的伺服器软体,还有一些浏览器相关的资讯吧!


20.1.1 WWW 的简史、HTML 与标准制订 (W3C)

网际网路 (TCP/IP) 会这麽热门,主要是 80 年代的 email 以及 90 年代之後的 WWW 服务所造成的!尤其是 WWW 这个玩意儿。 WWW 是 World Wide Web 的缩写,其中 Web 有广播网的意思存在, 所以简称为全球资讯网的就是了。WWW 可以结合文字、图形、影像以及声音等多媒体,并透过可以让滑鼠点击的超连结 (Hyperlink) 的方式将资讯以 Internet 传递到世界各处去。

与其他的伺服器类似的,你要连结上 WWW 网站时,该网站必需要提供一些资料, 而你的用户端则必需要使用可以解析这些资料的软体来处理,那就是浏览器啦!简单的来说,你可以这样瞧一瞧 WWW server/client 的相关性:

WWW 伺服器与用户端浏览器之间的连线相关性
图 20.1-1、WWW 伺服器与用户端浏览器之间的连线相关性

从上面的图示当中,我们大概可以得到一些观念:

  • WWW 伺服器不但需要一个可让用户端浏览的平台,还需要提供用户端一些资料才行!
  • 伺服器所提供的最主要资料是超文件标签语言 (Hyper Text Markup Language, HTML)、多媒体档案 (图片、影像、声音、文字等,都属於多媒体或称为超媒体)。
  • HTML 只是一些纯文字资料,透过所谓的标签 () 来规范所要显示的资料格式;
  • 在用户端,透过浏览器的对 HTML 以及多媒体的解析,最後呈现在使用者的萤幕上。


  • HTML 的格式

如上所提到的相关资讯,我们知道伺服器端需要提供用户端一些资料,而这些资料其实主要都以 HTML 的格式来呈现的。那麽什麽是 HTML 呢?我们拿鸟哥的网站来看一下好了。你可以使用任何一个浏览器连结到 http://linux.vbird.org,然後在其上的页面上按下滑鼠右键, 选择察看原始码,你就能发现该网页是如何写成的了。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh-TW" lang="zh-TW">
<head>
....一些此页面的资讯解释的标头资料,例如 title 与整体化设计等等....

<body style="margin:0; padding:0">
....在浏览器显示的画面中,实际放置在浏览器上面的资料则写於此....


HTML 之所以被称为标签语言就如同上面的表格所示,他是由很多 所组成的,除了 的部分是在宣告底下的语法应该用第几版的 HTML 解析之外,HTML 主要是由 所包含起来, 而在其中又分为两大区块,一个是与标头有关的 区块, 包括该网页所使用的编码格式与抬头等等。另一部份则是 所含有的实际网页内容资料啦

HTML 不在本文的介绍内,你可以在市面上找到很多相关的书籍。而传统的 HTML 4 实际上已经不足以满足某些美工人员及程式设计师的需求,因此,目前还有改善 HTML 显示的 CSS 样式表, 可以让很多程式互相取用的 XML,还有最新一代的 HTML5 等等,都值得参考喔。


  • WWW 所用的协定及 WWW 伺服器简史--就是讲古时间

知道了 WWW 的 server/client 架构後,再来我们要讨论的是,那 WWW 是怎麽来的啊? 伯纳斯-李 (Tim Berners-Lee) 在 1980 年代为了更有效率的让欧洲核子物理实验室的科学家可以分享及更新他们的研究成果, 於是他发展出一个超文件传输协定 (Hyper Text Transport Protocol, HTTP)。 如同前面提到的,在这个协定上面的伺服器需要软体,而用户端则需要浏览器来解析伺服器所提供的资料。 那麽这些软体怎麽来的?

为了让 HTTP 这个协定得以顺利的应用,大约在 90 年代初期由伊利诺大学的国家超级电脑应用中心 (NCSA, http://www.ncsa.illinois.edu/) 开发出伺服器 HTTPd (HTTP daemon 之意)。HTTPd 为自由软体,所以很快的领导了 WWW 伺服器市场。 後来网景通讯 (Netscape) 开发出更强大的伺服器与相对应的用户端浏览器,那就是大家曾经熟悉的 Netscape 这套软体啦。这套软体分为伺服器与浏览器,其中浏览器相对便宜,不过伺服器可就贵的吓人了。 所以,在伺服器市场上主要还是以 HTTPd 为主的。

後来由於 HTTPd 这个伺服器一直没有妥善的发展,於是一群社群朋友便发起一个计画,这个计画主要在改善原本的 HTTPd 伺服器软体,他们称这个改良过的软体为 Apache,取其『一个修修改改的伺服器 (A patch server)』的双关语! ^_^!这个 Apache 在 1996 年以後便成为 WWW 伺服器上市占率最高的软体了 (http://httpd.apache.org/)。


  • 浏览器 (browser) 大战与支援的标准

虽然 WWW 越来越重要,但相对的来说,用户端如果没有浏览器的话那麽他们当然就无法去浏览 WWW 伺服器所提供的资料。为了抢占浏览器的市占率,於是在 90 年代末期微软将 IE 浏览器内建在 Windows 作业系统内,此一决定也让当时相当广泛使用的 Netscape 浏览器 (Navigator) 市占率急速下降。 後来网景公司在 1998 年左右将浏览器的原始码部分开放成为自由软体,采用 Mozilla 通用授权 (MPL) 。

Mozilla (http://www.mozilla.org/) 这个计画所开发的软体可不止浏览器而已,还包括邮件处理软体及网页编辑软体等等。 当然啦,其中最出名的就是浏览器软体『火狐狸 (firefox)』啦!那这玩意儿与 IE 有啥不同? 由於 IE 是整合在 Windows 作业系统核心内, 加上改版的幅度太慢,甚至 IE 使用的 HTML 标准语法解析行为都是微软自订的标准, 并不全然符合网际网路上的标准规范 (W3C, http://www.w3.org/),导致伺服器端所提供的资料并无法在所有的浏览器上都显示出相同的样式, 而且用户端也容易受到网路攻击。

firefox (http://moztw.org/) 的发展就标榜小而美,因此程式相当的小,所以执行效能上面非常的快速,此外,对於超文件的解析上面, firefox 主要依据 w3c 所制订的标准来发展的,所以任何以 w3c 的标准开发的网站,在 firefox 上面就能够得到设计者所希望的样式!目前 firefox 已经针对市面上最常见到的 Windows/Linux/Unix 等作业系统来进行支援,大家可以多多使用喔!^_^

而为了加快 javascript 的程式运作,并且加快浏览的速度,Google 自己也推出一个浏览器,称为 chrome 浏览器, 这个浏览器就如 google 的搜寻引擎一般,强调的就是快速!快速!更快速!因此,如果你想要浏览器不要花花绿绿, 就是风格简约,强调速度感,那麽 google 的这个 chrome 自由软体浏览器也可以玩玩的!

由上面的介绍我们可以稍微归纳一下:

  • WWW 是依据 HTTP 这个协定而来的,分为伺服器端与用户端;
  • Apache 是一个伺服器端的软体,主要依据 NCSA 的 HTTPd 伺服器发展而来,为自由软体;
  • Mozilla 是一个自由软体的开发计画,其中 firefox 浏览器是相当成功的作品。
  • 在撰写自己的网页资料时,尽量使用 W3C 所发布的标准,这样在所有的浏览器上面才能够顺利的显示出你想要的样子。

20.1.2 WWW 伺服器与浏览器所提供的资源设定 (URL)

现在我们知道 WWW 伺服器的重点是提供一些资料,这些资料必需要是用户端的浏览器可以支援显示才行。 那麽这些资料是什麽类型啊?很简单啊,当然大部分就是档案罗。如此说来,我们必需要在伺服器端先将资料档案写好, 并且放置在某个特殊的目录底下,这个目录就是我们整个网站的首页了! 一般来说,这个目录很可能是在 /var/www/html/ 或者是 /srv/www/。我们的 CentOS 预设在 /var/www/html 喔。

那麽浏览器如何取得这个目录内的资料呢?你必需要在浏览器的『网址列』输入所需要的网址才行。 这个网址就对应到 WWW 伺服器的某个档案档名就是了。不过,现今的浏览器功能实在很多,他不只可以连上 WWW ,还可以连上类似 FTP 之类的网路通讯协定。所以你得要在网址列输入正确的网址,这个网址包括这样:

  • <协定>://<主机位址或主机名称>[:port]/<目录资源>


  • 网址列的意义

上头就是我们常常听到的 URL (Uniform Resource Locator) 啦!以斜线作为分段, 它可以这样被解释:

  • 协定

    浏览器比较常支援的协定有 http, https, ftp, telnet 等等,还有类似 news, gopher 等。 这个协定在告知浏览器『请你利用此一协定连接到伺服器端』的意思。举例来说,如果你下达: http://ftp.ksu.edu.tw 这表示浏览器要连结到 崑山科大的 http (亦即 port 80) 的意思。如果是 ftp://ftp.ksu.edu.tw 则代表连结到 ftp (port 21) 啦! 因为使用的协定不同,所以当然回应的资料也不相同的。不过, 万一对方伺服器的埠口启动在非正规的埠号,例如将 http 启动在 port 81 时,那你就得要这样写: http://hostname:81/ 。

  • 主机位址或主机名称

    就是伺服器在网际网路所在的 IP 位置。如果是主机名称的话,当然得要透过名称解析器罗! 一般来说,虽然使用 IP 就能够架设 WWW 网站,不过建议你还是申请一个好记又合法的主机名称比较好!

  • 目录资源:

    刚刚不是提到首页的目录吗?在首页目录下的相对位置就是这个目录资源啦。 举例来说,鸟哥的网站 www 资料放置在我主机的 /var/www/html/ 当中,所以说:

    • http://linux.vbird.org --> /var/www/html/
    • http://linux.vbird.org/linux_basic/index.php --> /var/www/html/linux_basic/index.php

    另外,通常首页目录底下会有个特殊的档案名称,例如 index.html 或 index.??? 等。举例来说,如果你直接按下: http://linux.vbird.org 会发现其实与 http://linux.vbird.org/index.php 是一样的! 这是因为 WWW 伺服器会主动的以该目录下的『首页』来显示啦!

所以啦,我们的伺服器会由於浏览器传来的要求协定不同而给予不一样的回应资料。那你了解到网址列的意义了吗?


  • WWW server/client 间资料传输的方式

如果浏览器是以 http://hostname 的型态来向伺服器要资料时,那麽浏览器与伺服器端是如何传递资料的呢? 基本上有这几种方法:

  • GET
    就是浏览器直接向 WWW 伺服器要求网址列上面的资源,这也是最常见的。此外,使用 GET 的方式可以直接在网址列输入变数喔。举例来说,鸟哥的讨论区有一篇提问的智慧, 他的网址是:『http://phorum.vbird.org/viewtopic.php?t=96』,发现那个 ?t=96 了吗? t 就是变数, 96 就是这个变数的内容。如果你将问号後面的资料拿掉时,瞧瞧会出现什麽後果? 这麽说,你可以明白 GET 的处理了吧?

  • POST
    这也是用户端向伺服器端提出的要求,只是这个要求里面含有比较多的资料就是了。 举例来说,讨论区里面不是常常有留言的选项吗,如果你选择留言的话不是会在浏览器冒出一个框框让你填入资料吗! 当按下传送後,那些框框内的资料就会被浏览器包起来传送至 WWW 伺服器了。 POST 与 GET 不相同喔, GET 可以在网址列取得用户端所要求的变数,不过 POST 就不是使用网址列的功能了

  • HEAD
    伺服器端回应给 Client 端的一些资料档头而已;

  • OPTIONS
    伺服器端回应给 Client 端的一些允许的功能与方法;

  • DELETE
    删除某些资源的举动。

常见的是 GET 这个项目啦!如果有大量资料由用户端上传到 WWW 伺服器端时,才会使用到 POST 这个项目。 你还是得需要注意一下这些举动,因为後续的登录档分析内容都是使用这种动作来分析的呦!


20.1.3 WWW 伺服器的类型: 系统、平台、资料库与程式 (LAMP)

以目前的网路世界来说,市占率较高的 WWW 伺服器软体应该是 Apache 与 IIS 这两个玩意儿, Apache 是自由软体,可以在任何作业系统上面安装的,至於 IIS 则是 Windows 家族开发出来的, 仅能在 Windows 作业系统上面安装与执行。由於作业系统平台不一样,所以其上安装的软体当然也不相同。 底下就让我们来聊一聊目前网站的一些特色吧!


  • 仅提供使用者浏览的单向静态网页

这种类型的网站大多是提供『单向静态』的网页,或许有提供一些动画图示,但基本上就仅止於此啦! 因为单纯是由伺服器单向提供资料给客户端,Server 不需要与 Client 端有互动,所以你可以到该网站上去浏览, 但是无法进行进行资料的上传喔!目前主要的免费虚拟主机大多是这种类型。所以,你只要依照 HTML 的语法写好你的网页,并且上传到该网站空间上,那麽你的资料就可以让大家浏览了!


  • 提供使用者互动介面的动态网站

这种类型的网站可以让伺服器与使用者互动,常见的例如讨论区论坛与留言版,包括一些部落格也都是属於这类型。 这类型的网站需要的技术程度比较高,因为他是藉由『网页程式语言』来达成与使用者互动的行为, 常见的例如 PHP 网页程式语言,配合 MySQL 资料库系统来进行资料的读、写。整个互动可以使用下图来说明:

动态网站的网页程式语言与资料库介面
图 20.1-2、动态网站的网页程式语言与资料库介面

这就是所谓的伺服器端工作任务介面 (Server Side Include, SSI),因为不论你要求的资料是什麽,其实都是透过伺服器端同一支网页程式在负责将资料读出或写入资料库, 处理完毕後将结果传给用户端的一种方式,变动的是资料库内的资料,网页程式其实并没有任何改变的。这部份的网页程式包括 PHP, ASP, Perl...很多啦!

另外一种互动式的动态网页主要是在用户端达成的!举例来说,我们可以透过利用所谓的 Java scripts 这种语法, 将可执行的程式码 (java script) 传送给用户端,用户端的浏览器如果有提供 java script 的功能, 那麽该程式就可以在用户端的电脑上面运作了。由於程式是在用户端电脑上执行, 因此如果伺服器端所制作的程式是恶意的,那麽用户端的电脑就可能会遭到破坏。 这也是为啥很多浏览器都已经将一些危险的 java script 关闭的原因。

另外一种可在用户端执行的就是 flash 动画格式,在这种动画格式内还可以进行程式设计, 因此用户端只要拥有可以执行 flash 动画的软体,那就可以利用这个软体来达到互动式的对谈。 这些都算是动态网站所提供的功能喔!

从上面的说明你可以知道动态网站是目前比较热门的,像是近两年来如同雨後春笋一般冒出来的个人部落格 (blog) 就是很经典的动态网站之一。而由图 20.1-2 我们也知道要做成这样的动态网站你必需要有:

  • 支援的作业系统:让所需要的软体都能够安装执行啊;
  • 可运作的 WWW 伺服器:例如 Apache 与 IIS 等 WWW 伺服器平台软体;
  • 网页程式语言:包括 perl, PHP, JSP, CGI, ASP 等等都算是啦!
  • 资料储存之资料库系统:包括 MySQL, MSSQL, PostgreSQL 以及甲骨文 (Oracle) 等等。


  • LAMP 平台的说明

在整个平台设计上面,目前常见的有两大系统,一个是 Linux 作业系统上面,搭配 Apache + MySQL + PHP 等而达成,这个系统被称为 LAMP。另一个则是微软的 IIS + MSSQL + ASP (.NET) 伺服器。在能见度与市占率方面,应该还是以 LAMP 为主吧!在 LAMP 里面除了 Linux 之外,其他三个小东西就让我们来谈谈先:

  • Apache (http://www.apache.org)

    1995 年以前就有很多的 WWW 伺服器软体,其中以 HTTPd 占有率较高。 後来 HTTPd 经过多次臭虫的修订後,才在 1995 年後发布 Apache (A patch server) 的啦!这东西就是主要提供 WWW 的伺服器平台,後面谈到的 PHP 必须要在这玩意儿上才能运作!

  • MySQL (http://www.mysql.org/)

    传统的档案读取是很麻烦的,如果你只要读取该档案当中的一小部分,系统还是会将整个档案读出来, 若又有多人同时读取同一个档案时,那就会造成效能与系统上的问题,所以才会有资料库系统的推出。 资料库其实是一种特殊格式的档案,这种档案必需要透过特殊介面 (资料库软体) 来进行读写。由於这个特殊介面已经针对资料的查询、写入做过最佳化设计, 因此很适合多人同时写入与查询的工作。

    针对资料库的语法有所谓的 SQL 标准语法,任何根据这种资料检索语法发展出来的资料库,就称为 SQL 资料库。 比较知名的自由软体资料库系统有 MySQL 及 PostgreSQL ,其中 MySQL 的使用率又比较高一些。 MysQL 可以透过网页程式语言来进行读写的工作,因此很适合例如讨论区、论坛等的设计, 甚至很多商业网站的重要资料也是透过 MySQL 这个资料库软体来存取的呢!

  • PHP (http://www.php.net/)

    按照官方的说法来说,PHP 是一个工具,他可以被用来建立动态网页,PHP 程式码可以直接在 HTML 网页当中嵌入, 就像你在编辑 HTML 网页一样的简单。所以说, PHP 是一种『程式语言』,这种程式语言可以直接在网页当中编写, 不需要经过编译即可进行程式的执行。由於具有:自由软体、跨平台、容易学习及执行效能高等优点, 目前是很热门的一个设计网页的咚咚喔!你可以在市面上找到很多相关的书籍来参考的。

Tips:
事实上,如果光学会 Linux 与架站,对你自己的竞争力还是不够的,可以的话,多学一些 MySQL 的 SQL 语法,以及类似 PHP, JSP 等跨平台的网页程式语言,对你的未来是很有帮助的喔!
鸟哥的图示

20.1.4 https: 加密的网页资料 (SSL) 及第三方公正单位

关於 HTTP 这个传输协定当中,你必需要知道的是:『这个传输协定传输资料是以明码传送的』, 所以你的任何资料封包只要被监听窃取的话,那麽该资料就等於是别人的啦!那想一想, 你有过上线刷卡的经验吗?上线刷卡只要输入你信用卡的卡号与相关的截止日期後,就能够进行交易了。 如果你的资料在 Internet 上面跑时是明码的情况下,真要命!那你的信用卡不就随时可能会被盗用?

虽然大多数 Internet 上面的 WWW 网站所提供的资料是可以随意浏览的,不过如同上面提到的, 一些物流交易网站的资料以及关於你个人的重要机密资料当然就不能这样随意传送啦! 这个时候就有需要用到 https://hostname 这种连线的方式啦!这种方式是透过 SSL 加密的机制喔!


  • Secure Socket Layer (SSL)

还记得我们在第十一章的 SSH 伺服器当中介绍过他连线的机制吧? 就是利用非对称的 key pair (Public + Private kye) 来组成金钥,然後透过公钥加密後传输, 传输到目标主机後再以私钥来解密,如此一来资料在 Internet 上面跑就以加密的方式, 想当然尔,这些资料自然就比较安全啦!SSL 就是利用在 WWW 传输上面的加密方式之一啦!

当浏览器端与 WWW 伺服器端同时支援 SSL 的传输协定时,在连线阶段浏览器与伺服器就会产生那把重要的金钥! 产生金钥後就能够利用浏览器来传送与接收加密过的重要资料啦!要达成这样的机制, 你的 WWW 伺服器必需要启动 https 这个重要的传输协定,而浏览器则必需要在网址列输入 https:// 开头的网址,那两者才能够进行沟通与连线。要注意的是,在某些很旧的浏览器上面是不支援 SSL 的, 所以在那些旧的浏览器上就无法达成 https 的连线啦!


  • Certificate Authorities (CA)

想一想 SSL 这个机制有什麽问题?他的问题就是:『那把 Public key 是伺服器产生且任何人都能取得的』!这是什麽问题?因为 public key 可让任何人取得, 若被钓鱼网站取得并且制作一个很类似你网路银行的网站,并且骗你输入帐密,要命了!因为你不知道该网站是诈骗集团制作的, 以为 https 就是安全的,如此一来,即使你的资料有加密,但结果,在钓鱼网站伺服器端还是能够取得你输入的帐密啊! 这个时候就需要第三方公正单位来帮忙啦!

所谓的 CA 就是一个公认的公正单位,你可以自行产生一把金钥且制作出必要的凭证资料并向 CA 单位注册 (讲到注册你就要知道...这东西是要钱的意思!),那麽当用户端的浏览器在浏览时,该浏览器会主动的向 CA 单位确认该凭证是否为合法注册过的,如果是的话,那麽该次连线才会建立,如果不是呢?那麽浏览器就会发出警告讯息, 告知使用者应避免建立连线啊。所以说,如此一来 WWW 伺服器不但有公正单位的背书,使用者在建立连线时也比较有保障!

更多关於 SSL 以及 CA 的介绍,可以约略参考一下:


20.1.5 用户端常见的浏览器


咱们前面谈到 WWW 伺服器是 Server/Client 的架构,而用户端使用的软体就是浏览器啊! 目前比较知名的自由软体浏览器主要有两款,包括 Mozilla 基金会管理的 firefox (火狐狸) 以及 Google 自行推出的 chrome。至於市占率较高的还有 windows 的 IE。

由於浏览器可以连结到网际网路上,所以浏览器也有可能被攻击! 其中由於 IE 直接内嵌至 Windows 的核心当中,所以如果 IE 有漏洞时,对於系统的损害是很大的! 因此无论如何,请记得『务必要随时更新到最新版本的浏览器』才行。建议你可以使用 firefox 或 chrome 这些小巧玲珑的浏览器啊!

除了视窗介面的浏览器软体之外,其实还有几个可以在文字介面底下进行浏览与网页下载的程式,分别是:

  • links 与 lynx:文字介面的浏览器;
  • wget:文字介面下使用来撷取档案的指令。

这几个指令我们已经在第五章谈过了,请自行前往参考喔!


20.2 WWW (LAMP) 伺服器基本设定


从前面的说明当中,我们知道在 Linux 上面要达成网页伺服器需要 Apache 这套伺服器软体呐!不过 Apache 仅能提供最基本的静态网站资料而已,想要达成动态网站的话,那麽最好还是需要 PHP 与 MySQL 的支援才好。所以底下我们将会以 LAMP 作为安装与设定的介绍,加油吧! ^_^


20.2.1 LAMP 所需软体与其结构


既然我们已经是 Linux 作业系统,而且使用的是号称完全相容於 Red Hat Enterprise Linux 的 CentOS 版本, 那当然只要利用 CentOS 本身提供的 Apache, PHP, MySQL 即可!不建议你自行利用 tarball 安装你的 LAMP 伺服器。因为自行安装不但手续麻烦,而且也不见得比系统预设的软体稳定。 除非你有特殊的需求 (例如你的某些 Apache 外挂程式需要较高的版本,或者是 PHP, MysQL 有特殊版本的需求), 否则请使用 yum 来进行软体的安装即可。

那麽我们的 LAMP 需要哪些东西呢?你必需要知道的是,PHP 是挂在 Apache 底下执行的一个模组, 而我们要用网页的 PHP 程式控制 MySQL 时,你的 PHP 就得要支援 MySQL 的模组才行!所以你至少需要底下几个软体:

  • httpd (提供 Apache 主程式)
  • mysql (MySQL 客户端程式)
  • mysql-server (MySQL 伺服器程式)
  • php (PHP 主程式含给 apache 使用的模组)
  • php-devel (PHP 的发展工具,这个与 PHP 外挂的加速软体有关)
  • php-mysql (提供给 PHP 程式读取 MySQL 资料库的模组)

要注意, Apache 目前有几种主要版本,包括 2.0.x, 2.2.x 以及 2.3.x 等等,至於 CentOS 6.x 则是提供 Apache 2.2.x 这个版本啦。如果你没有安装的话,请直接使用 yum 或者是原本光碟来安装先:

# 安装必要的 LAMP 软体: php-devel 可以先忽略~
[root@www ~]# yum install httpd mysql mysql-server php php-mysql

先来了解一下 Apache 2.2.x 这个版本的相关结构,这样才能够知道如何处理我们的网页资料啊!

  • /etc/httpd/conf/httpd.conf (主要设定档)
    httpd 最主要的设定档,其实整个 Apache 也不过就是这个设定档啦!里面真是包山包海啊!不过很多其他的 distribution 都将这个档案拆成数个小档案分别管理不同的参数。但是主要设定档还是以这个档名为主的! 你只要找到这个档名就知道如何设定啦!

  • /etc/httpd/conf.d/*.conf (很多的额外参数档,副档名是 .conf)
    如果你不想要修改原始设定档 httpd.conf 的话,那麽可以将你自己的额外参数档独立出来, 例如你想要有自己的额外设定值,可以将他写入 /etc/httpd/conf.d/vbird.conf (注意,副档名一定是 .conf 才行) 而启动 Apache 时,这个档案就会被读入主要设定档当中了!这有什麽好处?好处就是当你系统升级的时候, 你几乎不需要更动原本的设定档,只要将你自己的额外参数档复制到正确的地点即可!维护更方便啦!

  • /usr/lib64/httpd/modules/, /etc/httpd/modules/
    Apache 支援很多的外挂模组,例如 php 以及 ssl 都是 apache 外挂的一种喔! 所有你想要使用的模组档案预设是放置在这个目录当中的!

  • /var/www/html/
    这就是我们 CentOS 预设的 apache 『首页』所在目录啦!当你输入『http://localhost』时所显示的资料, 就是放在这个目录当中的首页档 (预设为 index.html)。

  • /var/www/error/
    如果因为伺服器设定错误,或者是浏览器端要求的资料错误时,在浏览器上出现的错误讯息就以这个目录的预设讯息为主!

  • /var/www/icons/
    这个目录提供 Apache 预设给予的一些小图示,你可以随意使用啊!当你输入『http://localhost/icons/』 时所显示的资料所在。

  • /var/www/cgi-bin/
    预设给一些可执行的 CGI (网页程式) 程式放置的目录;当你输入『http://localhost/cgi-bin/』 时所显示的资料所在。

  • /var/log/httpd/
    预设的 Apache 登录档都放在这里,对於流量比较大的网站来说,这个目录要很小心, 因为以鸟哥网站的流量来说,一个星期的登录档资料可以大到 700MBytes 至 1GBytes 左右,所以你务必要修改一下你的 logrotate 让登录档被压缩,否则...

  • /usr/sbin/apachectl
    这个就是 Apache 的主要执行档,这个执行档其实是 shell script 而已, 他可以主动的侦测系统上面的一些设定值,好让你启动 Apache 时更简单!

  • /usr/sbin/httpd
    呵呵!这个才是主要的 Apache 二进位执行档啦!

  • /usr/bin/htpasswd (Apache 密码保护)
    在某些网页当你想要登入时你需要输入帐号与密码对吧!那 Apache 本身就提供一个最基本的密码保护方式, 该密码的产生就是透过这个指令来达成的!相关的设定方式我们会在 WWW 进阶设定当中说明的。

至於 MySQL 方面,你需要知道的几个重要目录与档案有:

  • /etc/my.cnf
    这个是 MySQL 的设定档,包括你想要进行 MySQL 资料库的最佳化,或者是针对 MySQL 进行一些额外的参数指定, 都可以在这个档案里面达成的!

  • /var/lib/mysql/
    这个目录则是 MySQL 资料库档案放置的所在处啦!当你有启动任何 MySQL 的服务时, 请务必记得在备份时,这个目录也要完整的备份下来才行啊!

另外,在 PHP 方面呢,你应该也要知道几个档案喔:

  • /etc/httpd/conf.d/php.conf
    那你要不要手动将该模组写入 httpd.conf 当中?不需要的,因为系统主动将 PHP 设定参数写入这个档案中了! 而这个档案会在 Apache 重新启动时被读入,所以 OK 的啦!

  • /etc/php.ini
    就是 PHP 的主要设定档,包括你的 PHP 能不能允许使用者上传档案?能不能允许某些低安全性的标志等等, 都在这个设定档当中设定的啦!

  • /usr/lib64/httpd/modules/libphp5.so
    PHP 这个软体提供给 Apache 使用的模组!这也是我们能否在 Apache 网页上面设计 PHP 程式语言的最重要的咚咚! 务必要存在才行!

  • /etc/php.d/mysql.ini, /usr/lib64/php/modules/mysql.so
    你的 PHP 是否可以支援 MySQL 介面呢?就看这两个东西啦!这两个咚咚是由 php-mysql 软体提供的呢!

  • /usr/bin/phpize, /usr/include/php/
    如果你未来想要安装类似 PHP 加速器以让浏览速度加快的话,那麽这个档案与目录就得要存在, 否则加速器软体可无法编译成功喔!这两个资料也是 php-devel 软体所提供的啦!

基本上我们所需要的几个软体他的结构就是这样啦!上面提到的是 Red Hat 系统 (RHEL, CentOS, FC) 所需的资料, 如果是 SuSE 或其他版本的资料,请依照你的 distribution 管理软体的指令 (rpm 或 dpkg) 去查询一下, 应该就能够知道各个重要资料放置在哪里啦!这些资料很重要,你必需要对放置的地点有点概念才行喔!


20.2.2 Apache 的基本设定


在开始设定 Apache 之前,你要知道由於主机名称对於 WWW 是有意义的,所以虽然利用 IP 也能架设 WWW 伺服器, 不过建议你还是申请一个合法的主机名称比较好。 如果是暂时测试用的主机所以没有主机名称时,那麽至少确定测试用主机名称为 localhost 且在你的 /etc/hosts 内需要有一行:

[root@www ~]# vim /etc/hosts
127.0.0.1   localhost.localdomain localhost

这样在启动你的 Apache 时才不会发生找不到完整主机名称 (FQDN) 的错误讯息。此外, Apache 只是个伺服器平台而已,你还需要了解 HTML 以及相关的网页设计语法, 如此才能丰富你的网站。对於想要设计网页的朋友来说,应用软体或许是很好入门, 不过想要完整的了解网站设计的技巧,还是研究一下基础的 HTML 或 CSS 比较妥当。

如果你真的对於一些基础语法有兴趣,并且也想要开发一些所谓的『无障碍网页空间』的话,那麽可以造访一下 http://www.w3c.org 所列举的标准语法,或者是行政院的无障碍网页空间申请规范 (http://www.webguide.nat.gov.tw) 相信会有所收获的啦!

终於要来谈一谈如何设定 Apache 这个 httpd.conf 设定档了!再次强调,每个 distribution 的这个档案内容都不很相同,所以你必需要自行找出相关的设定档才行喔!那麽这个 httpd.conf 的设定为何呢?他的基本设定格式是这样的:

<设定项目>
    此设定项目内的相关参数
    ...........

举例来说,如果你想要针对我们的首页 /var/www/html/ 这个目录提供一些额外的功能,那麽:


    Options Indexes
    ...........

几乎都是这样的设定方式喔!特别留意的是,如果你有额外的设定时,不能随便在 httpd.conf 里头找地方写入!否则如果刚好写在 ... 里面,呼呼! 那麽就会发生错误啦!需要前前後後的找一找喔!或者是在档案的最後面加入也行!好啦,底下咱们先来聊一聊 Apache 伺服器的基础设定吧!

Tips:
事实上在 Apache 的网页有提供很多详细的文件资料,真的是很详细啦! 鸟哥在底下仅是介绍一些惯用的设定项目的意义而已。有兴趣的话,请务必要前往查阅:
Apache 2.2 核心文件:http://httpd.apache.org/docs/2.2/mod/core.html
鸟哥的图示

  • 针对伺服器环境的设定项目

Apache 针对伺服器环境的设定项目方面,包括回应给用户端的伺服器软体版本、主机名称、伺服器设定档顶层目录等。 底下咱们就来谈一谈:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
ServerTokens OS
# 这个项目在仅告知用户端我们伺服器的版本与作业系统而已,不需要更动他。
# 如果不在乎你系统的资讯被远端的用户查询到,则可以将这个项目注解掉即可(不建议)

ServerRoot "/etc/httpd"
# 伺服器设定的最顶层目录,有点类似 chroot 那种感觉。包括 logs, modules
# 等等的资料都应该要放置到此目录底下 (若未宣告成绝对路径时)

PidFile run/httpd.pid
# 放置 PID 的档案,可方便 Apache 软体的管理啦!只有相对路径吧!
# 考虑 ServerRoot 设定值,所以档案在 /etc/httpd/run/httpd.pid !

Timeout 60
# 不论接收或传送,当持续连线等待超过 60 秒则该次连线就中断。
# 一般来说,此数值在 300 秒左右即可,不需要修改这个原始值啦。

KeepAlive On    <==最好将预设的 Off 改为 On 啦!
# 是否允许持续性的连线,亦即一个 TCP 连线可以具有多个档案资料传送的要求。
# 举例来说,如果你的网页内含很多图档,那麽这一次连线就会将所有的资料送完,
# 而不必每个图档都需要进行一次 TCP 连线。预设为 Off 请改为 On 较佳。

MaxKeepAliveRequests 500  <==可以将原本的 100 改为 500 或更高
# 与上个设定值 KeepAlive 有关,当 KeepAlive 设定为 On 时,则这个数值可决定
# 该次连线能够传输的最大传输数量。为了增进效能则可以改大一点!0 代表不限制。

KeepAliveTimeout 15
# 在允许 KeepAlive 的条件下,则该次连线在最後一次传输後等待延迟的秒数。
# 当超过上述秒数则该连线将中断。设定 15 差不多啦!如果设定太高 (等待时间较长),
# 在较忙碌的系统上面将会有较多的 Apache 程序占用资源,可能有效能方面的困扰。

   <==底下两个 perfork, worker 与记忆体管理有关!
StartServers       8   <==启动 httpd 时,唤醒几个 PID 来处理服务的意思
MinSpareServers    5   <==最小的预备使用的 PID 数量
MaxSpareServers   20   <==最大的预备使用的 PID 数量
ServerLimit      256   <==伺服器的限制
MaxClients       256   <==最多可以容许多少个用户端同时连线到 httpd 的意思!
MaxRequestsPerChild  4000


StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0

上面的 prefork 及 worker 其实是两个与伺服器连线资源有关的设定项目。预设的项目对於一般小型网站来说已经很够用了, 不过如果你的网站流量比较大时,或许可以修订一下里面的数值呢!这两个模组都是用在提供使用者连线的资源 (process),设定的数量越大代表系统会启动比较多的程序来提供 Apache 的服务,反应速度就比较快。 简单的说,这两个模组的功能分类为:

  • 针对模组的功能分类来说:

    worker 模组占用的记忆体较小,对於流量较大的网站来说,是一个比较好的选择。prefork 虽然占用较大的记忆体,不过速度与 worker 差异不大,并且 prefork 记忆体使用设计较为优秀,可以在很多无法提供 debug 的平台上面进行自我除错,所以,预设的模组就是 prefork 这一个呢!

  • 细部设定的内容方面:(以 Prefork 为例, worker 意义相同)

    • StartServers:代表启动 Apache 时就启动的 process 数量,所以 apache 会用到不止一支程序!
    • MinSpareServers, MaxSpareServers:代表最大与最小的备用程序数量。
    • MaxClients:最大的同时连线数量,也就是 process 不会超过此一数量。现在假设有 10 个人连上来,加上前面的 MinSpareServer=5, MaxSpareServers=20,则 apache 此时的程序数应有 15-30 个之意。而这个最终程序数不可超过 256 个 (依上述设定值)!
    • MaxRequestsPerChild:每个程序能够提供的最大传输次数要求。 举例来说,如果有个使用者连上伺服器後(一个 process),却要求数百个网页,当他的要求数量超过此一数值, 则该程序会被丢弃,另外切换一个新程序。这个设定可以有效的控管每个 process 在系统上的『存活时间』。 因为根据观察所得,新程序的效能较佳啦!

在上面的设定中,比较有趣的是 MaxClients 这个程序模组的参数值,如同上面的说明,这个 MaxClients 设定值可以控制『同时连上 WWW 伺服器的总连线要求』数量,亦即想成最高即时线上人数啦。 不过你要注意的是,MaxClients 的数量不是越高越好,因为他会消耗实体记忆体 (与 process 有关嘛),所以如果你设定太高导致超出实体记忆体能够容许的范围,那麽效能反而会降低 (因为系统会使用速度较慢的 swap 啊),此外, MaxClients 也在 Apache 编译时就指定最大值了,所以你也无法超出系统最大值, 除非...你重新编译 Apache 啦!

除非你的网站流量特别大,否则预设值已经够你使用的了。而如果你的记忆体不够大的话,那麽 MaxClients 反而要调小一点,例如 150 ,否则效能不佳。那,apache 到底是使用那个模组啊?prefork 还是 worker ?事实上 CentOS 将这两个模组分别放到不同的执行档当中,分别是:

  • /usr/sbin/httpd:使用 prefork 模组;
  • /usr/sbin/httpd.worker:使用 worker 模组。

那如何决定你使用的是哪一支程式?你可以去查阅一下 /etc/sysconfig/httpd , 就能够知道系统预设提供 prefork 模组,但你可以透过修改 /etc/sysconfig/httpd 来使用 worker 模组的。 如果你很有好奇心,那麽可以分别试着启动这两种模组啊!接下来,继续瞧瞧其他的伺服器环境设定参数吧!

Listen 80
# 与监听介面有关,预设开放在所有的网路介面啊!也可修改埠口,如 8080

LoadModule auth_basic_module modules/mod_auth_basic.so
....(底下省略)....
# 载入模组的设定项目。Apache 提供很多有用的模组 (就是外挂) 给我们使用了!

Include conf.d/*.conf
# 因为这一行,所以放置到 /etc/httpd/conf.d/*.conf 的设定都会被读入!

User apache
Group apache
# 前面提到的 prework, worker 等模组所启动的 process 之拥有者与群组设定。
# 这个设定很重要,因为未来你提供的网页档案能不能被浏览都与这个身份有关啊!

ServerAdmin vbird@www.centos.vbird  <==改成你自己的 email 吧
# 系统管理员的 email,当网站出现问题时,错误讯息会显示的联络信箱(错误回报)。

ServerName www.centos.vbird    <==自行设定好自己的主机名称较佳!
# 设定主机名称,这个值如果没有指定的话,预设会以 hostname 的输出为依据。
# 千万记得,你填入的这个主机名称要找的到 IP 喔!(DNS 或 /etc/hosts)

UseCanonicalName Off
# 是否使用标准主机名称?如果你的主机有多个主机名称,若这个设定为 On,
# 那麽 Apache 只接受上头 servername 指定的主机名称连线而已。请使用 Off。

在某些特殊的伺服器环境中,有时候你会想要启动多个不同的 Apache,或者是 port 80 已经被使用掉了,导致 Apache 无法启动在预设的埠口。那麽你可以透过 Listen 这个设定值来修改埠口喔!这也是个很重要的设定值。 此外,你也可以将自己的额外设定指定到 /etc/httpd/conf.d/*.conf 内,尤其是虚拟主机很常使用这样的设定,在移机时会很方便的


  • 针对中文 big5 语系编码的设定参数修改

目前的网际网路传输资料编码多是以万国码 (UTF-8) 为主,不过在台湾还是有相当多的网站使用的是 Big5 的繁体中文编码啊!如果你的 Apache 预设是以 UTF-8 编码来传输资料,但你 WWW 的资料却是 big5 , 那麽用户端将会看到『乱码』!虽然可以透过调整浏览器的编码来让资料正确显示,不过总是觉得很讨厌。 此时,你应该可以调整一下底下的参数喔!

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 找到底下这一行,应该是在 747 行左右
# AddDefaultCharset UTF-8  <==请将她注解掉!

这个设定值的意义是说,让伺服器传输『强制使用 UTF-8 编码』的讯息给用户端浏览器,因此不论网页内容写什麽, 反正在用户端浏览器都会预设使用万国马来显示的意思。那如果你的网页使用的是非万国码的语系编码, 此时就会在浏览器内出现乱码了!非常讨厌~所以这里当然需要注解掉。 你必须要注意的是,如果你已经在用户端上面浏览过许多页面,那麽你修改过这个设定值後,仍然要将浏览器的快取 (cache) 清除才行!否则相同页面仍可能会看到乱码!网友们已经回报过很多次了, 这不是 Apache 的问题,而是用户端浏览器的快取所产生的啦!记得处理处理!

语系编码已经取消预设值,那我怎麽知道我的网页语系在用户端会显示的是哪一个?其实在网页里面本来就有宣告了:



	charset=big5" >
	....(其他省略)....

你应该要修订的是上述的特殊字体处,而不是透过 Apache 提供预设语系才对!


  • 网页首页及目录相关之权限设定 (DocumentRoot 与 Directory)

我们不是讲过 CentOS 的 WWW 预设首页放置在 /var/www/html 这个目录吗?为什麽呢?因为 DocumentRoot 这个设定值的关系啦!此外,由於 Apache 允许 Internet 对我们的资料进行浏览, 所以你当然必须要针对可被浏览的目录进行权限的相关设定,那就是 这个设定值的重要特色!先让我们来看看预设的主网页设定吧!

[root@www ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"  <==可以改成你放置首页的目录!
# 这个设定值规范了 WWW 伺服器主网页所放置的『目录』,虽然设定值内容可以变更,
# 但是必须要特别留意这个设定目录的权限以及 SELinux 的相关规则与类型(type)!


    Options FollowSymLinks
    AllowOverride None

# 这个设定值是针对 WWW 伺服器的『预设环境』而来的,因为针对『/』的设定嘛!
# 建议保留上述的预设值 (上头资料已经是很严格的限制),相关参数容後说明。

         <==针对特定目录的限制!底下参数很重要!
    Options Indexes FollowSymLinks  <==建议拿掉 Indexes 比较妥当!
    AllowOverride None
    Order allow,deny
    Allow from all

这个地方则是针对 /var/www/html 这个目录来设定权限啦!就是咱们首页所在目录的权限。 主要的几个设定项目的意义是这样的 (这些设定值都很重要!要仔细看喔!):

  • Options (目录参数)

    此设定值表示在这个目录内能够让 Apache 进行的动作,亦即是针对 apache 的程序的权限设定啦!主要的参数值有:

    • Indexes:如果在此目录下找不到『首页档案 (预设为 index.html) 』时, 就显示整个目录下的档案名称,至於『首页档案档名』则与 DirectoryIndex 设定值有关。

    • FollowSymLinks:这是 Follow Symbolic Links 的缩写, 字面意义是让连结档可以生效的意思。我们知道首页目录在 /var/www/html,既然是 WWW 的根目录,理论上就像被 chroot 一般! 一般来说被 chroot 的程式将无法离开其目录,也就是说预设的情况下,你在 /var/www/html 底下的连结档只要连结到非此目录的其他地方,则该连结档预设是失效的。 但使用此设定即可让连结档有效的离开本目录。

    • ExecCGI:让此目录具有执行 CGI 程式的权限,非常重要!举例来说,之前热门的 OpenWebMail 使用了很多的 perl 的程式,你要让 OpenWebMail 可以执行,就得要在该程式所在目录拥有 ExecCGI 的权限才行喔!但请注意,不要让所有目录均可使用 ExecCGI

    • Includes:让一些 Server-Side Include 程式可以运作。建议可以加上去!

    • MultiViews:这玩意儿有点像是多国语言的支援,与语系资料 (LanguagePriority) 有关。最常见在错误讯息的回报内容,在同一部主机中,可以依据用户端的语系而给予不同的语言显示呢! 预设在错误回报讯息当中存在,你可以检查一下 /var/www/error/ 目录下的资料喔!

  • AllowOverride (允许的覆写参数功能)

    表示是否允许额外设定档 .htaccess 的某些参数覆写?我们可以在 httpd.conf 内设定好所有的权限,不过如此一来若使用者自己的个人网页想要修改权限时将会对管理员造成困扰。因此 Apache 预设可以让使用者以目录底下的 .htaccess 档案内覆写 内的某些功能参数。 这个项目则是在规定 .htaccess 可以覆写的权限类型有哪些。常见的有:

    • ALL:全部的权限均可被覆写;
    • AuthConfig:仅有网页认证 (帐号密码) 可覆写;
    • Indexes:仅允许 Indexes 方面的覆写;
    • Limits:允许使用者利用 Allow, Deny 与 Order 管理可浏览的权限;
    • None:不可覆写,亦即让 .htaccess 档案失效!

    这部份我们在进阶设定时会再讲到的!

  • Order, Allow, Deny (能否登入浏览的权限)

    决定此目录是否可被 apache 的 PID 所浏览的权限设定啦!能否被浏览主要有两种判定的方式:

    • deny,allow:以 deny 优先处理,但没有写入规则的则预设为 allow 喔。
    • allow,deny:以 allow 为优先处理,但没有写入规则的则预设为 deny 喔。

    所以在预设的环境中,因为是 allow,deny 所以预设为 deny (不可浏览),不过在下一行有个 Allow from all,allow 优先处理,因此全部 (all) 用户端皆可浏览啦!这部份我们会在 20.3.4 进阶安全设定当中再提及滴。

除了这些资料之外,跟网站资料相关性高的还有底下的几个咚咚:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
DirectoryIndex index.html index.html.var  <==首页『档案的档名』设定!

如果用户端在网址列只输入到目录,例如 http://localhost/ 时,那麽 Apache 将拿出那个档案来显示呢?就是拿出首页档案嘛! 这个档案的档名在 Apache 当中预设是以 index.* 为开头的,但 Windows 则以 default.* 之类的档名为开头的。如果你想要让类似 index.pl 或 index.cgi 也可以是首页的档名,那可以改成:

  • DirectoryIndex index.html index.htm index.cgi index.pl ...

那如果上面的档名通通存在的话,那该怎办?就按照顺序啊!接在 DirectoryIndex 後面的档名参数,越前面的越优先读取。 那如果档名通通不存在呢?就是说没有首页时,该如何读取?这就与刚刚谈到的 Options 里面的 Indexes 有关喔! 这样有没有将两个参数串起来?

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# Alias  网址列延伸  实际Linux目录
Alias /icons/ "/var/www/icons/"  <==制作一个目录别名 (相当类似捷径)!

    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all

这个 Alias 很有趣的!是制作出类似连结档的东西啦!当你输入 http://localhost/icons 时,其实你的 /var/www/html 并没有 icons 那个目录,不过由於 Alias (别名) 的关系,会让该网址直接连结到 /var/www/icons/ 下。 这里面预设有很多 Apache 提供的小图示喔!而因为设定了一个新的可浏览目录,所以你瞧,多了个 来规定权限了吧! ^_^

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# ScriptAlias  网址列延伸  实际Linux目录
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

    AllowOverride None
    Options None
    Order allow,deny
    Allow from all

与上面的 icons 类似,不过这边却是以 ScriptAlias (可执行脚本的别名) 为设定值! 这个设定值可以指定该目录底下为『具有 ExecCGI 』能力的目录所在喔!所以你可以将类似 Open webmail 的程式给他放置到 /var/www/cgi-bin 内,就不必额外设定其他的目录来放置你的 CGI 程式喔! 这样大概就 OK 了啦!接下来准备一下看看还有哪些额外的设定档需要处理的呢?


20.2.3 PHP 的预设参数修改


我们前面稍微提过 PHP 是 Apache 当中的一个模组,那在谈了 Apache 的 httpd.conf 之後,『我们怎麽没有讲到 PHP 这个模组的设定啊?』不是不讲啦!而是因为目前 Apache 很聪明的将一些重要模组给他拆出来放置到 /etc/httpd/conf.d/*.conf 档案中了,所以我们必须要到该目录下才能了解到某些模组是否有被加入啊!底下先来瞧瞧吧!

[root@www ~]# cd /etc/httpd/conf.d
[root@www conf.d]# ll *.conf
-rw-r--r--. 1 root root 674 Jun 25 15:30 php.conf      <==提供 PHP 模组的设定
-rw-r--r--. 1 root root 299 May 21  2009 welcome.conf  <==提供预设的首页欢迎讯息
# 如果你是按照刚刚鸟哥说的几个模组去安装的,那麽这个目录下至少会有这两个资料,
# 一个是规范 PHP 设定,一个则是规范『如果首页不存在时的欢迎画面』罗。

我们主要来看看关於 PHP 的设定档吧:

[root@www conf.d]# vim /etc/httpd/conf.d/php.conf
prefork.c>  <==根据不同的 PID 模式给予不同的 PHP 运作模组
  LoadModule php5_module modules/libphp5.so

worker.c>
  LoadModule php5_module modules/libphp5-zts.so

AddHandler php5-script .php  <==所以副档名一定要是 .php 结尾!
AddType text/html .php       <==.php 结尾的档案是纯文字档
DirectoryIndex index.php     <==首页档名增加 index.php 喔!
#AddType application/x-httpd-php-source .phps <==特殊的用法!

CentOS 6.x 使用的是 PHP 5.x 版本,这个版本依据不同的 apache 使用记忆体模式 (prefork 或 worker) 给予不同的模组!此外,为了规范 PHP 档案,因此多了最後三行,包括增加副档名为 .php 的档案处理方式, .php 定义为纯文字档,以及首页档名增加 index.php 等。基本上,这个档案你不需要有任何的修改,保留原样即可。


  • PHP 的资安方面设定

你必须要知道 PHP 的设定档其实是在 /etc/php.ini ,这个档案内容有某些地方可以进行一些小修改, 也有某些地方你必须要特别留意,免得被用户端误用你的 PHP 资源。底下先介绍一下 PHP 常见的与资安方面较相关的设定:

[root@www ~]# vim /etc/php.ini
register_globals = Off
# 这个项目请确定为 Off (预设就是 Off),因为如果设定为 On 时,
# 虽然程式执行比较不容易出状况,但是很容易不小心就被攻击。

log_errors = On
ignore_repeated_errors = On  <==这个设定值调整一下 (因预设为 Off)
ignore_repeated_source = On  <==这个设定值调整一下
# 这三个设定项目可以决定是否要将 PHP 程式的错误记录起来,
# 建议将重复的错误资料忽略掉,否则在很忙碌的系统上,
# 这些错误资料将可能造成你的登录档暴增,导致效能不佳 (或当机)

display_errors = Off
display_startup_errors = Off
# 当你的程式发生问题时,是否要在浏览器上头显示相关的错误讯息 (包括部分程式码)
# 强烈的建议设定为 Off 。不过如果是尚未开放的 WWW 伺服器,为了你的 debug
# 容易,可以暂时的将他设定为 On ,如此一来你的程式问题会在浏览器上面
# 直接显示出来,你不需要进入 /var/log/httpd/error_log 登录当中查阅。
# 但程式完成後,记得将此设定值改为 Off 喔!重要重要!

如果你想要提供 Apache 的说明文件给自己的 WWW 伺服器的话,可以安装一下 httpd-manual 这个软体,你就会发现在这个目录当中又会新增档案 (manual.conf),而且从此你可以使用 http://localhost/manual 来登入 Apache 的使用手册呢!真方便!有兴趣的话可以参考与安装底下这些软体喔:

  • httpd-manual:提供 Apache 参考文件的一个软体;
  • mrtg:利用类似绘图软体自动产生主机流量图表的软体;
  • mod_perl:让你的 WWW 伺服器支援 perl 写的网页程式(例如 webmail 程式);
  • mod_python:让你的 WWW 伺服器支援 python 写的网页程式。
  • mod_ssl:让你的 WWW 可以支援 https 这种加密过後的传输模式。

perl 与 python 是与 PHP 类似的咚咚,都是一些很常用在网页的程式语言! 例如知名的 OpenWebMail (http://openwebmail.org/) 就是利用 perl 写成的。要让你的 WWW 支援该程式语言, 你就得要安装这些东西啦!(但不是所有的软体都安装!请安装你需要的即可!)


  • PHP 提供的上传容量限制

我们未来可能会使用 PHP 写成的软体来提供用户上传/下载档案资料,那麽 PHP 有没有限制档案容量呢? 答案是有的!那麽容量限制是多大?预设是 2M 左右。你可以修改它的,假设我们现在要限制成为 16MBytes 时,我们可以这样修订:

[root@www ~]# vim /etc/php.ini
post_max_size = 20M       <==大约在 729 行左右
file_uploads = On         <==一定要是 On 才行 (预设值)
upload_max_filesize = 16M <==大约在 878 行左右
memory_limit = 128M       <==PHP 可用记忆体容量也能修订!

与档案上传/下载容量较相关的就是这几个设定值~为啥 post_max_size 要比 upload_max_filesize 大呢? 因为档案有可能也是透过 POST 的方式传输到我们伺服器上头,此时你的档案就得要加入 POST 资讯内~ 因为 POST 资讯可能还含有其它的额外资讯,所以当然要比档案容量大才行!所以在设计这个设定档时, 这两个值得要特别注意喔!


20.2.4 启动 WWW 服务与测试 PHP 模组

OK!最单纯简易的 WWW 伺服器设定搞定的差不多了,接下来就是要启动啦!启动的方法简单到不行,用传统的方式来处理:

[root@www ~]# /etc/init.d/httpd start       <==立刻启动啦!
[root@www ~]# /etc/init.d/httpd configtest  <==测试设定档语法
[root@www ~]# chkconfig httpd on            <==开机启动 WWW 啦!

另外,其实 Apache 也自行提供一支 script 可以让我们来简单的使用,那就是 apachectl 这支程式啦! 这支程式的用法与 /etc/init.d/httpd 几乎完全一模一样喔!

[root@www ~]# /usr/sbin/apachectl start  <==启动啦!
[root@www ~]# /usr/sbin/apachectl stop   <==关闭 WWW 啦!

一般建议你可以稍微记一下 apachectl 这支程式,因为很多认证考试会考,而且他也是 Apache 预设提供的一个管理指令说!好了,来看看有没有启动成功?

# 先看看 port 有没有启动啊!
[root@www ~]# netstat -tulnp | grep 'httpd'
Proto Recv-Q Send-Q Local Address  Foreign Address State  PID/Program name
tcp        0      0 :::80          :::*            LISTEN 2493/httpd

# 再来看看登录档的资讯记录了什麽!这个确实建议瞧一瞧!
[root@www ~]# tail /var/log/httpd/error_log
[notice] SELinux policy enabled; httpd running as context unconfined_u:system_r:httpd_t:s0
[notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[notice] Digest: generating secret for digest authentication ...
[notice] Digest: done
[notice] Apache/2.2.15 (Unix) DAV/2 PHP/5.3.2 configured -- resuming normal operations
# 第一行在告知有使用 SELinux(强调一下),最後一行代表正常启动了!

这样应该就成功启动了 Apache 罗!比较重要的是还有启动 SELinux 的相关说明,这底下我们还得要注意注意呢! 接下来测试看看能不能看到网页呢?首先看看 /var/www/html 有没有资料?咦?没有~没关系,因为 CentOS 帮我们造了一个测试页了 (Apache 的 welcome 模组功能),所以你还是在浏览器上面输入你这部主机的 IP 看看先:

启动 Apache 之後,所看到的预设首页
图 20.2-1、启动 Apache 之後,所看到的预设首页

你可以在伺服器上面启动图形介面来查阅,也可以透过客户端电脑来连线 (假设防火墙问题已经克服了)。 鸟哥这里假设伺服器为 runlevel 3 的纯文字介面,因此使用外部的用户端电脑连线到伺服器的 IP 上,如上图画面中的箭头 1 处。如果你是在伺服器本机上面启动的浏览器,那直接输入『 http://localhost 』即可。同时看到画面中的箭头 2 所指处,你就可以发现首页的位置是在 /var/www/html/ 底下罗!但如果想要知道有没有成功的驱动 PHP 模组,那你最好先到 /var/www/html 目录下去建立一个简单的档案:

[root@www ~]# vim /var/www/html/phpinfo.php

要记住,PHP 档案的副档名一定要是 .php 结尾的才行喔!至於内容中,那个『 』是嵌入在 HTML 档案内的 PHP 程式语法,在这两个标签内的就是 PHP 的程式码。那麽 phpinfo(); 就是 PHP 程式提供的一个函式库,这个函式库可以显示出你 WWW 伺服器内的相关服务资讯, 包括主要的 Apache 资讯与 PHP 资讯等等。这个档案建置完毕後,接下来你可以利用浏览器去浏览一下这个档案:

测试 Apache 能否驱动 PHP 模组
图 20.2-2、测试 Apache 能否驱动 PHP 模组

注意看网址的部分喔!因为我们 phpinfo.php 是放置在首页目录底下,因此整个 URL 当然就成为上述箭头 1 当中的模样了。 这个 phpinfo() 函数输出的内容还挺机密的,所以测试完毕後请将这个档案删除吧!从上头的画面你可以知道 PHP 模组的版本以及 Apache 相关的重要资料啦!自己仔细瞧瞧吧!如此一来,你的 Apache 与 PHP 就 OK 的啦!

那万一测试失败怎麽办?常见的错误问题以及解决之道可以参考:

  • 网路问题:虽然在本机上没有问题, 但不代表网路一定是通的!请确认一下网路状态!例如 Route table, 拨接情况等等;
  • 设定档语法错误:这个问题很常发生,因为设定错误,导致无法将服务启动成功。 此时除了参考萤幕上面的输出资讯外,你也可以透过 /etc/init.d/httpd configtest 测试语法,更佳的解决方案是参考 /var/log/httpd/error_log 内的资料,可以取得更详尽的解决之道。
  • 权限问题:例如你刚刚在 httpd.conf 上面的 user 设定为 apache 了,但偏偏要被浏览的档案或目录权限对 apache 没有可读权限,自然就无法让人家连线进去啦!
  • 问题的解决之道:如果还是没有办法连接上来你的 Linux Apache 主机,那麽请:
    1. 察看 /var/log/httpd/error_log 这个档案吧!他应该可以告诉你很多的资讯喔!
    2. 仔细的察看一下你浏览器上面显示的资讯,这样才能够知道问题出在哪里!
    3. 另一个可能则是防火墙啦!察看一下 iptables 的讯息!也可能是 SELinux 的问题喔!

20.2.5 MySQL 的基本设定


在 LAMP 伺服器里面,Linux, Apache, PHP 已经处理完毕,那麽 MySQL 呢?所以,接下来就是要处理这个资料库软体罗。 在启动 MySQL 前其实系统并没有帮我们建立任何的资料库。当你初次启动 MySQL 後,系统才会针对资料库进行初始化的建立啊。 不相信的话你可以先看看 /var/lib/mysql/ 这个目录,里面其实没有任何资料的啦。


  • 启动 MySQL (设定 MySQL root 密码与新增 MysQL 用户帐号)

首先得要启动 MySQL 才行,启动的方法还是很简单啊!

[root@www ~]# /etc/init.d/mysqld start
[root@www ~]# chkconfig mysqld on
# 如果是初次启动,萤幕会显示一些讯息且 /var/lib/mysql 会建立资料库。

[root@www ~]# netstat -tulnp | grep 'mysql'
Proto Recv-Q Send-Q Local Address  Foreign Address   State   PID/Program name
tcp        0      0 0.0.0.0:3306   0.0.0.0:*         LISTEN  2726/mysqld

# 底下在测试看能否以手动的方式连上 MySQL 资料库!
[root@www ~]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.52 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit
Bye

MySQL 预设监听的埠口在 port 3306,从上面看来我们的 MySQL 似乎是启动了,不过刚刚初始化的 MySQL 资料库管理员并没有任何密码,所以很可能我们的资料库是会被使用者搞烂掉的~所以你最好对 MySQL 的管理员帐号设定一下密码才好。 另外,上面那个 root 与我们 Linux 帐号的 root 是完全无关的!因为 MySQL 资料库软体也是个多人的操作环境,在该软体内有个管理者恰好帐号也是 root 而已。

那麽如何针对 MySQL 这个软体内的 root 这个管理者设定他的密码呢?你可以这样做:

[root@www ~]# mysqladmin -u root password 'your.password'
# 从此以後 MySQL 的 root 帐号就需要密码了!如下所示:

[root@www ~]# mysql -u root -p
Enter password:  <==你必须要在这里输入刚刚建立的密码!

mysql> exit

如此一来 MySQL 资料库的管理方面会比较安全些啦!其实更好的作法是分别建立不同的使用者管理不同的资料库。 举例来说,如果你要给予 vbirduser 这个使用者一个 MySQL 的资料库使用权,假设你要给他的资料库名称为 vbirddb,且密码为 vbirdpw 时,你可以这样做:

[root@www ~]# mysql -u root -p
Enter password:  <==如前所述,你必须要输入密码嘛!
mysql> create database vbirddb;  <==注意每个指令後面都要加上分号 (;)
Query OK, 1 row affected (0.01 sec)

mysql> grant all privileges on vbirddb.* to vbirduser@localhost 
identified by 'vbirdpw' ;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              | <==用来记录 MySQL 帐号、主机等重要资讯的主要资料库!
| test               | 
| vbirddb            | <==我们刚刚建立的资料库在此
+--------------------+
4 rows in set (0.00 sec)

mysql> use mysql;
mysql> select * from user where user = 'vbirduser';
# 上面两个指令在查询系统有没有 vbirduser 这个帐号,若有出现一堆东西,
# 那就是查询到该帐号了!这样就建置妥当罗!

mysql> exit

然後你可以利用『 mysql -u vbirduser -p 』这个指令来尝试登入 MySQL 试看看,嘿嘿!就知道 vbirduser 这个使用者在 MySQL 里面拥有一个名称为 vbirddb 的资料库啦!其他更多的用法就得请你自行参考 SQL 相关的语法罗!不在本文的讨论范围啦!


  • 效能调校 /etc/my.cnf

由於 MySQL 这个资料库系统如果在很多使用者同时连线时,可能会造成某些效能方面的瓶颈, 因此,如果你的资料库真的好大好大,建议可以改用 postgresql 这套软体,这套软体的使用与 mysql 似乎差异不大。 不过,我们还是提供一些简单的方式来处理小站的 MySQL 效能好了。相关的资料鸟哥是参考这一篇简单的中文说明:

[root@www ~]# vim /etc/my.cnf
[mysqld]
default-storage-engine=innodb
# 关於目录资料与语系的设定等等;
default-character-set   = utf8   <==每个人的编码都不相同,不要随意跟我一样
port                    = 3306
skip-locking
# 关於记忆体的设定,注意,记忆体的简单计算方式为:
# key_buffer + (sort_buffer + read_buffer ) * max_connection
# 且总量不可高於实际的实体记忆体量!所以,我底下的资料应该是 OK 的
# 128 + (2+2)*150 = 728MB
key_buffer              = 128M
sort_buffer_size        = 2M
read_buffer_size        = 2M
join_buffer_size        = 2M
max_connections         = 150
max_connect_errors      = 10
read_rnd_buffer_size    = 4M
max_allowed_packet      = 4M
table_cache             = 1024
myisam_sort_buffer_size = 32M
thread_cache            = 16
query_cache_size        = 16M
tmp_table_size          = 64M
# 由连线到确定断线的时间,原本是 28800 (sec) ,约 8 小时,我将他改为 20 分钟!
wait_timeout            = 1200
thread_concurrency      = 8
innodb_data_file_path = ibdata1:10M:autoextend
innodb_buffer_pool_size = 128M
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 16

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

你要注意的是,因为鸟哥的主机上面假设记忆体有 2GB 啊!所以跟记忆体相关的资料才会写很大! 请依照你实际拥有的记忆体量来处理喔!还得加上你的 Apache 本身的记忆体用量! 所以...如果你的网站流量很大的话,在校能测试上面要很注意啊!


  • MySQL root 密码忘记的紧急处理

如果你不小心忘记 MySQL 的密码怎麽办?网路上有一些工具可以让你去处理 MySQL 资料库的挽回。 如果你的资料库内容并不是很重要,删除也无所谓的话 (测试中 @_@),那麽可以将 MySQL 关闭後, 将 /var/lib/mysql/* 那个目录内的资料删除掉,然後再重新启动 MySQL ,那麽 MySQL 资料库会重建, 你的 root 又没有密码啦!

不过,这个方法仅适合你的资料库并不重要的时候,如果资料库很重要...那千万不要随便删除啊!


20.2.6 防火墙设定与 SELinux 的规则放行

设定好了 LAMP 之後,开始要让用户端来连线啊!那麽如何放行呢?要放行哪些埠口?刚刚的 port 3306 要不要放行? 这里请注意,如果是小型的 WWW 网站,事实上,Apache 是连接本机的 MySQL,并没有开放给外部的用户来连接资料库! 因此,请不要将 3306 放行给网际网路连接,除非你真的知道你要给其他的伺服器读取你的 MySQL 喔!既然如此,当然只要开放 port 80 即可

此外,如果你的 Apache 未来还想要进行一些额外的连线工作,那麽 SELinux 的一些简单规则也得先放行!否则会有问题啦!不过 SELinux 的问题其实都好解决,因为可以参考登录档来修订嘛! 好了,让我们简单的来谈谈:

# 1. 放行防火墙中的 port 80 连线
[root@www ~]# vim /usr/local/virus/iptables/iptables.rule
iptables -A INPUT -p TCP -i $EXTIF --dport  80  --sport 1024:65534 -j ACCEPT
# 将上面这一行的注解拿掉即可!
[root@www ~]# /usr/local/virus/iptables/iptables.rule
[root@www ~]# iptables-save | grep 80
-A PREROUTING -s 192.168.100.0/255.255.255.0 -i eth1 -p tcp -m tcp --dport 80 
   -j REDIRECT --to-ports 3128 <==这一行是进行 squid 产生的,应该要拿掉较佳
-A INPUT -i eth0 -p tcp -m tcp --sport 1024:65534 --dport 80 -j ACCEPT
# 看到上面这行,就是将防火墙的放行加进来了,用户端应该是能够连线罗!

# 2. 解决 SELinux 的规则放行问题:
[root@www ~]# getsebool -a | grep httpd  <==会出现一堆规则,有兴趣的如下:
[root@www ~]# setsebool -P httpd_can_network_connect=1
# 其他的规则或类型,等待後续的章节介绍再来谈!
例题:
你想要修改首页内容,且先使用 root 在 /root 底下建立了 index.html 了,这个档案将被移动到 /var/www/html 底下, 请建立该档案,并且放置成首页档案,浏览看看。
答:
可以透过简单的方式建立一个无关紧要的首页档案:
[root@www ~]# echo "This is my Home page" > index.html
[root@www ~]# mv index.html /var/www/html
[root@www ~]# ll /var/www/html/index.html
-rw-r--r--. 1 root root 21 2011-08-08 13:49 /var/www/html/index.html
# 权限看起来是 OK 的!
现在请使用浏览器浏览一下 http://localhost ,就会发现无法读取!为什麽?请检查 /var/log/httpd/error_log 以及 /var/log/messages 的内容:
[root@www ~]# tail /var/log/httpd/error_log
[error] [client 192.168.1.101] (13)Permission denied: access to /index.html denied
[root@www ~]# tail /var/log/messages
Aug  8 13:50:14 www setroubleshoot: SELinux is preventing /usr/sbin/httpd "getattr"
 access to /var/www/html/index.html. For complete SELinux messages. run sealert -l
 6c927892-2469-4fcc-8568-949da0b4cf8d
看到上面画底下的地方了吧?就是他!执行一下,你就能发现如何处理罗!


20.2.7 开始网页设计及安装架站软体,如 phpBB3

基础的 LAMP 伺服器架设完毕之後,基本上,你就可以开始设计你想要的网站罗!编写网页的工具很多,请自行寻找吧! 不过对於这个简单的 LAMP 伺服器,你必须要知道的是:

  • 预设的首页目录在 /var/www/html/,你应该将所有的 WWW 资料都搬到该目录底下才对!
  • 注意你的资料权限 (rwx 与 SELinux)!务必要让 Apache 的程序使用者能够浏览!
  • 尽量将你的首页档案档名取为 index.html 或 index.php !
  • 如果首页想要建立在其他地方,你应该要修改 DocumentRoot 那个参数 (httpd.conf)
  • 不要将重要资料或者隐私资料放置到 /var/www/html/ 首页内!
  • 如果你需要安装一些 CGI 程式的话,建议你将他安装到 /var/www/cgi-bin/ 底下, 如此一来你不需要额外设定 httpd.conf 即可顺利启动 CGI 程式;

除了这些基本的项目之外,其实你可以使用网际网路上面人家已经做好的 PHP 程式架站机喔! 譬如说讨论区软体 phpBB3 这个玩意儿,完整的架站软体 PHPNuke 以及部落格软体 lifetype 等等。 但这些架站机都需要 PHP 与资料库的支援,所以你必需要将上述介绍的 LAMP 完整的安装好才行。 如果你不喜欢自己写网页的话,那麽这些有用的架站软体就够你瞧的罗!鸟哥列出几个连结给你玩一玩先!

不过请注意,这些软体由於是公开的,所以有些怪叔叔可能会据以乱用或乱改,因此可能会有一些 bug 会出现!因此,你必需要取得最新的版本来玩才行,而且架设之後还得要持续的观察是否有更新的版本出现, 随时去更新到最新版本才行喔!免得後患无穷~


20.3 Apache 伺服器的进阶设定


事实上,刚刚上头的基本设定已经很足够朋友们架设 WWW 伺服器所需了!不过,还有很多可以玩玩的地方, 例如个人用户首页、虚拟主机以及认证保护的网页等等。底下我们分别来谈一谈罗!


20.3.1 启动用户的个人网站 (权限是重点)

每一部 WWW 伺服器都有一个首页,但是如果每个个人用户都想要有可以自己完全控管的首页时,那该如何设计?呵呵!Apache 早就帮我们想到了!不过新版的设定档内常常是预设将这个功能取消的,所以你必需要自行修订呢!

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 找到如下的设定项目,大约在 366 行左右:

    UserDir disable
    #UserDir public_html

# 将他改成如下的情况喔!

    #UserDir disable
    UserDir www


# 重新启动一下先!
[root@www ~]# /etc/init.d/httpd restart

这只是个范例,Apache 预设的个人首页是放置在家目录下的 ~/public_html/ 目录下!假如你的系统有个帐号叫做 student, 那麽预设的属於 student 的个人首页就会放置在 /home/student/public_html/ 底下。不过,这个 public_html 实在很讨厌, 看起来跟网页没有什麽特殊关连性,因此鸟哥都会将这个目录改为 www,所以 student 的个人首页就会是在 /home/student/www/ 目录下,比较好记忆。

例题:
如何让未来所有『新增』的使用者预设家目录下都有个 www 的目录?
答:
因为新增使用者时所参考的家目录在 /etc/skel 目录内,所以你可以直接 mkdir /etc/skel/www 即可。 若想要让用户直接拥有一个简易的首页,还能够使用 echo "My homepage" > /etc/skel/www/index.html 呢!


  • 个人首页的 URL 以及目录的权限、SELinux 设定

现在假设我们要让已经存在系统中的 student 这个帐号具有个人首页,那就得要手动去建置所需要的目录与档案才行。 现在请登入 student,并用该帐号建置底下的相关资讯:

[student@www ~]$ mkdir www
[student@www ~]$ chmod 755 www  <==针对 www 目录开放权限
[student@www ~]$ chmod 711 ~    <==不要忘了家目录也要改!
[student@www ~]$ cd www
[student@www www]$ echo "Test your home" >> index.html

由於 CentOS 预设的使用者家目录权限是 drwx------ ,这个权限将无法让 Apache 的程序浏览啊!所以你至少要让你的家目录权限成为 drwx--x--x 才行!这个很重要啊! 那麽未来只要你在浏览器的网址列这样输入:

  • http://你的主机名称/~student/

『理论上』就能够看到你的个人首页了。不过,可惜的是,我们的 SELinux 并没有放行个人首页!所以,此时你会发现浏览器出现 『You don't have permission』的讯息!赶紧看一下你的 /var/log/messages,里面应该会教你进行这项工作:

[root@www ~]# setsebool -P httpd_enable_homedirs=1
[root@www ~]# restorecon -Rv /home/
# 第一个指令在放行个人首页规则,第二个指令在处理安全类型!

就可以看到你的使用者个人网页罗!之後让使用者自己去设计他的网站吧!现在你知道那个毛毛虫 (~) 在 URL 上面的意义了吧? ^_^!不过,多这个毛毛虫就很讨厌~我可不可以将使用者的个人网站设定成为:

  • http://你的主机名称/student/

是可以啦!最简单的方法是这样的:

[root@www ~]# cd /var/www/html
[root@www html]# ln -s /home/student/www student

由於我们首页的『 Options 』内有 FollowSymLinks 这个参数的原因,所以可以直接使用连结档即可。 另外我们也可以使用 Apache 提供的别名功能 (Alias),例如这样做:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 找个不与人家设定值有干扰的地方加入这个设定项目:
Alias /student/ "/home/student/www/"

        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all


[root@www ~]# /etc/init.d/httpd restart

不过,如果你使用这个方法的话得要特别注意,在 httpd.conf 内的 Alias 後面接的目录,需要加上目录符号 (/) 在结尾处, 同时,网址列必须要输入 http://IP/student/ !亦即是结尾也必须要加上斜线才行!否则会显示找不到该 URL 喔!


20.3.2 启动某个目录的 CGI (perl) 程式执行权限

在前几个小节里面我们有谈到,如果你想要 Apache 可以执行 perl 之类的网页程式时, 你就得需要安装一些额外的模组才行。其中 mod_perl 与 mod_python 这两个软体建议你最好安装一下啦!然後我们也提到想要执行 CGI 程式就得到 /var/www/cgi-bin/ 目录下去执行。如果你想要在其他目录底下执行 CGI 程式是否可以?当然行啊!


  • 利用新目录下的 Options 参数设定:

假设想要执行 CGI 的程式附档名为 .cgi 或 .pl ,且放置的目录在 /var/www/html/cgi/ 时,你可以这样做:

[root@www ~]# yum install mod_python mod_perl
[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 找到底下这一行,大约在 797 行左右啦:
#AddHandler cgi-script .cgi
# 将他改成底下的模样,让附档名为 .pl 的档案也能执行喔!
AddHandler cgi-script .cgi .pl

# 然後加入底下这几行来决定开放某个目录的 CGI 执行权限。

    Options +ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all


[root@www ~]# /etc/init.d/httpd restart

接下来只要让你的 CGI 程式具有 x 权限,那麽他就可以执行啦!举例来说,你的档案在 /var/www/html/cgi/helloworld.pl 的话,那麽:

[root@www ~]# mkdir /var/www/html/cgi
[root@www ~]# vim /var/www/html/cgi/helloworld.pl
#!/usr/bin/perl
print "Content-type: text/html\r\n\r\n";
print "Hello, World.";
[root@www ~]# chmod a+x /var/www/html/cgi/helloworld.pl

然後在网址列输入:『http://主机名称或 IP/cgi/helloworld.pl』即可执行该档案并将结果显示在萤幕上面罗!


  • 使用 ScriptAlias 的功能:

你可以直接利用档名的别名来处理即可!更简单呢。我们现在假设所有在 /var/www/perl/ 目录下的档案都可以是 perl 所撰写的程式码,那麽我们可以这样做:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 同样的你要先确认这一行是存在的!
AddHandler cgi-script .cgi .pl

# 然後加入底下这几行来决定开放某个目录的 CGI 执行权限。
ScriptAlias /perl/ "/var/www/perl/"

[root@www ~]# /etc/init.d/httpd restart

[root@www ~]# mkdir /var/www/perl
[root@www ~]# cp -a /var/www/html/cgi/helloworld.pl /var/www/perl

现在,请在网址列输入:『http://IP/perl/helloworld.pl』,就能够看到刚刚的资料了!这个方法比较棒啦!因为该目录不需要在 Apache 首页底下也可以成功的啦!这两个方法你可以随意取一个来处理即可!不需要两个都进行啦!


20.3.3 找不到网页时的显示讯息通知

如果你的 /var/www/html/cgi 目录底下没有任何首页档案 (index.???) 时,那当使用者在网址列输入『 http://your.hostname/cgi 』,请问结果会显示出什麽呢?可能有两个:

  • 如果你的 Options 里面有设定 Indexes 的话,那麽该目录下的所有档案都会被列出来,提供类似 FTP 的连结页面。
  • 如果没有指定 Indexes 的话,那麽错误讯息通知就会被显示出来。

事实上 CentOS 所提供的 Apache 已经规范好一些简单的错误资料网页了,你可以到 /var/www/error/ 目录下瞧瞧就晓得。不过该目录下的档案并没有中文讯息,所以...真要命!至於 Apache 的错误讯息设定在这里:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 大约在 875 行左右,预设就是注解掉的!
#    ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
#    ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
#    ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
#    ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
....(後面省略)....

虽然 Apache 预设有提供一些额外的资料给我们使用,不过,鸟哥不是很喜欢那样的画面啦!反而比较喜欢像是 Yahoo 或是其他大型的网站所提供的资讯页面,可以提供给用户一些有效的连结,这样会比较方便用户连结到我们的网站啊! 此时我们可以这样做:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 找到底下这一段,大约在 836 行左右,看看这些简单的范例先:
#ErrorDocument 500 "The server made a boo boo."
ErrorDocument 404 /missing.html  <==将注解拿掉吧!
#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
#ErrorDocument 402 http://www.example.com/subscription_info.html

[root@www ~]# /etc/init.d/httpd restart

上面那个档案 /missing.html 必需要放置在你的首页目录下,亦即是 /var/www/html/missing.html 啦! 要提醒你的是:『你的所有设定档当中 (包括 /etc/httpd/conf.d/*.conf) 只能存在一个 ErrorDocument 404 ... 的设定值,否则将以较晚出现的设定为主』。 所以你得先搜寻一下,尤其是很多 Linux 版本的 Apache 并没有将预设的错误讯息注解呢。至於那个 404 是啥意思?他的意义是这样的:

  • 100-199:一些基本的讯息
  • 200-299:用户端的要求已成功的达成
  • 300-399:Client 的需求需要其他额外的动作,例如 redirected 等等
  • 400-499:Client 的要求没有办法完成(例如找不到网页)
  • 500-599:主机的设定错误问题

好了,接下来让我们编辑一下那个 missing.html 的档案内容吧! ^_^

[root@www ~]# vim /var/www/html/missing.html


        
        错误讯息通知


        您输入的网页找不到!

亲爱的网友,你所输入的网址并不存在我们的伺服器当中, 有可能是因为该网页已经被管理原删除, 或者是你输入了错误的网址。请再次查明後在填入网址罗! 或按这里回到首页。 感谢你常常来玩! ^_^

若有任何问题,欢迎联络管理员vbird@www.centos.vbird

现在你如果在网址列随便输入一个伺服器上不存在的网址,就会出现如下的画面罗:

找不到网页时的错误通报讯息
图 20.3-1、找不到网页时的错误通报讯息

当然啦,你可以自行设定出符合你网页风格的资料啦!例如鸟哥的网站上面就列出一些基本的连结, 帮助网友们可以顺利的取得他们想要的资料啊!这也是很重要的功能呢!^_^


20.3.4 浏览权限的设定动作 (order, limit)

你该如何限制用户端对你的 WWW 连线呢?你会说,那就利用 iptables 这个防火墙嘛!那有什麽难的?问题是, 如果同一个 IP 来源,他某些网页可以浏览,但某些网页不能浏览时,该如何设定?iptables 仅能一口气开放或整个拒绝, 无法针对 WWW 的内容来部分放行。那该如何处理?就透过 apache 内建的 order 项目来处置即可。 先来回忆一下 order 搭配 allow, deny 的相关限制:

  • Order deny,allow:以 deny 优先处理,但没有写入规则的则预设为 allow。常用於:拒绝所有,开放特定的条件;
  • Order allow,deny:以 allow 为优先处理,但没有写入规则的则预设为 deny。常用於:开放所有,拒绝特定的条件。
  • 如果 allow 与 deny 的规则当中有重复的,则以预设的情况 (Order 的规范) 为主。

举例来说,如果我们的首页目录想要让 192.168.1.101 及政府部门无法连线,其他的则可以连线, 由上面的说明你可以知道这是『开放所有,拒绝特定』的条件,所以你可以这样做设定:

[root@www ~]# vim /etc/httpd/conf/httpd.conf

    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    Deny from 192.168.1.101  <==约在 344 行新增底下两行!
    Deny from .gov.tw


[root@www ~]# /etc/init.d/httpd restart

注意一下,因为 Order 是『 allow,deny 』,所以所有规则当中属於 allow 的都会被优先提到最上方, 为了避免这个设计上的困扰,所以建议你直接将 allow 的规则写在最上方。 而由於规则当中 192.168.1.101 隶属於 all 当中 (all 代表所有的嘛!),因此这个设定项目则为预设值, 亦即为 deny 啦!那个 .gov.tw 的设定项目也一样。如果是底下的模样:

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 底下可是个错误的示范,请仔细看下个段落的详细说明喔!

    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from 192.168.1.101
    Deny from .gov.tw
    Allow from all

虽然 deny 会先挪到上方来处理,不过因为 192.168.1.101 是在 all 的范围内,所以发生重复, 因此这个设定值将会以预设的 allow 为主,因此就无法限制住这个 192.168.1.101 的存取啦! 这边很容易搞错的呐!鸟哥也是常常搞到头昏脑胀的~

例题:
如果有个应该要保护的内部目录,假设在 /var/www/html/lan/ , 我仅要让 192.168.1.0/24 这个网域可以浏览的话,那麽你应该要如何设定的好?
答:
这个案例当中有点像是『拒绝所有连线,仅接受特定连线』的样子,因此可以使用 deny,allow 那个情况, 所以你可以这样做:

    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    deny from all
    allow from 192.168.1.0/24

事实上,如果想要让某个网域或者是 IP 无法浏览的话,最好还是利用 iptables 来处理比较妥当。 不过如果仅是某些重要目录不想让人家来查阅的话,那麽这个 allow, deny 与 order 的设定资料可就很值得参考了。

而除了这个 order 设定值之外,我们还有个限制用户端能进行的动作的设定喔! 那就是 Limit 这个设定啦!举例来说,如果我们想要让使用者在 /var/www/html/lan 这个目录下仅能进行最阳春的 GET, POST, OPTIONS 的功能,除了这几个之外的其他功能通通不允许, 那麽你可以这样做:

[root@www ~]# vim /etc/httpd/conf/httpd.conf

    AllowOverride none
    Options FllowSymLinks

    # 先允许能够进行 GET, POST 与 OPTIONS 啦!
    
        Order allow,deny
        Allow from all
    

    # 再规定除了这三个动作之外,其他的动作通通不允许啦!
    
        Order deny,allow
        Deny from all
    

透过 Limit 与 LimitExcept 就能够处理用户端能够进行的动作啦!也就有办法针对你的资料进行细部保护罗。 不过这些保护真的很细部,一般小网站大致上用不到 Limit 这个玩意儿说。


20.3.5 伺服器状态说明网页


既然已经安装好了 WWW 伺服器,除了提供服务之外,重要的是要如何维护罗!嘿嘿! 那麽是否一定要额外安装其他的软体才能知道目前的主机状态呢?当然不需要啦!我们可以透过 Apache 提供的特别功能来查询主机目前的状态!那就是 mod_status 这个模组罗! 这个模组预设是关闭的,你必须要修改设定档来启动他才行。

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 先确定底下这几个项目真的有存在才行!
LoadModule status_module modules/mod_status.so <==大约在 178 行,就是模组的载入

ExtendedStatus On  <==大约在 228 行,你可以将他打开,资讯会比较多!

# 底下的资料则大约在 924 行左右,你可以将他修改成为这样:

    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.1.0/24
    Allow from 127.0.0.1


[root@www ~]# /etc/init.d/httpd restart

接下来你只要在你的网址列输入主机名称後面加上 http://hostname/server-status 即可发现如下的模样:

伺服器目前的状况回报网页
图 20.3-2、伺服器目前的状况回报网页

输出的结果包括目前的时间以及 Apache 重新启动的时间,还有目前已经启动的程序等等, 还有网页最下方会显示每个程序的用户端与伺服器端的连线状态。虽然显示的状况挺阳春,不过该有的也都有了, 可以让你约略了解一下伺服器的状况罗。要注意喔,可查阅者 (allow from 的参数) 还是需要限制的比较严格一点啦!


20.3.6 .htaccess 与认证网页设定


对於保护 Apache 本身的资料方面,除了上述的 Order 以及 Limit 之外,还有什麽方式呢? 因为 Order 与 Limit 主要是针对 IP 网域或者是主机名称来管理,那如果我们用户端是使用拨接方式取得 IP, 那麽 IP 会一直变动的,如此一来那个保护的目录使用者也就不能在任何地方进入了,会造成一些困扰。

此时如果能够使用密码保护的方式,让使用者可以输入帐号/密码即可取得浏览的权限的话,那用户端就不用受到那个 order 的 Allow, deny 的限制啦!真好~呵呵!Apache 确实刚好有提供一个简单的认证功能, 让我们可以轻松愉快的就设定好密码保护的网页呢!

Tips:
什麽是受保护的资料呢?举例来说,学校老师们可能会提供一些教学教材或者是习题给同学, 这些资料不想给所有人取得,那麽就可以将这些资料放在特定的受保护的目录中。还有例如某些重要的 Apache 伺服器分析的资料 (本章後面提及的一些分析工具),这些资料建置的方法需要启用 CGI 程式, 而 CGI 程式的执行是有风险的,而且那些分析所得的资料也很重要。此时,该程式与输出结果就需要放在受保护的目录啦!
鸟哥的图示

那麽那个认证网页如何搞定?简单的说,他要这样处理:

  1. 建立受保护的目录:既然我们是『按了某个连结进入某个目录之後,才会出现对话视窗』, 那麽首先当然就是要有那个设定为认证网页的『目录』罗!请注意,是要目录才行喔!

  2. 设定 Apache 所需参数:然後,在对话视窗中,既然我们需要输入帐号与密码, 那麽自然就需要密码档罗!另外,虽然 Apache 有支援 LDAP 及 MySQL 等等的认证机制,不过我们这里并不讨论其他的认证机制, 完全使用 Apache 的预设功能而已,所以,底下我们会使用基本 (Basic) 的认证模式喔!

  3. 建立密码档案:处理完基本的设定後,再来则是建立登入时所需要的帐号与密码!

  4. 最後,重新启动 Apache 就 OK 啦!

其中,第二个步骤会比较有趣,我们说过,任何的设定资料都可以直接写到 httpd.conf 这个设定档当中, 所以设定保护目录的参数资料确实可以写入 httpd.conf 当中。不过,想一想,如果你的 Apache 伺服器有 30 个使用者具有个人首页,然後他们都需要制作保护目录,那个 httpd.conf 只有身为 root 的你才能够修改, 更可怕的是『每次改完都需要重新启动 Apache』~请问,你的时间精力是否会受到『很严厉的考验?』

所以啦,如果我们能够透过外部的档案来取代设定 httpd.conf 内的参数,那麽是否会比较好? 而且最好能够该档案设定即生效,不需要重新启动 Apache 的话,那就更好啦!因为如此一来, 你就可以交给使用者自行管理他们的认证网页罗!呵呵~透过 httpd.conf 内的 AllowOverride 参数,配合 .htaccess 这个档案的设定就 OK 搞定!这个设定项目与设定档 httpd.conf 的关系可以这样看:

.htaccess 与主要设定档 httpd.conf 的相关性
图 20.3-3、.htaccess 与主要设定档 httpd.conf 的相关性

也就是说:

  • 主设定档 httpd.conf 的修订:你必需要在 httpd.conf 这个主设定档当中先以 AllowOverride 指定某个目录下的 .htaccess 能够进行取代的参数为何?一般有 AuthConfig, Options 等等,考虑到系统资料的安全,建议提供 AuthConfig 的项目就好了。设定完毕後请重新启动 Apache。

  • .htaccess 放置的目录:在受保护的目录底下务必要存在 .htaccess 这个档案,透过这个档案即可修改 httpd.conf 内的设定啊!

  • .htaccess 的修改:.htaccess 设定完『立刻生效』,不需要重新启动 Apache,因为该档案的内容是『当有用户端浏览到该目录时,该档案才会被使用来取代原有的设定。

既然 .htaccess 的用途比较广,所以底下我们不介绍 httpd.conf 的认证参数了,请你自行测试即可。底下主要以 .htaccess 档案的设定为主喔!赶紧来看看吧!


  • 1. 建立保护目录的资料

假设我要将受保护的资料放置到 /var/www/html/protect 当中,记得,这个目录要让 Apache 可以浏览到才行。 所以你可以立刻将一些重要的资料给他搬移到这里来。我们先这样测试一下吧!建立个简单的测试网页即可。

[root@www ~]# mkdir /var/www/html/protect
[root@www ~]# vim /var/www/html/protect/index.html

这是个测试网页啊!
看到这个画面了吗?如果看到的话,表示你可以顺利进入本受保护网页啦!


  • 2.1 以 root 的身份处理 httpd.conf 的设定资料

这个动作仅有 root 能作啦!你要开始编辑 httpd.conf ,让受保护的那个目录可以使用 .htaccess 啊!

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 确定底下这几行是存在的,约在 400 行左右!
AccessFileName .htaccess

    Order allow,deny
    Deny from all
    Satisfy All


# 在某个不受影响的地方加入这一段:

    AllowOverride AuthConfig
    Order allow,deny
    Allow from all


[root@www ~]# /etc/init.d/httpd restart  <==重新启动,不要忘记了!

这样就设定妥当了,很简单吧!再接下来要准备 .htaccess 的建立了。


  • 2.2 建立保护目录下的 .htaccess 档案:只要有权限建立者即可进行

要注意,这个档案是在保护目录底下喔!不要放错地方啦!所以你要这样做:

[root@www ~]# cd /var/www/html/protect
[root@www protect]# vim .htaccess
# 只要加入底下这几行即可
AuthName     "Protect test by .htaccess"
Authtype     Basic
AuthUserFile /var/www/apache.passwd
require user test

这些参数的意义是这样的:

  • AuthName:在要你输入帐号与密码的对话视窗中,出现的『提示字元』
  • AuthType:认证的类型,我们这里仅列出 Apache 预设的类型,亦即是『basic』的啦
  • AuthUserFile:这个保护目录所使用的帐号密码设定档。 也就是说,这个档案是随便你设定的,当然啦,所以使用者当然可以自行设定帐号与密码罗。 档案内的帐号不限在 /etc/passwd 出现的使用者!另外,这个档案不要放置在 Apache 可以浏览的目录内,所以我将他放置在首页之外!避免被不小心窃取。
  • require:後面接可以使用的帐号。假如 /var/www/apache.passwd 内有三个帐号, 分别是 test, test1, test2 ,那我这里只写了 test ,因此 test1, test2 将无法登入此目录。 如果要让该密码档内的使用者都能够登入,就改成『require valid-user』即可啊!

设定好就立刻生效了,不需要重新启动任何东西啊!


  • 3. 建立密码档案 htpasswd (只要有权限即可执行)

Apache 预设读取的帐号/密码设定资料是由 htpasswd 所建立的,这个指令的语法是这样的:

[root@www ~]# htpasswd [-cmdD] 密码档档名 使用者帐号
选项与参数:
-c :建立後面的密码档案。如果该档案已经存在,则原本的资料会被删除!
     所以如果只是要新增使用者(档案已存在时),不必加上 -c 的参数!
-m :不使用预设的 CRYPT 加密,改用 MD5 方式加密密码!
-d :使用更复杂的 SHA 方式来加密!
-D :删除掉後面接的那个使用者帐号!

# 1. 建立 apache.passwd ,帐号为 test
[root@www ~]# htpasswd -c /var/www/apache.passwd test
New password:  <==这里输入一次密码,注意,萤幕不会有任何讯息。
Re-type new password:  <==这里再输入一次
Adding password for user test

[root@www ~]# cat /var/www/apache.passwd
test:FIquw/..iS4yo   <==你瞧瞧!已经建立一个新使用者!

# 2. 在已存在的 apache.passwd 内增加 test1 这个帐号:
[root@www ~]# htpasswd /var/www/apache.passwd test1

再次强调,这个档案档名需要与 .htaccess 内的 AuthUserFile 相同,且不要放在浏览器可以浏览到的目录! 这样就算设定完毕啦!你可以使用浏览器在网址列输入:『http://your.hostname/protect』试看看,结果会如何? 会像底下这个样子:

浏览到受保护的目录时,浏览器出现的提示视窗示意图
图 20.3-4、浏览到受保护的目录时,浏览器出现的提示视窗示意图

如果你曾经浏览过这个目录了,当时可能尚未制作保护的档案,或者是档案设计错误,导致你曾经可以浏览该网页, 则该网页会被你的浏览器快取 (cache) 起来,所以可登入的画面会一再地出现而不会跑出需要认证的对话视窗。此时你应该要:

  • 务必将全部的浏览器都关闭,再重新启动浏览器。因为你成功的登入该目录後,该次登入的资讯会快取在这次的连线上喔!
  • 可以将浏览器上头的『reload (重新读取)』按下去,让浏览器重新读取一次;否则快取不会更新。
  • 可以将浏览器的快取资料全部清除,关闭浏览器後再重新启动浏览器看看。

如果还是一直出问题,那就只好前往登录档 (/var/log/httpd/error_log) 察看错误资讯罗。 常见的错误只是打错字啦!@_@


20.3.7 虚拟主机的设定 (重要!)


接下来我们要谈的是『主机代管』...瞎密?不是啦~是一个称为虚拟主机的东西啦~这东西很有用喔!他可以让你的一部 Apache 看起来像有多个『主站首页』的感觉啦!


  • 什麽是虚拟主机 (Virtual Host)

所谓的虚拟主机,基本上就是『让你的一部伺服器上面,有好多个 "主网页" 存在,也就是说,硬体实际上只有一部主机,但是由网站网址上来看,则似乎有多部主机存在的样子!』。 举个例子来说好了,鸟哥提供的网站主要有主要学习网站以及新手讨论区,分别在底下的连结:

这两个连结你给他点下去,会发现其实是不同的资料内容,不过,如果你用 dig 之类的软体来查验 IP 的话,会发现这两个网址都指向同一个 IP ㄟ!怎麽会这样?没错啊!这就是虚拟主机的主要功能!他可以让你的多个主机名称对应到不同的主网页目录 (DocumentRoot 参数), 所以看起来会像有多部实际主机的模样啦!这样说,了解虚拟主机了吗?


  • 架设的大前提:同一个 IP 有多个主机名称啦!

那麽要架设虚拟主机需要什麽咚咚呢?以刚刚鸟哥的网站的结果为例,我必需要有多个主机名称对应到同一个 IP 去, 所以说,你必需先拥有多个主机名称才行。要如何拥有多个主机名称?那就是:

  • 向 ISP 申请多个合法的主机名称,而不自己架设 DNS;
  • 自行设定经过合法授权的 DNS 主机来设定自己所需要的主机名称。

相关的 DNS 申请与设定技巧我们在前几章都谈过了, 你可得自行去瞧瞧先!


  • 一个架设范例练习:

我们在第十九章 DNS 里面不是有设定了多个主机名称吗? 那些主机名称就是为了要在这里实作用的啦! ^_^!你得要注意的是,我的每个主机名称都必需要对应到某个主网页目录, 底下则是鸟哥的一个简单范例:

主机名称对应的主目录
linux.centos.vbird/var/www/html
www.centos.vbird/var/www/www
ftp.centos.vbird/var/ftp (较特殊)

接下来就是开始设定罗!要告诉你的是,建议你将虚拟主机的设定建立一个新的档案在 /etc/httpd/conf.d/*.conf 当中,因为如此一来你的虚拟主机设定档就可以进行搬移, 修改的时候也不会影响到原有的 httpd.conf 的资料!而因为 httpd.conf 内有个 Include 的参数将 /etc/httpd/conf.d/*.conf 的档案都读入设定档当中,所以设定上面就变的很轻便, 备份与升级的时候也比较容易处理嘛!不罗唆,赶紧来实验一下先!

# 1. 先建立所需要的目录:
[root@www ~]# mkdir /var/www/www <==www.centos.vbird 所需!
[root@www ~]# yum install vsftpd <==/var/ftp 可由系统软体提供
[root@www ~]# echo "www.centos.vbird" > /var/www/www/index.html
[root@www ~]# echo "ftp.centos.vbird" > /var/ftp/index.html
# 原有的首页 (/var/www/html) 就不更动了!另建两个不同的首页内容,可供测试用。

# 2. 开始编辑设定档,这里鸟哥用额外的档案来设定喔!
[root@www ~]# vim /etc/httpd/conf.d/virtual.conf
# 底下这一行在规定『本机任何介面的 port 80 所指定的虚拟主机』的意思。
NameVirtualHost *:80

# 先针对两个多出来的可浏览目录进行权限方面的规范啊!

    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all


    Options FollowSymLinks Indexes
    AllowOverride None
    Order allow,deny
    Allow from all


# 针对三部主机的 DocumentRoot 进行定!

    ServerName    linux.centos.vbird
    DocumentRoot  /var/www/html


    ServerName    www.centos.vbird
    DocumentRoot  /var/www/www
    CustomLog     /var/log/httpd/www.access_log combined
    # 不同的主页可以指定不同的登录档资讯,这样比较好 debug 与分析啦!


    ServerName    ftp.centos.vbird
    DocumentRoot  /var/ftp


[root@www ~]# /etc/init.d/httpd restart
你要注意的只有几点:
  1. 在虚拟主机的设定上还有很多的可用的功能,不过,最低的限度是需要有 ServerName 及 DocumentRoot 这两个即可!
  2. 使用了虚拟主机後,原本的主机名称 (linux.centos.vbird) 也要同时写入虚拟主机的对应中, 否则这个主机名称可能会不知道被丢到哪里去喔!
  3. 在 www.centos.vbird 这个主机当中多了个 CustomLog ,表示任何向 www.centos.vbird 要求资料的记录都会改写入 /var/log/httpd/www.access_log 而不是预设的 /var/log/httpd/access_log。 但这个新增的登录档必需要加入 logrotate 的管理当中才行喔!否则登录档会大到『爆表』

接下来,只要你用户端的浏览器可以找到这三个主机名称并连线到正确的 IP 去, 你这个 Apache 就可以同时提供三个网站的站址了,很方便吧!^_^。


  • 虚拟主机常见用途

虚拟主机为什麽会这麽热门啊?这是因为他可以进行底下的任务:

  • 主机代管:
    如果你有一部很快速的电脑,配合你的网路频宽又大的话,那麽你可以用这个虚拟主机的技术来『拉客』喔! 因为毕竟不是所有公司都有维护伺服器的能力,如果你能够提供合理的流量、亲和的资料传输介面、 稳定的提供服务,并且给予类似 MySQL 资料库的支援,那麽当然有可能进行『主机代管』的业务啊!你说是吧! ^_^

  • 伺服器资料备援系统:
    你可以在两个地方放置两部主机,主机内的网页资料是一模一样的 (这个可以使用 rsync 来达成的) ,那麽你将可以利用 Apache 的虚拟主机功能, 配合 DNS 的 IP 指向设定,让某一部主机挂点时,另外一部主机立刻接管 WWW 的要求! 让你的 WWW 伺服器不会有任何断线的危机啊! ^_^ (注:当 A 伺服器挂点时, 赶紧设定 DNS ,让原本 A 的 IP 指定给 B,则任何向该 IP 要求的 WWW 将会被导向 B, B 有 A 的备份资料以及虚拟主机设定,搞定!)

  • 将自己的资料分门别类:
    如果野心没有这麽大的话,那麽如果你有几个不同的资料类型时,也可以利用虚拟主机将各种资料分门别类啦! 例如将部落格指向 blog.centos.vbird,将讨论区指向 forum.centos.vbird ,将教学资料指向 teach.centos.vbird 等等,这样的网址就很容易让用户端了解啦!你说是吧! ^_^

20.4 登录档分析以及 PHP 强化模组


除了这些基本的 Apache 使用方式之外,我们还有哪些事情可以玩的?当然还有很多啦!包括有趣的 PHP 效能强化模组、登录档分析以了解整个 Apache 的使用情况等等!让我们来瞧一瞧!


20.4.1 PHP 强化模组 (eaccelerator) 与 Apache 简易效能测试

虽然 PHP 网页程式标榜的是速度快速,不过因为 PHP 毕竟是先将一些可用函数先编译成为模组,然後当网页使用到该 PHP 程式的时候,再由呼叫 PHP 模组来达成程式所需要的行为。由於多了一道手续, 所以他的执行效能还是有别於传统编译的程式语言罗。

那麽如果我们可以将 PHP 程式预先转换成为可直接执行的 binary file,不就可以直接读取进而加快速度吗? 没错!是这样~这东西称为预编器~其中有一套软体称为 eaccelerator,eaccelerator 可以将你的 PHP 程式与 PHP 核心及相关函式库预先编译後暂存下来,以提供未来使用时可以直接执行,加上他可以优化你的 PHP 程式,因此,可以让你的 PHP 网页速度增快不少喔!eaccelerator 的官方网站在底下:

整个安装的流程很简单啦!你先将这个软体的原始码下载下来,我这里假设你将他下载到 /root 目录下, 另外你必需要确定你有安装 php-devel, autoconf, automake, m4, libtool 等软体才行!那就赶紧来安装吧!(鸟哥是以 0.9.6.1 这一版为范例的喔!)

# 1. 解压缩档案,并且进行 patch 的动作:
[root@www ~]# cd /usr/local/src
[root@www src]# tar -jxvf /root/eaccelerator-0.9.6.1.tar.bz2
[root@www src]# cd eaccelerator-0.9.6.1/

# 2. 利用 phpize 进行 PHP 程式的预处理
[root@www eaccelerator-0.9.6.1]# phpize
# 过程会出现一些警告资讯,不要理他没关系!
[root@www eaccelerator-0.9.6.1]# ./configure --enable-eaccelerator=shared \
> --with-php-config=/usr/bin/php-config
[root@www eaccelerator-0.9.6.1]# make

# 3. 将他整个安装起来!
[root@www eaccelerator-0.9.6.1]# make install
# 此时这个新编译的模组会被放置到 /usr/lib64/php/modules/eaccelerator.so 当中!

将模组处理完毕之後接下来就是要让 PHP 使用这个模组啦!如何进行呢?

# 1. 预先载入这个 PHP 的模组:
[root@www ~]# echo "/usr/lib64/php/modules/" >> \
> /etc/ld.so.conf.d/php.conf

[root@www ~]# ldconfig
# 关於 ld.so.conf 以及 ldconfig 我们在基础篇谈过了,请自行参考喔!

# 2. 修改 php.ini 喔!
[root@www ~]# vim /etc/php.ini
# 在这个档案的最底下加入这几行:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; http://eaccelerator.net/       ;
; 2011/08/08 VBird               ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
extension="eaccelerator.so"
eaccelerator.shm_size="16"
eaccelerator.cache_dir="/tmp/eaccelerator"
eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="1"
eaccelerator.debug="0"
eaccelerator.filter=""
eaccelerator.shm_max="0"
eaccelerator.shm_ttl="0"
eaccelerator.shm_prune_period="0"
eaccelerator.shm_only="0"
eaccelerator.compress="1"
eaccelerator.compress_level="9"

# 3. 建立 eaccelerator 的暂存资料,重点在於权限要设定正确!
[root@www ~]# mkdir /tmp/eaccelerator
[root@www ~]# chmod 777 /tmp/eaccelerator
[root@www ~]# /etc/init.d/httpd restart

基本上这样就设定妥当啦!要注意的是:『因为你的 eaccelerator 是根据目前这一版的 PHP 核心所编译出来的,所以未来如果你的 Linux distribution 有释出新版的 PHP 时,你也顺利更新到新版的 PHP 了,那你的这个 eaccelerator 就必需要自行手动再更新一次, 以配合到正确的 PHP 版本,否则这个模组将不会正确运作。』!很重要喔!

那如何确认这个模组有正确的在运作呢?你可以利用 20.2.4 小节谈到的 phpinfo() 这个函式来查阅,透过浏览器你应该会看到如下的画面:

确定 eaccelerator 有运作的画面
图 20.4-1、确定 eaccelerator 有运作的画面

如果你的 eaccelerator 没有启动的话,那就看不到上图的画面啦!藉由这个动作来测试测试吧! ^_^! 接下来我们利用 Apache 提供的一个小程式来测试一下我们网站的效能吧!这个程式叫做 ab , 他可以主动的向主机重复要求多笔资料来确认主机的效能喔!

[root@www ~]# ab [-dSk] [-c number] [-n number] 网页档名
选项与参数:
-d :不要显示 saved table 的百分比资料;通常不要那个资料,所以会加 -d
-k :还记得上面的 KeepAlive 吧!加入 -k 才会以这样的功能测试;
-S :不显示长讯息,仅显示类似 min/avg/max 的简短易懂讯息!
-c :同时有多少个『同时连线』的设定(可想成同时连线的 IP )
-n :同一个连线建立几个要求通道!(可想成同一个 IP 要求的几条连线)
更多的讯息请自行 man ab 喔! 

# 针对我们刚刚测试时的 phpinfo.php 这个档案来测试!
[root@www ~]# ab -dSk -c100 -n100 http://localhost/phpinfo.php
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
....中间省略....
Document Path:          /phpinfo.php
Document Length:        54204 bytes
....中间省略....
Total transferred:      5436100 bytes
HTML transferred:       5420400 bytes
Requests per second:    39.97 [#/sec] (mean)
Time per request:       2501.731 [ms] (mean)
Time per request:       25.017 [ms] (mean, across all concurrent requests)
Transfer rate:          2122.01 [Kbytes/sec] received
....底下省略....

根据这个软体的输出你会知道每秒钟的传输速率、最大传输速度等等,可以约略知道一下基本效能啦! 不过鸟哥这个程式是在自己机器上面测试的,速度快是正常的!你可以在网路的另一头来测试一下说! (注:这个 ab 程式对於读取 MySQL 之类的网页似乎没有办法成功的完成测试的样子, 你应该以较单纯的网页来测试吧!)


20.4.2 syslog 与 logrotate


请特别注意,我们的 Apache 登录档主要记录两个东西,分别是:

  • /var/log/httpd/access_log :用户端正常要求的记录资讯
  • /var/log/httpd/error_log :使用者错误要求的资料,包括伺服器设定错误的资讯等。

那个 /var/log/httpd/error_log 可以让你处理很多设定错误的情况,包括网页找不到、 档案权限设定错误、密码档案档名填错等等。至於 access_log 则可以让你分析那个网页最热门! ^_^! 不过你可得注意的是:『在稍有规模的网站下,Apache 的登录档每周记录量甚至可达 1GB 以上』的纪录。以鸟哥的主网站来说,一个星期逼近 1GB 的登录档是合理的...

不过,因为登录档是纯文字资讯,所以如果能够给予压缩的话,那麽备份下来的登录档将可以减少到数十MB而已, 这样可大大的减少了磁碟空间的浪费啊!如果你是使用预设的 Apache 来处理你的伺服器时, 那麽系统已经作了一个 logrotate 给你使用了,如果你是使用 Tarball 自己安装的, 那麽...你就得要自行手动建立底下这个档案啦!鸟哥底下是以 CentOS 6.x 提供的档案来作说明的:

[root@www ~]# vim /etc/logrotate.d/httpd
/var/log/httpd/*log {
    missingok
    notifempty
    compress   <==建议加上这一段,让你的备份登录档可以被压缩
    sharedscripts
    delaycompress
    postrotate
        /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

为什麽这里很重要呢?鸟哥的伺服器曾经发生过一件事情,就是....突然 WWW 效能变很差! 後来追踪的原因竟然是... /var/ 的容量被用完了!而耗掉这个 partition 的元凶竟然是 Apache 的登录档! 当时 /var/ 仅给 5GB ,而每个星期的登录档就上达 1GB 以上,备份四个星期的结果, /var/ 想不爆掉也很难~ 所以啦,建议你的 /var 要给个 10GB 以上才好呐!而且备份登录档也要压缩才好呐!

Tips:
关於 syslog 与 logrotate 的详细说明请参考基础篇的内容喔!或者是到底下的连结:
http://linux.vbird.org/linux_basic/0570syslog.php
鸟哥的图示

此外,透过分析登录档其实我们可以知道我们的网站到底是哪一个网页最热门?也且也能知道用户端是来自哪里呢!目前针对 Apache 有很多的分析软体,我们底下仅介绍两个常见的分析软体给大家呦!


20.4.3 登录档分析软体:webalizer

事实上,CentOS 6.x 预设就提供了 webalizer 这个分析软体了!你只要将这套软体安装上来就是了。 如果你不是使用 CentOS 呢?没关系,官方网站上也可以下载,安装也很简单!

  • 官方网站:http://www.mrunix.net/webalizer/
  • 设定难度:简单,极适合新手架设
  • 软体特色:大致上,所有分析的内容他都有了!虽然图表比较没有那麽炫...
  • 授权模式:GPL

CentOS 6.x 提供的这个软体设定档在 /etc/webalizer.conf ,而且他设定每天会分析一次 WWW 的登录档, 不过这个软体预设会将输出的结果放置到 /var/www/usage ,并且这个目录仅有本机可以查阅, 鸟哥并不喜欢这样的设定。我们刚刚不是有建立一个保护目录 /var/www/html/protect 吗? 这个目录的功能来啦!鸟哥预计将 webalizer 的输出资料放置到 /var/www/html/protect/webalizer 底下去, 所以知道密码的都能够查阅呢!整个动作是这样的:

# 1. 先处理设定档,变更指定一下我们要输出的目录即可:
[root@www ~]# vim /etc/webalizer.conf
# 确定一下底下这几行是正确的!其他的则保留预设值
LogFile        /var/log/httpd/access_log        <==约在 28 行
OutputDir      /var/www/html/protect/webalizer  <==约在 42 行
Incremental    yes                              <==约在 67 行

# 2. 建立该保护目录的资料:
[root@www ~]# cp -a /var/www/usage/ /var/www/html/protect/webalizer
[root@www ~]# /etc/init.d/httpd restart

# 3. 开始测试执行 webalizer 的分析工作
[root@www ~]# webalizer

现在请你在浏览器上面输入: http://your.hostname/protect/webalizer ,看看输出的结果是如何吧! 结果应该会如下所示:

webalizer 分析工具所得的分析画面
图 20.4-2、webalizer 分析工具所得的分析画面

在上图当中的箭头 1 处你还可以点选喔,点选後会告知你当月的各项分析结果,很不错吧!


20.4.4 登录档分析软体:awstats


除了 webalizer 之外,我们其实还可以透过 awstats 这个厉害到不行的 perl 的程式来进行资料分析, 由於这个软体是以 perl 来执行的,所以请确定你的 mod_perl 已经安装且 CGI 的执行权限已经启动了! 这个软体的特色是:

这套软体不但可以由系统的 cron 来进行分析,甚至还提供浏览器直接以 CGI 的方式来即时更新登录档呐! 真是厉害厉害!鸟哥个人是比较不喜欢使用浏览器来线上更新分析的结果, 因为在你更新分析结果时,怎麽知道系统会不会很忙碌?如果系统正在忙碌中, 这套软体的分析可也是很耗费系统资源的呐!所以建议直接以 crontab 的方式来处理即可。

目前官方网站不但提供 tarball 甚至也提供 RPM 来给使用者下载了!真是方便啊! 但是你还是要注意的,这个软体曾经因为安全性的问题导致很多网站的挂点, 所以建议你还是把这个软体的输出结果放置在受保护的目录中喔!底下鸟哥以 7.0-1 这个 RPM 版本来说明, 请你自行到官方网站下载吧!(注:档名为 awstats-7.0-1.noarch.rpm )

假设你将这个 RPM 档案放置到 /root 当中,那麽自己 rpm -ivh filename 去安装他吧! 不要跟我说你不会 RPM ~鸟哥是会昏倒的~@_@!由於这个 RPM 档案将 awstats 的资料通通放置到 /usr/local/awstats 当中去了! 为了自己网页设定上的方便,建议你是可以这样做的:

# 1. 先安装後再将 awstats 提供的 Apache 设定资料给他复制到 conf.d 下
[root@www ~]# rpm -ivh awstats-7.0-1.noarch.rpm
[root@www ~]# cp /usr/local/awstats/tools/httpd_conf  \
> /etc/httpd/conf.d/awstats.conf
[root@www ~]# vim /etc/httpd/conf.d/awstats.conf
Alias /awstatsclasses "/usr/local/awstats/wwwroot/classes/"
Alias /awstatscss "/usr/local/awstats/wwwroot/css/"
Alias /awstatsicons "/usr/local/awstats/wwwroot/icon/"
Alias /awstats/ "/usr/local/awstats/wwwroot/cgi-bin/"

    Options +ExecCGI
    AllowOverride AuthConfig  <==这里改成这样,因为要保护!
    Order allow,deny
    Allow from all

[root@www ~]# /etc/init.d/httpd restart

awstats 还真的挺贴心的,因为他释出的文件当中就有关於 Apache 的设定资料,我们直接将他放到 conf.d/ 那个目录下并且更名後,重新启动 Apache 就生效了!真方便。再来则是要针对我们的 WWW 登录档来设定啦!设定档其实是在 /etc/awstats 目录下,在该目录下有个范例档为 awstats.model.conf,其实这个设定档『档名』格式为:

  • awstats.主机名称.conf

因为鸟哥这部主机名称为 www.centos.vbird,所以假设主机名称为 www,所以档名就应该是 awstats.www.conf 罗!请你将他复制一个新档,然後这样做:

[root@www ~]# cd /etc/awstats
[root@www awstats]# cp awstats.model.conf awstats.www.conf
[root@www awstats]# vim awstats.www.conf
# 找到底下这几行,并且修改一下内容啊:
LogFile="/var/log/httpd/access_log"  <== 51行:确定登录档所在的位置
LogType=W                            <== 63行:针对 WWW 的登录档分析
LogFormat=1                          <==122行:Apache 的登录档格式
SiteDomain="www.centos.vbird"        <==153行:主机的 hostname
HostAliases="localhost 127.0.0.1 REGEX[centos\.vbird$]"
DirCgi="/awstats"                    <==212行:能够执行 awstats 的目录
DirIcons="/awstatsicons"             <==222行:awstats 一些小图示的目录
AllowToUpdateStatsFromBrowser=0      <==239行:不要利用浏览器来更新!
Lang="tw"                            <==905行:重要!这是语系!

接着开始测试一下是否可以产生正确的分析资料出来?

[root@www awstats]# cd /usr/local/awstats/wwwroot/cgi-bin
[root@www cgi-bin]# perl awstats.pl -config=www -update  \
> -output > index.html
# 那个 -config 後面接的就是 awstats.www.conf 的意思!会产生 index.html 

[root@www cgi-bin]# ls -l
awstats082011.www.txt   <==刚刚才建立的重要资料档!
awstats.pl              <==就是刚刚我们下达的执行档!
index.html              <==重要输出首页档案

接下来让我们赶紧来建立保护目录的 .htaccess 档案吧!请注意,鸟哥这里假设你已经有密码档了, 所以直接建立档案即可啊!

[root@www ~]# cd /usr/local/awstats/wwwroot
[root@www wwwroot]# vi .htaccess
AuthName     "Protect awstats data"
Authtype     Basic
AuthUserFile /var/www/apache.passwd
require      valid-user

之後,只要你输入『http://your.IP/awstats/』,就能够看到输出的图表了!图表有点像这样:

awstats 分析工具所得的分析画面
图 20.4-3、awstats 分析工具所得的分析画面

事实上,资料非常的多,你可以自行查阅输出的结果。在上图当中的箭头处,你还可以自己选择曾有的月份资料来进行显示! 最後,将分析的动作规定在每天三点的时候跑,你可以这样做:

[root@www ~]# vim /usr/local/awstats/wwwroot/cgi-bin/awstats.sh
cd /usr/local/awstats/wwwroot/cgi-bin
perl awstats.pl -config=www -update -output > index.html

[root@www ~]# chmod 755 /usr/local/awstats/wwwroot/cgi-bin/awstats.sh
[root@www ~]# vim /etc/crontab
0 3 * * * root /usr/local/awstats/wwwroot/cgi-bin/awstats.sh

这样你就知道你的主机到底有多受欢迎罗! ^_^!另外,再次千万拜托!这个软体所在的目录务必要制作密码保护!不要随意释放出来! 甚至上面提供的一些目录的连结你都可以根据自己的主机与喜好来重新修改,会比较安全的啦!


20.5 建立连线加密网站 (https) 及防砍站脚本


从本章一开始的 20.1 就谈过 http 这个通讯协定是明码传送资料,而那个 https 才是加密传输的!那加密的方法是透过 SSL 啊,这个 SSL 就是以 openssl 软体来提供的一个加密函式库。更多与 https 有关的资讯,请参考 20.1.4 吧!


20.5.1 SSL 所需软体与凭证档案及预设的 https

要达成让 apache 支援 https 协定的话,你必须要有 mod_ssl 这个软体才行!请先自行使用 yum 去装好这个软体吧! 并且重新启动 httpd 喔!同时,我们的 CentOS 6.x 也已经预设提供了 SSL 机制所需要的私钥与凭证档案罗!相关软体提供的档案如下:

  • /etc/httpd/conf.d/ssl.conf:mode_ssl 提供的 Apache 设定档;
  • /etc/pki/tls/private/localhost.key:系统私钥档,可以用来制作凭证的!
  • /etc/pki/tls/certs/localhost.crt:就是加密过的凭证档!(signed certificate)

既然系统都已经帮我们搞定了,那麽就让我们直接来浏览一下,看看系统预设提供的 https 是长的什麽模样吧! 打开你的浏览器,输入 https://你的IP 来连线看看:

在 firefox 底下看到的 SSL 安全问题图示
图 20.5-1、在 firefox 底下看到的 SSL 安全问题图示

就如同本章 20.1.4 谈到的,因为我们这个 Apache 网站并没有将此凭证向 CA 注册,因此就会出现上述的讯息了! 这就类似 ssh 连线时,系统需要你输入『 yes 』是一样的啦!要接受凭证後才能够进行加密的功能。所以,请点选上图中的箭头 1,此时就会延伸出箭头 2 的位置,按下去吧!然後就会出现如下所示:

在 firefox 底下接受一把私有的凭证所需要的流程
图 20.5-2、在 firefox 底下接受一把私有的凭证所需要的流程

如果你确定这个网站是你自己的可信任网站,那就按下 1 及 2 的箭头处!如果还想要看一下这个网站所提供的相关凭证内容, 就按下 3 箭头的地方:

在 firefox 底下观察凭证的详细内容
图 20.5-3、在 firefox 底下观察凭证的详细内容

由於这个凭证档案的建置是在第一次启动 Linux 时就安装好了凭证档,而在 CentOS 6.x 底下,预设的凭证有效期限为 1 年,所以你就会看到上图中箭头 2 所指的,签发日到到期日共有一年啊!当你按下关闭後,就能够看到实际的 https:// 提供的网站内容罗!这就是预设的 SSL 网站啦!你的重要资讯可以放在这里~让资料在网路上传输更佳的安全!


20.5.2 拥有自制凭证的 https



  • 建立凭证档

预设的凭证虽然已经可以让你顺利的使用 https 了,不过,凭证的有效日仅有 1 年而已~实在讨厌~ 所以,我们还是得要自制凭证才行~这个凭证的制作仅是私有 WWW 网站的用途,并没有要拿去 CA 注册喔! 那麽自制凭证需要什麽步骤呢?基本上需要的流程是:

  1. 先建立一把 private key 预备提供给 SSL 凭证签章要求所用;
  2. 最後建立 SSL 凭证 (test certificates)。

那麽建立凭证有没有很困难呢?没有啦!因为 CentOS 6.x 已经帮我们写好了 Makefile 了!你先到 /etc/pki/tls/certs 这个目录下,然後直接输入 make 这个指令,就能够看到所有可行的目标动作!我们就可以很快速的建置好凭证喔! 不过,因为预设的私钥档需要加上密码才能够进行建立,所以我们还得要额外进行一下动作就是了。好! 现在假设我们要建立的是名为 vbird 的凭证!那麽底下流程中,所有的关键字就是 vbird!简单流程如下所示:

# 1. 先到 /etc/pki/tls/certs 去建立一把给 Apache 使用的私钥档案:
[root@www ~]# cd /etc/pki/tls/certs
[root@www certs]# make vbird.key
umask 77 ; /usr/bin/openssl genrsa -aes128 2048 > vbird.key  <==其实是这个指令
Generating RSA private key, 2048 bit long modulus
.................................................................+++
...............................+++
e is 65537 (0x10001)
Enter pass phrase:  <==这里输入这把私钥的密码,需要多於四个字元!
Verifying - Enter pass phrase:  <==再一次!

# 2. 将刚刚建立的档案中,里面的密码取消掉!不要有密码存在啦!
[root@www certs]# mv vbird.key vbird.key.raw
[root@www certs]# openssl rsa -in vbird.key.raw -out vbird.key
Enter pass phrase for vbird.key.raw: <==输入刚刚的密码啦!
writing RSA key
[root@www certs]# rm -f vbird.key.raw  <==旧的金钥档移除
[root@www certs]# chmod 400 vbird.key  <==权限一定是 400 才行!

# 3. 建置所需要的最终凭证档!
[root@www certs]# make vbird.crt SERIAL=2011080801
umask 77 ; /usr/bin/openssl req -utf8 -new -key vbird.key -x509 -days 365 
-out vbird.crt -set_serial 2011080801  <==可以加入日期序号
You are about to be asked to enter information that will be incorporated
into your certificate request.
-----
Country Name (2 letter code) [XX]:TW
State or Province Name (full name) []:Taiwan
Locality Name (eg, city) [Default City]:Tainan
Organization Name (eg, company) [Default Company Ltd]:KSU
Organizational Unit Name (eg, section) []:DIC
Common Name (eg, your name or your server's hostname) []:www.centos.vbird
Email Address []:vbird@www.centos.vbird

[root@www certs]# ll vbird*
-rw-------. 1 root root 1419 2011-08-08 15:24 vbird.crt  <==最终凭证档!
-r--------. 1 root root 1679 2011-08-08 15:22 vbird.key  <==系统私钥档

这样就建立好凭证档了!接下来就是得要去处理 ssl.conf 这个设定内容喔!另外,这把凭证依旧只能使用 1 年!如果你想要建立十年的凭证,那就得要修改一下 Makefile 里面的内容,将 365 改成 3650 即可!

Tips:
如果你曾经多次重复进行上述的建立凭证动作,会发现到同一个凭证内容若制作多次,则最终用户端浏览器会出现一些错误讯息, 导致无法连线!因此,建议多加一个序号 (SERIAL) 的参数,可以修订这个错误喔!
鸟哥的图示

  • 修改 ssl.conf 的内容,使用自制凭证

修改 ssl.conf 的内容也是很简单!只要修改两个地方,亦即是档案档名的地方即可!

[root@www ~]# vim /etc/httpd/conf.d/ssl.conf
SSLCertificateFile /etc/pki/tls/certs/vbird.crt    <==约在 105 行
SSLCertificateKeyFile /etc/pki/tls/certs/vbird.key <==约在 112 行

[root@www ~]# /etc/init.d/httpd restart

然後再以浏览器去浏览 https:// 的网址,就能够查阅到刚刚建立的凭证资料。不过,因为我们之前已经有浏览过预设的凭证, 所以网页以及凭证都有被快取过!因此,你可能得需要到浏览器的隐私保护的地方,将记录的凭证删除,并且将网页快取删除, 这样才能够看到最终如下的正确凭证资料喔!

检查凭证的详细内容!
图 20.5-4、检查凭证的详细内容!

20.5.3 将加密首页与非加密首页分离


或许你已经发现一个无俚头的地方,就是我的 http:// 以及 https:// 首页是一模一样的嘛!那麽我的读者干嘛没事找事干, 肯定不会使用 https 的嘛!那怎办?怎麽强制使用者使用 https:// 来查阅我的重要资料?很简单啊! 透过虚拟主机就好了啊!因为 SSL 模组也是预设提供了这个功能的嘛!修改会不会很麻烦呢?不会啦! 你只要将 http 及 https 的首页分离即可!我们这麽假设好了:

  • 一般明码传输的网页首页不要变更;
  • https:// 的首页放置到 /var/www/https/ 目录下。

所以我们得先要设定 /var/www/https 目录才行!然後,只要修改 ssl.conf 档案内容即可!整个过程可以这样处理:

# 1. 处理目录与预设的首页 index.html 档案:
[root@www ~]# mkdir /var/www/https
[root@www ~]# echo "This is https' home" > /var/www/https/index.html

# 2. 开始处理 ssl.conf 的内容罗!
[root@www ~]# vim /etc/httpd/conf.d/ssl.conf
Listen 443                      <==预设的监听埠口!不建议修改!
     <==就是虚拟主机的设定罗!
DocumentRoot "/var/www/https"   <==约84行,拿掉注解改掉目录名称
ServerName *:443                <==拿掉注解,并将主机名称设定为 *
SSLEngine on                    <==有支援 SSL 的意思!
SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW
SSLCertificateFile /etc/pki/tls/certs/vbird.crt
SSLCertificateKeyFile /etc/pki/tls/certs/vbird.key


[root@www ~]# /etc/init.d/httpd restart

大部分都使用预设值,就是 DocumentRoot 以及 ServerName 需要留意就是了。如此一来,我们就将 https, http 两个完整的分开,你的重要资料需要加密的,终於有个可靠的地方摆放罗!^_^


20.5.4 防砍站软体


几个比较知名的网站管理员大概都有这样的困扰,那就是网站常被砍站软体所强力下载,结果造成主机的 CPU loading 过重,最後竟然会导致死掉~唉!真是的~人怕出名猪怕肥呐!先来解释一下什麽是砍站吧!

所谓的『砍站』,就是以类似多点连线下载的持续性讯息传递软体进行网站资料的下载,而且, 一启用该软体,该软体就将『整个网站』的内容都给他 download 下来,很厉害吧!没错!是很厉害,但是却也害死人了~怎麽说呢?

因为这种软体常常会为了加快 download 的速度,所以采用多点连线的方式,也就是会持续不断的向 Server 发出要求封包,而由於这些封包并不见得能够成功的让 Server 把资料传导给 Client 端,常常会无法投递就是啦!这样的结果就是...造成 Server 要一直不断的回应,又无法正确的回应出去, 此外,要求太过频繁,结果主机应接不暇,最後...就当机了...真的是林老师ㄌㄟ~

鸟哥的鸟站主机古早以前,就是因为这样的原因,导致服务常常断断续续的,并且,由於 CPU loading 太高,结果让正常连线进来看资料的网友没有足够的资源,因此网页开启的速度就变的很慢~唉~ 这些砍站的人,也太不道德啦!

由於这种砍站软体真的很麻烦,一不注意马上就又会被砍站而当机,三天两头就要重新开机一次,完全让 Linux 的稳定性无法发挥!真是气死了~後来,鸟哥就自行写了一个 scripts 来挡这样的 IP !我的作法是这样的:

  1. 由於砍站软体会多点连续下载,因此,同一个 IP 在同一个时间内,会有相当多的连线发生;
  2. 由於他是重复不断的要求连线,因此刚刚建立的连线在达成下载的目的後,会立刻死掉, 而又多生出其他的连线出来,因此,这个时候他的连线情况就变的相当的不正常了!
  3. 由於某些较旧的砍站软体并不会『欺骗』主机,所以,会在主机的登录档里面记录住 Teleport 的标记!
  4. 既然如此的话,那麽我就让我的主机每分钟去检查两个东西(1)先检查 log file ,如果有发现到相关的 Teleport 字词,就将该 IP 抵挡掉;(2)使用 netstat 来检查同一个 IP 的同时连线,如果该连线超过一个值(例如同时有 12 个连线)的话,那麽就将该 IP 抵挡掉!
  5. 此外,由於上面的方案可能会将 Proxy 的 Client 端也同时抵挡掉,真是可怜啊! 这个时候,这支程式就会主动的将(1)的情况的主机抵挡 3 天,至於(2)的情况则抵挡2小时! 过了该抵挡的时限後,该 IP 即可又连上我们的主机了!

大致上就是这样吧!这样的一程式需要与 iptables 相互配合,所以,请先查阅一下第九章的防火墙内容,然後再来下载这支程式吧! 这支程式你可以在底下的网址下载喔!

详细的安装步骤鸟哥已经以中文写在该档案里面了,所以请先查看一下该档案的前面说明部分吧!此外, Study Area 的 netman 大哥也已经开发了一套很棒的防砍站的程式了! 在防堵砍站的原理上面是完全相同的,不过写法可能不是很雷同就是了!如果有需要的话,也可以前往 Study-Area 搜寻一下罗!


20.6 重点回顾


  • WWW 的传输协定使用 HTTP (Hyper Text Transport Protocol) ,最早是由欧洲核子物理实验室的伯纳斯-李所发展的;
  • WWW 在 server/client 端主要传递的讯息资料以 HTML (Hyper Text Markup Language) 语法为主;
  • http://www.w3c.org 为制订与发布 WWW 标准语法的组织,你撰写网页最好依据该站之标准为宜;
  • Apache 是达成 WWW 伺服器的一项软体,至於用户端的浏览则使用浏览器,目前可使用 firefox
  • 浏览器可达成的主机连结不止 http,可在网址列输入对应的『协定://主机[:port]/资源』即可取得不同的资料;
  • 若要 WWW 伺服器可以达成与使用者资讯互动,尚须要网页程式语言 (如PHP, perl 等) 以及资料库软体 (如 MySQL, portgresql 等);
  • 因为 http 使用的是明码传送,目前 WWW 可利用 SSL 等机制来进行资料加密的传输;
  • Apache 的设定档其实只有 httpd.conf 而已,其他的设定档都是被 Include 进来的;
  • Apache 的首页目录以 DocumentRoot 决定,首页档案则以 DirectoryIndex 决定;
  • Apache 可以透过虚拟主机的设定以指定不同主机名称到不同的 DocumentRoot 下;
  • Apache 是多执行绪的软体,可以启动多个程序来负责 WWW。主要的模组有 prefork 及 worker, 至於最大可连线的数量则以 MaxClients 来决定。
  • 若要正确的让浏览器显示网页的编码格式,最好在网页上宣告语系,并将 Apache 的设定档 httpd.conf 内的 AddDefaultCharset 设定值取消;
  • 在 Apache 可浏览的目录权限设定上 (Options 参数),最好将 Indexes拿掉;
  • 透过 AllowOverride 与 .htaccess 可让使用者在自己管理的目录下制订自己的风格;
  • Apache 本身提供一个 apachectl 的 script 让使用者得以快速管理其 apache 的服务;
  • Apache 分析的资料如果比较重要时,务必以 SSL 或者是保护目录来保护。

20.7 本章习题


  • 请问 LAMP 这个伺服器代表什麽意思?
    这个名词代表了 Linux + Apache + MySQL + PHP 这个 WWW 伺服器的组成!
  • Apache 的设定档档名一般为何?
    Apache 的设定档档名为 httpd.conf ,不过,由於 httpd.conf 内容参数可以使用『 include "额外设定档名"』,所以也可能具有其他的额外设定档喔!
  • 在 Apache 的设定档当中,哪一个参数是用来设定『主网页』的?
    设定主网页的参数为:DocumentRoot 喔!後面接的是主网页放置的『目录』!
  • 哪一个指令用来重新启动与关闭 Apache ?(请以 Apache 本身提供的功能来说明)
    其实不论是 RPM 还是 Tarball 都是使用 apachectl 这个档案来启动 apache 的,不过 RPM 已经将该档案整合到 /etc/init.d/httpd 里面去而已
  • 当我使用 ps -aux 的时候,发现好多的 httpd... 的程序,这是正常的吗? 最多可以有几个程序是在那个档案的那个参数所设定的?
    由於 Apache 预设为多执行绪,所以启动多个 processes 是正常的。至於启动几个 process 则由很多设定所处理, 包括 MinSpareServers, MaxSpareServers, MaxClients 等等。
  • 又,呈上题,这些程序 (process) 的 owner 与 group 是谁?该察看那个设定档的那个参数?
    同样察看 httpd.conf 里面的 User 与 Group 这两个设定值!
  • 如果今天我以 http://your.ip 结果却发现浏览器出现类似 FTP 的画面(会列出该目录下的所有档案),这是什麽原因造成的?该如何避免?
    这是由於在 httpd.conf 里面,针对该目录的设定参数『 Options 』当中,设定了 Indexes 这个设定值,导致当找不到主页时(通常是 index.html),就会将该目录下的所有档案秀出来!解决的方法就是拿掉 Options 里面的 Indexes 设定值即可!
  • 在 Apache 里面 .htaccess 这个档案的功能为何?
    可以用来取代 httpd.conf 里面的设定参数!创造属於使用者自己的 Apache 风格!
  • 若你之前浏览过网页,但显示的资料并非正确的中文。後来按照上文的说明修改了中文的设定,却还是无法看到中文。 请问可能的原因为何?
    由於你曾经浏览过该网站的网页,所以该网页会被你的浏览器所暂存 (cache),因此你应该可以这样做:
    • 在同一页面下按下『 reload 』来重新载入;
    • 清除掉所有的浏览器快取;
    • 将原本的网页在伺服器端改名,并让浏览器浏览新的网页名称。
  • PHP 的程式码一定要使用 吗?有没有替代方案?
    预设的情况下,你应该要输入 才能写入 PHP 的程式。不过早期的程式或许都以 来撰写的。 如果想要让该种方式生效的话,你可以进入 /etc/php.ini 档案中,修改『short_open_tag = On』这个设定项目即可。

20.8 参考资料与延伸阅读



2003/01/14:第一次完成
2003/01/18:新增问题讨论:关於中文的说明
2003/01/21:新增问题讨论:关於 PHP 无法使用的问题说明
2003/04/28:加入砍站软体的程式说明
2003/04/29:加入 PHP 原始码程式优化模组 MM Cache 说明。
2003/05/07:加入 ab 这个效能测试的说明!
2003/05/30:使用 Tarball 安装时常常发生一些困扰,加入 User/Group 的设定说明!
2003/09/10:将原本在 2002/12 安装 Tarball 的软体更新为目前 2003/09 最新的版本来安装喔!
2003/10/02:加入一些问题的克服之道喔!
2004/03/25:修订2004/03/25:修订 MySQL 安装的流程!第四步骤加入权限的修订!
2004/09/03:修改了 MMCache 的主网页。
2006/10/21:将旧的文章移动到 此处
2006/11/09:花了很多时间修改,不再提供 tarball 的安装需求了!
2006/11/10:预先释出版本,包括修改 MM Cache 成为 eaccelerator、增加 SSL 修改 awstats 之安装等。
2010/02/08:网友告知,SSL 建置的 genrsa 应该是 private key 而非 public key 喔!这部份鸟哥误解了。
2011/05/10:将旧的基於 CentOS 4.x 的版本移动到 此处
2011/05/27:终於改完了!这次的改版幅度不会很大,主要是适应在 CentOS 5.x 的版本上面啦!
2011/08/05:将基於 CentOS 5.x 的版本移动到 此处