Linux + Apache + MySQL + PHP (LAMP) 架设详解啰!
我们最常讲的『架站』其实就是架设一个 Web 网站啦!那么什么是 Web 呢?那就是全球信息广播的意思 (World Wide Web),或者也可以称之为互连网吧!这个是我们目前的人类最常使用的 Internet 的协定之一啦!通常说的上网就是使用 WWW 来查找用户所需要的信息啰!目前在 Unix-Like 系统中的 WWW 服务器主要就是通过 Apache 这个服务器软件来达成的, 而为了动态网站,于是 LAMP (Linux + Apache + MySQL + PHP) 就这么产生啦!让我们赶紧来进入 LAMP 的世界吧!
你知道网络为什么会这么流行吗?其实都是 WWW 造成的啦。早在 1993 年左右,鸟哥初次接触到网络, 当时的网络较热门的大概就是一些资源下载的 FTP 网站以及很多文本热烈讨论的 BBS 站了。 数据虽然丰富,不过,总是觉得少了点什么。后来上了研究所,为了课业需要, 经常连上台湾的学术网络 (TANET) 进行一些学术数据的检索,当时大约是 1996 年左右。 因为上网就是要找数据而已,所以就慢慢的很少使用网络了。
过了几年后,再次使用图形接口的操作系统,竟然发现只要点几个小按钮,就会有很多网络上花花绿绿的文本与图案, 有的网站甚至提供影音的特效,当时真是相当的讶异!不过,由于图形图像的视觉方面要比 BBS 纯文本的数据吸引人,自然造成很多人喜欢流连在互联网上,人潮多当然就有商机!由于奇货可居,才有后来 90 年代末期的浏览器大战,这个商业大战也造成后来 WWW 标准不被某些浏览器所支持的后果。
这些年由于搜索引擎、个人网志 (blog)、社群网站 (例如 facebook 等)、智能手机等的流行,又将互联网推向另一个新境界!啊! 要学的东西真是很多啊~@_@。底下让我们来了解了解什么是 WWW 以及他所需要的服务器软件,还有一些浏览器相关的信息吧!
互联网 (TCP/IP) 会这么热门,主要是 80 年代的 email 以及 90 年代之后的 WWW 服务所造成的!尤其是 WWW 这个玩意儿。 WWW 是 World Wide Web 的缩写,其中 Web 有广播网的意思存在, 所以简称为万维网的就是了。WWW 可以结合文本、图形、图像以及声音等多媒体,并通过可以让鼠标点击的超链接 (Hyperlink) 的方式将信息以 Internet 传递到世界各处去。
与其他的服务器类似的,你要链接上 WWW 网站时,该网站必需要提供一些数据, 而你的用户端则必需要使用可以解析这些数据的软件来处理,那就是浏览器啦!简单的来说,你可以这样瞧一瞧 WWW server/client 的相关性:
从上面的图标当中,我们大概可以得到一些观念:
如上所提到的相关信息,我们知道服务器端需要提供用户端一些数据,而这些数据其实主要都以 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 的 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/)。
虽然 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 服务器的重点是提供一些数据,这些数据必需要是用户端的浏览器可以支持显示才行。 那么这些数据是什么类型啊?很简单啊,当然大部分就是文件啰。如此说来,我们必需要在服务器端先将数据文件写好, 并且放置在某个特殊的目录底下,这个目录就是我们整个网站的首页了! 一般来说,这个目录很可能是在 /var/www/html/ 或者是 /srv/www/。我们的 CentOS 缺省在 /var/www/html 喔。
那么浏览器如何取得这个目录内的数据呢?你必需要在浏览器的『网址列』输入所需要的网址才行。 这个网址就对应到 WWW 服务器的某个文件文件名就是了。不过,现今的浏览器功能实在很多,他不只可以连上 WWW ,还可以连上类似 FTP 之类的网络通信协定。所以你得要在网址列输入正确的网址,这个网址包括这样:
上头就是我们常常听到的 URL (Uniform Resource Locator) 啦!以斜线作为分段, 它可以这样被解释:
所以啦,我们的服务器会由于浏览器传来的要求协定不同而给予不一样的回应数据。那你了解到网址列的意义了吗?
如果浏览器是以 http://hostname 的型态来向服务器要数据时,那么浏览器与服务器端是如何传递数据的呢? 基本上有这几种方法:
常见的是 GET 这个项目啦!如果有大量数据由用户端上传到 WWW 服务器端时,才会使用到 POST 这个项目。 你还是得需要注意一下这些举动,因为后续的注册表分析内容都是使用这种动作来分析的呦!
以目前的网络世界来说,市占率较高的 WWW 服务器软件应该是 Apache 与 IIS 这两个玩意儿, Apache 是自由软件,可以在任何操作系统上面安装的,至于 IIS 则是 Windows 家族开发出来的, 仅能在 Windows 操作系统上面安装与运行。由于操作系统平台不一样,所以其上安装的软件当然也不相同。 底下就让我们来聊一聊目前网站的一些特色吧!
这种类型的网站大多是提供『单向静态』的网页,或许有提供一些动画图标,但基本上就仅止于此啦! 因为单纯是由服务器单向提供数据给客户端,Server 不需要与 Client 端有交互,所以你可以到该网站上去浏览, 但是无法进行进行数据的上传喔!目前主要的免费虚拟主机大多是这种类型。所以,你只要依照 HTML 的语法写好你的网页,并且上传到该网站空间上,那么你的数据就可以让大家浏览了!
这种类型的网站可以让服务器与用户交互,常见的例如讨论区论坛与留言版,包括一些博客也都是属于这类型。 这类型的网站需要的技术程度比较高,因为他是借由『网页编程语言』来达成与用户交互的行为, 常见的例如 PHP 网页编程语言,配合 MySQL 数据库系统来进行数据的读、写。整个交互可以使用下图来说明:
这就是所谓的服务器端工作任务接口 (Server Side Include, SSI),因为不论你要求的数据是什么,其实都是通过服务器端同一支网页程序在负责将数据读出或写入数据库, 处理完毕后将结果传给用户端的一种方式,变动的是数据库内的数据,网页程序其实并没有任何改变的。这部份的网页程序包括 PHP, ASP, Perl...很多啦!
另外一种交互式的动态网页主要是在用户端达成的!举例来说,我们可以通过利用所谓的 Java scripts 这种语法, 将可运行的代码 (java script) 发送给用户端,用户端的浏览器如果有提供 java script 的功能, 那么该程序就可以在用户端的电脑上面运作了。由于程序是在用户端电脑上运行, 因此如果服务器端所制作的程序是恶意的,那么用户端的电脑就可能会遭到破坏。 这也是为啥很多浏览器都已经将一些危险的 java script 关闭的原因。
另外一种可在用户端运行的就是 flash 动画格式,在这种动画格式内还可以进行编程, 因此用户端只要拥有可以运行 flash 动画的软件,那就可以利用这个软件来达到交互式的对谈。 这些都算是动态网站所提供的功能喔!
从上面的说明你可以知道动态网站是目前比较热门的,像是近两年来如同雨后春笋一般冒出来的个人博客 (blog) 就是很经典的动态网站之一。而由图 20.1-2 我们也知道要做成这样的动态网站你必需要有:
在整个平台设计上面,目前常见的有两大系统,一个是 Linux 操作系统上面,搭配 Apache + MySQL + PHP 等而达成,这个系统被称为 LAMP。另一个则是微软的 IIS + MSSQL + ASP (.NET) 服务器。在能见度与市占率方面,应该还是以 LAMP 为主吧!在 LAMP 里面除了 Linux 之外,其他三个小东西就让我们来谈谈先:
关于 HTTP 这个传输协定当中,你必需要知道的是:『这个传输协定传输数据是以明码发送的』, 所以你的任何数据封包只要被监听窃取的话,那么该数据就等于是别人的啦!那想一想, 你有过上线刷卡的经验吗?上线刷卡只要输入你信用卡的卡号与相关的截止日期后,就能够进行交易了。 如果你的数据在 Internet 上面跑时是明码的情况下,真要命!那你的信用卡不就随时可能会被盗用?
虽然大多数 Internet 上面的 WWW 网站所提供的数据是可以随意浏览的,不过如同上面提到的, 一些物流交易网站的数据以及关于你个人的重要机密数据当然就不能这样随意发送啦! 这个时候就有需要用到 https://hostname 这种连接的方式啦!这种方式是通过 SSL 加密的机制喔!
还记得我们在第十一章的 SSH 服务器当中介绍过他连接的机制吧? 就是利用非对称的 key pair (Public + Private kye) 来组成密钥,然后通过公钥加密后传输, 传输到目标主机后再以私钥来解密,如此一来数据在 Internet 上面跑就以加密的方式, 想当然尔,这些数据自然就比较安全啦!SSL 就是利用在 WWW 传输上面的加密方式之一啦!
当浏览器端与 WWW 服务器端同时支持 SSL 的传输协定时,在连接阶段浏览器与服务器就会产生那把重要的密钥! 产生密钥后就能够利用浏览器来发送与接收加密过的重要数据啦!要达成这样的机制, 你的 WWW 服务器必需要启动 https 这个重要的传输协定,而浏览器则必需要在网址列输入 https:// 开头的网址,那两者才能够进行沟通与连接。要注意的是,在某些很旧的浏览器上面是不支持 SSL 的, 所以在那些旧的浏览器上就无法达成 https 的连接啦!
想一想 SSL 这个机制有什么问题?他的问题就是:『那把 Public key 是服务器产生且任何人都能取得的』!这是什么问题?因为 public key 可让任何人取得, 若被钓鱼网站取得并且制作一个很类似你网络银行的网站,并且骗你输入帐密,要命了!因为你不知道该网站是诈骗集团制作的, 以为 https 就是安全的,如此一来,即使你的数据有加密,但结果,在钓鱼网站服务器端还是能够取得你输入的帐密啊! 这个时候就需要第三方公正单位来帮忙啦!
所谓的 CA 就是一个公认的公正单位,你可以自行产生一把密钥且制作出必要的凭证数据并向 CA 单位注册 (讲到注册你就要知道...这东西是要钱的意思!),那么当用户端的浏览器在浏览时,该浏览器会主动的向 CA 单位确认该凭证是否为合法注册过的,如果是的话,那么该次连接才会创建,如果不是呢?那么浏览器就会发出警告消息, 告知用户应避免创建连接啊。所以说,如此一来 WWW 服务器不但有公正单位的背书,用户在创建连接时也比较有保障!
更多关于 SSL 以及 CA 的介绍,可以约略参考一下:
咱们前面谈到 WWW 服务器是 Server/Client 的架构,而用户端使用的软件就是浏览器啊! 目前比较知名的自由软件浏览器主要有两款,包括 Mozilla 基金会管理的 firefox (火狐狸) 以及 Google 自行推出的 chrome。至于市占率较高的还有 windows 的 IE。
由于浏览器可以链接到互联网上,所以浏览器也有可能被攻击! 其中由于 IE 直接内嵌至 Windows 的内核当中,所以如果 IE 有漏洞时,对于系统的损害是很大的! 因此无论如何,请记得『务必要随时更新到最新版本的浏览器』才行。建议你可以使用 firefox 或 chrome 这些小巧玲珑的浏览器啊!
除了窗口接口的浏览器软件之外,其实还有几个可以在文本接口底下进行浏览与网页下载的程序,分别是:
这几个指令我们已经在第五章谈过了,请自行前往参考喔!
从前面的说明当中,我们知道在 Linux 上面要达成网页服务器需要 Apache 这套服务器软件呐!不过 Apache 仅能提供最基本的静态网站数据而已,想要达成动态网站的话,那么最好还是需要 PHP 与 MySQL 的支持才好。所以底下我们将会以 LAMP 作为安装与设置的介绍,加油吧! ^_^
既然我们已经是 Linux 操作系统,而且使用的是号称完全兼容于 Red Hat Enterprise Linux 的 CentOS 版本, 那当然只要利用 CentOS 本身提供的 Apache, PHP, MySQL 即可!不建议你自行利用 tarball 安装你的 LAMP 服务器。因为自行安装不但手续麻烦,而且也不见得比系统缺省的软件稳定。 除非你有特殊的需求 (例如你的某些 Apache 插件程序需要较高的版本,或者是 PHP, MysQL 有特殊版本的需求), 否则请使用 yum 来进行软件的安装即可。
那么我们的 LAMP 需要哪些东西呢?你必需要知道的是,PHP 是挂在 Apache 底下运行的一个模块, 而我们要用网页的 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 这个版本的相关结构,这样才能够知道如何处理我们的网页数据啊!
至于 MySQL 方面,你需要知道的几个重要目录与文件有:
另外,在 PHP 方面呢,你应该也要知道几个文件喔:
基本上我们所需要的几个软件他的结构就是这样啦!上面提到的是 Red Hat 系统 (RHEL, CentOS, FC) 所需的数据, 如果是 SuSE 或其他版本的数据,请依照你的 distribution 管理软件的指令 (rpm 或 dpkg) 去查找一下, 应该就能够知道各个重要数据放置在哪里啦!这些数据很重要,你必需要对放置的地点有点概念才行喔!
在开始设置 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 服务器的基础设置吧!
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 的服务,反应速度就比较快。 简单的说,这两个模块的功能分类为:
在上面的设置中,比较有趣的是 MaxClients 这个进程模块的参数值,如同上面的说明,这个 MaxClients 设置值可以控制『同时连上 WWW 服务器的总连接要求』数量,亦即想成最高即时在线人数啦。 不过你要注意的是,MaxClients 的数量不是越高越好,因为他会消耗物理内存 (与 process 有关嘛),所以如果你设置太高导致超出物理内存能够容许的范围,那么性能反而会降低 (因为系统会使用速度较慢的 swap 啊),此外, MaxClients 也在 Apache 编译时就指定最大值了,所以你也无法超出系统最大值, 除非...你重新编译 Apache 啦!
除非你的网站流量特别大,否则默认值已经够你使用的了。而如果你的内存不够大的话,那么 MaxClients 反而要调小一点,例如 150 ,否则性能不佳。那,apache 到底是使用那个模块啊?prefork 还是 worker ?事实上 CentOS 将这两个模块分别放到不同的运行档当中,分别是:
那如何决定你使用的是哪一支程序?你可以去查阅一下 /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 内,尤其是虚拟主机很常使用这样的设置,在移机时会很方便的!
目前的互联网传输数据编码多是以万国码 (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 提供缺省语系才对!
我们不是讲过 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 这个目录来设置权限啦!就是咱们首页所在目录的权限。 主要的几个设置项目的意义是这样的 (这些设置值都很重要!要仔细看喔!):
除了这些数据之外,跟网站数据相关性高的还有底下的几个咚咚:
[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 后面的文件名参数,越前面的越优先读取。 那如果文件名通通不存在呢?就是说没有首页时,该如何读取?这就与刚刚谈到的 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 了啦!接下来准备一下看看还有哪些额外的设置档需要处理的呢?
我们前面稍微提过 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 的设置档其实是在 /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 的使用手册呢!真方便!有兴趣的话可以参考与安装底下这些软件喔:
perl 与 python 是与 PHP 类似的咚咚,都是一些很常用在网页的编程语言! 例如知名的 OpenWebMail (http://openwebmail.org/) 就是利用 perl 写成的。要让你的 WWW 支持该编程语言, 你就得要安装这些东西啦!(但不是所有的软件都安装!请安装你需要的即可!)
我们未来可能会使用 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 信息可能还含有其它的额外信息,所以当然要比文件容量大才行!所以在设计这个设置档时, 这两个值得要特别注意喔!
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 看看先:
你可以在服务器上面启动图形接口来查阅,也可以通过客户端电脑来连接 (假设防火墙问题已经克服了)。 鸟哥这里假设服务器为 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 信息等等。这个文件建置完毕后,接下来你可以利用浏览器去浏览一下这个文件:
注意看网址的部分喔!因为我们 phpinfo.php 是放置在首页目录底下,因此整个 URL 当然就成为上述箭头 1 当中的模样了。 这个 phpinfo() 函数输出的内容还挺机密的,所以测试完毕后请将这个文件删除吧!从上头的画面你可以知道 PHP 模块的版本以及 Apache 相关的重要数据啦!自己仔细瞧瞧吧!如此一来,你的 Apache 与 PHP 就 OK 的啦!
那万一测试失败怎么办?常见的错误问题以及解决之道可以参考:
在 LAMP 服务器里面,Linux, Apache, PHP 已经处理完毕,那么 MySQL 呢?所以,接下来就是要处理这个数据库软件啰。 在启动 MySQL 前其实系统并没有帮我们创建任何的数据库。当你初次启动 MySQL 后,系统才会针对数据库进行初始化的创建啊。 不相信的话你可以先看看 /var/lib/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 相关的语法啰!不在本文的讨论范围啦!
由于 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 的密码怎么办?网络上有一些工具可以让你去处理 MySQL 数据库的挽回。 如果你的数据库内容并不是很重要,删除也无所谓的话 (测试中 @_@),那么可以将 MySQL 关闭后, 将 /var/lib/mysql/* 那个目录内的数据删除掉,然后再重新启动 MySQL ,那么 MySQL 数据库会重建, 你的 root 又没有密码啦!
不过,这个方法仅适合你的数据库并不重要的时候,如果数据库很重要...那千万不要随便删除啊!
设置好了 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看到上面画底下的地方了吧?就是他!运行一下,你就能发现如何处理啰! |
基础的 LAMP 服务器架设完毕之后,基本上,你就可以开始设计你想要的网站啰!编写网页的工具很多,请自行寻找吧! 不过对于这个简单的 LAMP 服务器,你必须要知道的是:
除了这些基本的项目之外,其实你可以使用互联网上面人家已经做好的 PHP 程序架站机喔! 譬如说讨论区软件 phpBB3 这个玩意儿,完整的架站软件 PHPNuke 以及博客软件 lifetype 等等。 但这些架站机都需要 PHP 与数据库的支持,所以你必需要将上述介绍的 LAMP 完整的安装好才行。 如果你不喜欢自己写网页的话,那么这些有用的架站软件就够你瞧的啰!鸟哥列出几个链接给你玩一玩先!
不过请注意,这些软件由于是公开的,所以有些怪叔叔可能会据以乱用或乱改,因此可能会有一些 bug 会出现!因此,你必需要取得最新的版本来玩才行,而且架设之后还得要持续的观察是否有更新的版本出现, 随时去更新到最新版本才行喔!免得后患无穷~
事实上,刚刚上头的基本设置已经很足够朋友们架设 WWW 服务器所需了!不过,还有很多可以玩玩的地方, 例如个人用户首页、虚拟主机以及认证保护的网页等等。底下我们分别来谈一谈啰!
每一部 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 呢!
|
现在假设我们要让已经存在系统中的 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 才行!这个很重要啊! 那么未来只要你在浏览器的网址列这样输入:
『理论上』就能够看到你的个人首页了。不过,可惜的是,我们的 SELinux 并没有放行个人首页!所以,此时你会发现浏览器出现 『You don't have permission』的消息!赶紧看一下你的 /var/log/messages,里面应该会教你进行这项工作:
[root@www ~]# setsebool -P httpd_enable_homedirs=1 [root@www ~]# restorecon -Rv /home/ # 第一个指令在放行个人首页规则,第二个指令在处理安全类型!
就可以看到你的用户个人网页啰!之后让用户自己去设计他的网站吧!现在你知道那个毛毛虫 (~) 在 URL 上面的意义了吧? ^_^!不过,多这个毛毛虫就很讨厌~我可不可以将用户的个人网站设置成为:
是可以啦!最简单的方法是这样的:
[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 喔!
在前几个小节里面我们有谈到,如果你想要 Apache 可以运行 perl 之类的网页程序时, 你就得需要安装一些额外的模块才行。其中 mod_perl 与 mod_python 这两个软件建议你最好安装一下啦!然后我们也提到想要运行 CGI 程序就得到 /var/www/cgi-bin/ 目录下去运行。如果你想要在其他目录底下运行 CGI 程序是否可以?当然行啊!
假设想要运行 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』即可运行该文件并将结果显示在屏幕上面啰!
你可以直接利用文件名的别名来处理即可!更简单呢。我们现在假设所有在 /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 首页底下也可以成功的啦!这两个方法你可以随意取一个来处理即可!不需要两个都进行啦!
如果你的 /var/www/html/cgi 目录底下没有任何首页文件 (index.???) 时,那当用户在网址列输入『 http://your.hostname/cgi 』,请问结果会显示出什么呢?可能有两个:
事实上 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 是啥意思?他的意义是这样的:
好了,接下来让我们编辑一下那个 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>
现在你如果在网址列随便输入一个服务器上不存在的网址,就会出现如下的画面啰:
当然啦,你可以自行设置出符合你网页风格的数据啦!例如鸟哥的网站上面就列出一些基本的链接, 帮助网友们可以顺利的取得他们想要的数据啊!这也是很重要的功能呢!^_^
你该如何限制用户端对你的 WWW 连接呢?你会说,那就利用 iptables 这个防火墙嘛!那有什么难的?问题是, 如果同一个 IP 来源,他某些网页可以浏览,但某些网页不能浏览时,该如何设置?iptables 仅能一口气开放或整个拒绝, 无法针对 WWW 的内容来部分放行。那该如何处理?就通过 apache 内置的 order 项目来处置即可。 先来回忆一下 order 搭配 allow, deny 的相关限制:
举例来说,如果我们的首页目录想要让 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 这个玩意儿说。
既然已经安装好了 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 即可发现如下的模样:
输出的结果包括目前的时间以及 Apache 重新启动的时间,还有目前已经启动的进程等等, 还有网页最下方会显示每个进程的用户端与服务器端的连接状态。虽然显示的状况挺阳春,不过该有的也都有了, 可以让你约略了解一下服务器的状况啰。要注意喔,可查阅者 (allow from 的参数) 还是需要限制的比较严格一点啦!
对于保护 Apache 本身的数据方面,除了上述的 Order 以及 Limit 之外,还有什么方式呢? 因为 Order 与 Limit 主要是针对 IP 网域或者是主机名称来管理,那如果我们用户端是使用拨接方式取得 IP, 那么 IP 会一直变动的,如此一来那个保护的目录用户也就不能在任何地方进入了,会造成一些困扰。
此时如果能够使用密码保护的方式,让用户可以输入帐号/密码即可取得浏览的权限的话,那用户端就不用受到那个 order 的 Allow, deny 的限制啦!真好~呵呵!Apache 确实刚好有提供一个简单的认证功能, 让我们可以轻松愉快的就设置好密码保护的网页呢!
那么那个认证网页如何搞定?简单的说,他要这样处理:
其中,第二个步骤会比较有趣,我们说过,任何的设置数据都可以直接写到 httpd.conf 这个设置档当中, 所以设置保护目录的参数数据确实可以写入 httpd.conf 当中。不过,想一想,如果你的 Apache 服务器有 30 个用户具有个人首页,然后他们都需要制作保护目录,那个 httpd.conf 只有身为 root 的你才能够修改, 更可怕的是『每次改完都需要重新启动 Apache』~请问,你的时间精力是否会受到『很严厉的考验?』
所以啦,如果我们能够通过外部的文件来取代设置 httpd.conf 内的参数,那么是否会比较好? 而且最好能够该文件设置即生效,不需要重新启动 Apache 的话,那就更好啦!因为如此一来, 你就可以交给用户自行管理他们的认证网页啰!呵呵~通过 httpd.conf 内的 AllowOverride 参数,配合 .htaccess 这个文件的设置就 OK 搞定!这个设置项目与设置档 httpd.conf 的关系可以这样看:
也就是说:
既然 .htaccess 的用途比较广,所以底下我们不介绍 httpd.conf 的认证参数了,请你自行测试即可。底下主要以 .htaccess 文件的设置为主喔!赶紧来看看吧!
假设我要将受保护的数据放置到 /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>
这个动作仅有 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 的创建了。
要注意,这个文件是在保护目录底下喔!不要放错地方啦!所以你要这样做:
[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
这些参数的意义是这样的:
设置好就立刻生效了,不需要重新启动任何东西啊!
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』试看看,结果会如何? 会像底下这个样子:
如果你曾经浏览过这个目录了,当时可能尚未制作保护的文件,或者是文件设计错误,导致你曾经可以浏览该网页, 则该网页会被你的浏览器缓存 (cache) 起来,所以可登录的画面会一再地出现而不会跑出需要认证的对话窗口。此时你应该要:
如果还是一直出问题,那就只好前往注册表 (/var/log/httpd/error_log) 察看错误信息啰。 常见的错误只是打错字啦!@_@
接下来我们要谈的是『主机代管』...瞎密?不是啦~是一个称为虚拟主机的东西啦~这东西很有用喔!他可以让你的一部 Apache 看起来像有多个『主站首页』的感觉啦!
所谓的虚拟主机,基本上就是『让你的一部服务器上面,有好多个 "主网页" 存在,也就是说,硬件实际上只有一部主机,但是由网站网址上来看,则似乎有多部主机存在的样子!』。 举个例子来说好了,鸟哥提供的网站主要有主要学习网站以及新手讨论区,分别在底下的链接:
这两个链接你给他点下去,会发现其实是不同的数据内容,不过,如果你用 dig 之类的软件来查验 IP 的话,会发现这两个网址都指向同一个 IP ㄟ!怎么会这样?没错啊!这就是虚拟主机的主要功能!他可以让你的多个主机名称对应到不同的主网页目录 (DocumentRoot 参数), 所以看起来会像有多部实际主机的模样啦!这样说,了解虚拟主机了吗?
那么要架设虚拟主机需要什么咚咚呢?以刚刚鸟哥的网站的结果为例,我必需要有多个主机名称对应到同一个 IP 去, 所以说,你必需先拥有多个主机名称才行。要如何拥有多个主机名称?那就是:
相关的 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你要注意的只有几点:
接下来,只要你用户端的浏览器可以找到这三个主机名称并连接到正确的 IP 去, 你这个 Apache 就可以同时提供三个网站的站址了,很方便吧!^_^。
虚拟主机为什么会这么热门啊?这是因为他可以进行底下的任务:
除了这些基本的 Apache 使用方式之外,我们还有哪些事情可以玩的?当然还有很多啦!包括有趣的 PHP 性能强化模块、注册表分析以了解整个 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 没有启动的话,那就看不到上图的画面啦!借由这个动作来测试测试吧! ^_^! 接下来我们利用 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 之类的网页似乎没有办法成功的完成测试的样子, 你应该以较单纯的网页来测试吧!)
请特别注意,我们的 Apache 注册表主要记录两个东西,分别是:
那个 /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 以上才好呐!而且备份注册表也要压缩才好呐!
此外,通过分析注册表其实我们可以知道我们的网站到底是哪一个网页最热门?也且也能知道用户端是来自哪里呢!目前针对 Apache 有很多的分析软件,我们底下仅介绍两个常见的分析软件给大家呦!
事实上,CentOS 6.x 缺省就提供了 webalizer 这个分析软件了!你只要将这套软件安装上来就是了。 如果你不是使用 CentOS 呢?没关系,官方网站上也可以下载,安装也很简单!
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 ,看看输出的结果是如何吧! 结果应该会如下所示:
在上图当中的箭头 1 处你还可以点击喔,点击后会告知你当月的各项分析结果,很不错吧!
除了 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,其实这个设置档『文件名』格式为:
因为鸟哥这部主机名称为 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/』,就能够看到输出的图表了!图表有点像这样:
事实上,数据非常的多,你可以自行查阅输出的结果。在上图当中的箭头处,你还可以自己选择曾有的月份数据来进行显示! 最后,将分析的动作规定在每天三点的时候跑,你可以这样做:
[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.1 就谈过 http 这个通信协定是明码发送数据,而那个 https 才是加密传输的!那加密的方法是通过 SSL 啊,这个 SSL 就是以 openssl 软件来提供的一个加密函数库。更多与 https 有关的信息,请参考 20.1.4 吧!
要达成让 apache 支持 https 协定的话,你必须要有 mod_ssl 这个软件才行!请先自行使用 yum 去装好这个软件吧! 并且重新启动 httpd 喔!同时,我们的 CentOS 6.x 也已经缺省提供了 SSL 机制所需要的私钥与凭证文件啰!相关软件提供的文件如下:
既然系统都已经帮我们搞定了,那么就让我们直接来浏览一下,看看系统缺省提供的 https 是长的什么模样吧! 打开你的浏览器,输入 https://你的IP 来连接看看:
就如同本章 20.1.4 谈到的,因为我们这个 Apache 网站并没有将此凭证向 CA 注册,因此就会出现上述的消息了! 这就类似 ssh 连接时,系统需要你输入『 yes 』是一样的啦!要接受凭证后才能够进行加密的功能。所以,请点击上图中的箭头 1,此时就会延伸出箭头 2 的位置,按下去吧!然后就会出现如下所示:
如果你确定这个网站是你自己的可信任网站,那就按下 1 及 2 的箭头处!如果还想要看一下这个网站所提供的相关凭证内容, 就按下 3 箭头的地方:
由于这个凭证文件的建置是在第一次启动 Linux 时就安装好了凭证档,而在 CentOS 6.x 底下,缺省的凭证有效期限为 1 年,所以你就会看到上图中箭头 2 所指的,签发日到到期日共有一年啊!当你按下关闭后,就能够看到实际的 https:// 提供的网站内容啰!这就是缺省的 SSL 网站啦!你的重要信息可以放在这里~让数据在网络上传输更佳的安全!
缺省的凭证虽然已经可以让你顺利的使用 https 了,不过,凭证的有效日仅有 1 年而已~实在讨厌~ 所以,我们还是得要自制凭证才行~这个凭证的制作仅是私有 WWW 网站的用途,并没有要拿去 CA 注册喔! 那么自制凭证需要什么步骤呢?基本上需要的流程是:
那么创建凭证有没有很困难呢?没有啦!因为 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 即可!
修改 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:// 的网址,就能够查阅到刚刚创建的凭证数据。不过,因为我们之前已经有浏览过缺省的凭证, 所以网页以及凭证都有被缓存过!因此,你可能得需要到浏览器的隐私保护的地方,将记录的凭证删除,并且将网页缓存删除, 这样才能够看到最终如下的正确凭证数据喔!
或许你已经发现一个无俚头的地方,就是我的 http:// 以及 https:// 首页是一模一样的嘛!那么我的读者干嘛没事找事干, 肯定不会使用 https 的嘛!那怎办?怎么强制用户使用 https:// 来查阅我的重要数据?很简单啊! 通过虚拟主机就好了啊!因为 SSL 模块也是缺省提供了这个功能的嘛!修改会不会很麻烦呢?不会啦! 你只要将 http 及 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 两个完整的分开,你的重要数据需要加密的,终于有个可靠的地方摆放啰!^_^
几个比较知名的网站管理员大概都有这样的困扰,那就是网站常被砍站软件所强力下载,结果造成主机的 CPU loading 过重,最后竟然会导致死掉~唉!真是的~人怕出名猪怕肥呐!先来解释一下什么是砍站吧!
所谓的『砍站』,就是以类似多点连接下载的持续性消息传递软件进行网站数据的下载,而且, 一激活该软件,该软件就将『整个网站』的内容都给他 download 下来,很厉害吧!没错!是很厉害,但是却也害死人了~怎么说呢?
因为这种软件常常会为了加快 download 的速度,所以采用多点连接的方式,也就是会持续不断的向 Server 发出要求封包,而由于这些封包并不见得能够成功的让 Server 把数据传导给 Client 端,常常会无法投递就是啦!这样的结果就是...造成 Server 要一直不断的回应,又无法正确的回应出去, 此外,要求太过频繁,结果主机应接不暇,最后...就当机了...真的是林老师ㄌㄟ~
鸟哥的鸟站主机古早以前,就是因为这样的原因,导致服务常常断断续续的,并且,由于 CPU loading 太高,结果让正常连接进来看数据的网友没有足够的资源,因此网页打开的速度就变的很慢~唉~ 这些砍站的人,也太不道德啦!
由于这种砍站软件真的很麻烦,一不注意马上就又会被砍站而当机,三天两头就要重新开机一次,完全让 Linux 的稳定性无法发挥!真是气死了~后来,鸟哥就自行写了一个 scripts 来挡这样的 IP !我的作法是这样的:
大致上就是这样吧!这样的一程序需要与 iptables 相互配合,所以,请先查阅一下第九章的防火墙内容,然后再来下载这支程序吧! 这支程序你可以在底下的网址下载喔!
详细的安装步骤鸟哥已经以中文写在该文件里面了,所以请先查看一下该文件的前面说明部分吧!此外, Study Area 的 netman 大哥也已经开发了一套很棒的防砍站的程序了! 在防堵砍站的原理上面是完全相同的,不过写法可能不是很雷同就是了!如果有需要的话,也可以前往 Study-Area 搜索一下啰!