服务器架设篇 - CentOS 6.x

第二十章、WWW 服务器

Linux + Apache + MySQL + PHP (LAMP) 架设详解啰!

最近更新时间: 2011/08/05

我们最常讲的『架站』其实就是架设一个 Web 网站啦!那么什么是 Web 呢?那就是全球信息广播的意思 (World Wide Web),或者也可以称之为互连网吧!这个是我们目前的人类最常使用的 Internet 的协定之一啦!通常说的上网就是使用 WWW 来查找用户所需要的信息啰!目前在 Unix-Like 系统中的 WWW 服务器主要就是通过 Apache 这个服务器软件来达成的, 而为了动态网站,于是 LAMP (Linux + Apache + MySQL + PHP) 就这么产生啦!让我们赶紧来进入 LAMP 的世界吧!

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 只是一些纯文本数据,通过所谓的标签 (<tag>) 来规范所要显示的数据格式;
  • 在用户端,通过浏览器的对 HTML 以及多媒体的解析,最后呈现在用户的屏幕上。

    HTML 的格式

如上所提到的相关信息,我们知道服务器端需要提供用户端一些数据,而这些数据其实主要都以 HTML 的格式来呈现的。那么什么是 HTML 呢?我们拿鸟哥的网站来看一下好了。你可以使用任何一个浏览器链接到 http://vbird.org.cn,然后在其上的页面上按下鼠标右键, 选择察看原代码,你就能发现该网页是如何写成的了。

<!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 与整体化设计等等....
</head>
<body style="margin:0; padding:0">
....在浏览器显示的画面中,实际放置在浏览器上面的数据则写于此....
</body>
</html>

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

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://vbird.org.cn --> /var/www/html/
    • http://vbird.org.cn/linux_basic/index.php --> /var/www/html/linux_basic/index.php

    另外,通常首页目录底下会有个特殊的文件名称,例如 index.html 或 index.??? 等。举例来说,如果你直接按下: http://vbird.org.cn 会发现其实与 http://vbird.org.cn/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 『首页』所在目录啦!当你输入『https://#』时所显示的数据, 就是放在这个目录当中的首页档 (缺省为 index.html)。

  • /var/www/error/
    如果因为服务器设置错误,或者是浏览器端要求的数据错误时,在浏览器上出现的错误消息就以这个目录的缺省消息为主!

  • /var/www/icons/
    这个目录提供 Apache 缺省给予的一些小图标,你可以随意使用啊!当你输入『https://#/icons/』 时所显示的数据所在。

  • /var/www/cgi-bin/
    缺省给一些可运行的 CGI (网页程序) 程序放置的目录;当你输入『https://#/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/ 这个目录提供一些额外的功能,那么:

<Directory "/var/www/html">
    Options Indexes
    ...........
</Directory>

几乎都是这样的设置方式喔!特别留意的是,如果你有额外的设置时,不能随便在 httpd.conf 里头找地方写入!否则如果刚好写在 <Directory>...</Directory> 里面,呼呼! 那么就会发生错误啦!需要前前后后的找一找喔!或者是在文件的最后面加入也行!好啦,底下咱们先来聊一聊 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 进程占用资源,可能有性能方面的困扰。

<IfModule prefork.c>   <==底下两个 perfork, worker 与内存管理有关!
StartServers       8   <==启动 httpd 时,唤醒几个 PID 来处理服务的意思
MinSpareServers    5   <==最小的预备使用的 PID 数量
MaxSpareServers   20   <==最大的预备使用的 PID 数量
ServerLimit      256   <==服务器的限制
MaxClients       256   <==最多可以容许多少个用户端同时连接到 httpd 的意思!
MaxRequestsPerChild  4000
</IfModule>
<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

上面的 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 的问题,而是用户端浏览器的缓存所产生的啦!记得处理处理!

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

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=big5" >
	....(其他省略)....

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

    网页眉页及目录相关之权限设置 (DocumentRoot 与 Directory)

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

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

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
# 这个设置值是针对 WWW 服务器的『缺省环境』而来的,因为针对『/』的设置嘛!
# 建议保留上述的默认值 (上头数据已经是很严格的限制),相关参数容后说明。

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

这个地方则是针对 /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 文件内覆写 <Directory> 内的某些功能参数。 这个项目则是在规定 .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  <==首页『文件的文件名』设置!

如果用户端在网址列只输入到目录,例如 https://#/ 时,那么 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/"  <==制作一个目录别名 (相当类似捷径)!
<Directory "/var/www/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

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

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# ScriptAlias  网址列延伸  实际Linux目录
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

与上面的 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
<IfModule prefork.c>  <==根据不同的 PID 模式给予不同的 PHP 运作模块
  LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>
  LoadModule php5_module modules/libphp5-zts.so
</IfModule>
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),而且从此你可以使用 https://#/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 处。如果你是在服务器本机上面启动的浏览器,那直接输入『 https://# 』即可。同时看到画面中的箭头 2 所指处,你就可以发现首页的位置是在 /var/www/html/ 底下啰!但如果想要知道有没有成功的驱动 PHP 模块,那你最好先到 /var/www/html 目录下去创建一个简单的文件:

[root@www ~]# vim /var/www/html/phpinfo.php
<?php  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 的!
现在请使用浏览器浏览一下 https://# ,就会发现无法读取!为什么?请检查 /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 行左右:
<IfModule mod_userdir.c>
    UserDir disable
    #UserDir public_html
</IfModule>
# 将他改成如下的情况喔!
<IfModule mod_userdir.c>
    #UserDir disable
    UserDir www
</IfModule>

# 重新启动一下先!
[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/"
<Directory "/home/student/www">
        Options FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
</Directory>

[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 运行权限。
<Directory "/var/www/html/cgi">
    Options +ExecCGI
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

[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
<html>
<head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf8">
        <title>错误消息通知</title>
<head>
<body>
        <font size=+2 face="标楷体">您输入的网页找不到!</font><br />
        <hr />
        亲爱的网友,你所输入的网址并不存在我们的服务器当中,
        有可能是因为该网页已经被管理原删除,
        或者是你输入了错误的网址。请再次查明后在填入网址啰!
        或按<a href="/">这里</a>回到首页。
        感谢你常常来玩! ^_^<br />
        <hr />
        若有任何问题,欢迎联系管理员<a 
        href="mailto:vbird@www.centos.vbird">vbird@www.centos.vbird</a>。
</body>
</html>

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

找不到网页时的错误通报消息
图 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
<Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
    Deny from 192.168.1.101  <==约在 344 行添加底下两行!
    Deny from .gov.tw
</Directory>

[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
# 底下可是个错误的示范,请仔细看下个段落的详细说明喔!
<Directory "/var/www/html">
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from 192.168.1.101
    Deny from .gov.tw
    Allow from all
</Directory>

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

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

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

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

[root@www ~]# vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/lan">
    AllowOverride none
    Options FllowSymLinks

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

    # 再规定除了这三个动作之外,其他的动作通通不允许啦!
    <LimitExcept GET POST OPTIONS>
        Order deny,allow
        Deny from all
    </LimitExcept>
</Directory>

通过 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 行左右,你可以将他修改成为这样:
<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.1.0/24
    Allow from 127.0.0.1
</Location>

[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
<html>
<head><title>这是个测试网页啊!</title></head>
<body>看到这个画面了吗?如果看到的话,表示你可以顺利进入本受保护网页啦!
</body></html>
    2.1 以 root 的身份处理 httpd.conf 的设置数据

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

[root@www ~]# vim /etc/httpd/conf/httpd.conf
# 确定底下这几行是存在的,约在 400 行左右!
AccessFileName .htaccess
<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

# 在某个不受影响的地方加入这一段:
<Directory "/var/www/html/protect">
    AllowOverride AuthConfig
    Order allow,deny
    Allow from all
</Directory>

[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

# 先针对两个多出来的可浏览目录进行权限方面的规范啊!
<Directory "/var/www/www">
    Options FollowSymLinks
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory "/var/ftp">
    Options FollowSymLinks Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

# 针对三部主机的 DocumentRoot 进行定!
<VirtualHost *:80>
    ServerName    linux.centos.vbird
    DocumentRoot  /var/www/html
</VirtualHost>
<VirtualHost *:80>
    ServerName    www.centos.vbird
    DocumentRoot  /var/www/www
    CustomLog     /var/log/httpd/www.access_log combined
    # 不同的主页可以指定不同的注册表信息,这样比较好 debug 与分析啦!
</VirtualHost>
<VirtualHost *:80>
    ServerName    ftp.centos.vbird
    DocumentRoot  /var/ftp
</VirtualHost>

[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 https://#/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://vbird.org.cn/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/"
<Directory "/usr/local/awstats/wwwroot">
    Options +ExecCGI
    AllowOverride AuthConfig  <==这里改成这样,因为要保护!
    Order allow,deny
    Allow from all
</Directory>
[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                      <==缺省的监听端口口!不建议修改!
<VirtualHost _default_: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
</VirtualHost>

[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 代码 ?> 吗?有没有替代方案?
    缺省的情况下,你应该要输入 <?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 的版本移动到 此处
2003/01/14以来统计人数
计数器
其他链接
环境工程模式篇
鸟园讨论区
鸟哥旧站

今日 人数统计
昨日 人数统计
本月 人数统计
上月 人数统计