Linux基础服务 ·

Apache的进阶设定

[隐藏]

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

Apache 可以让我们系统中每个个人用户都拥有可以自己完全控管的首页,不过新版的配置 文件内预设将这个功能取消的,所以你必需要自行修订!

这只是个范例,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,并用该帐号建置底下的相关信息:

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

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

『理论上』就能够看到你的个人首页了。不过,可惜的是,我们的 SELinux 并没有放行个人首页!所以,此时你会发现浏览器出现 『You don't have permission』的讯息!

看一下你的 /var/log/messages,里面应该会提醒你进行这项工作:

这样就可以看到你的使用者个人网页!之后可以让使用者自己去设计他的网站!

我们可以将“~”这个符号做个修改,让 URL 更容易记忆识别一点,将使用者的个人网站设定成为:

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

最简单的方法是这样的:

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

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

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

如果你想要Apache可以执行perl之类的网页程序时,你就得需要安装一些额外的模块才行。其中 mod_perl 与mod_python 这两个软件建议你最好安装一下!然后我们也提到想要执行 CGI 程序就得到 /var/www/cgi-bin/ 目录下去执行。如果你想要在其他目录底下执行 CGI 程序也是可以的!

 


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

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

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

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

 


使用 ScriptAlias 的功能:

你可以直接利用文件名的别名来处理即可!我们现在假设所有在 /var/www/perl/ 目录下的文件都可以是 perl 所撰写的程序,那么我们可以这样做:

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

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

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

如果你的 Options 里面有设定 Indexes 的话,那么该目录下的所有文件都会被列出来,提供类似 FTP 的链接页面。

如果没有指定 Indexes 的话,那么错误讯息通知就会被显示出来。

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

虽然 Apache 预设有提供一些额外的资料给我们使用,不过,预设的画面比较简陋!因此我们需要按喜好来做一些修改!此时我们可以这样做:

上面那个文件 /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 的文件内容吧!

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

当然啦,你可以自行设定出符合你网页风格的信息!

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

你该如何限制用户端对你的 WWW 连线呢?iptables 仅能一口气开放或整个拒绝, 无法针对 WWW 的内容来部分放行。我们就可以通过 apache 内建的 order 项目来处置即可。

order 搭配 allow, deny 的相关限制:

Order deny,allow:以 deny 优先处理,但没有写入规则的则预设为 allow。常用于:拒绝所有,开放特定的条件;

Order allow,deny:以 allow 为优先处理,但没有写入规则的则预设为 deny。常用于:开放所有,拒绝特定的条件。

如果 allow 与 deny 的规则当中有重复的,则以预设的情况(Order 的规范) 为主。

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

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

虽然 deny 会先挪到上方来处理,不过因为 172.16.0.100 是在 all 的范围内,所以发生重复, 因此这个设定值将会以预设的 allow 为主,因此就无法限制住这个 172.16.0.100 的存取了!这边很容易搞错的哦!

例题:

如果有个应该要保护的内部目录,假设在/var/www/html/lan/ , 我仅要让172.16.0.0/16 这个网段可以浏览的话,那么你应该要如何设定的好?

答:

这个案例当中有点像是『拒绝所有连线,仅接受特定连线』的样子,因此可以使用 deny,allow 那个情况, 所以你可以这样做:

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

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

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

服务器状态说明网页

既然已经安装好了 WWW 服务器,除了提供服务之外,重要的是要如何维护!Apache 提供的特别功能来查询主机目前的状态!那就是 mod_status 这个模块!这个模块预设是关闭的,你必须要修改配置文件来启动他才行。

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

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

.htaccess 与认证网页设定

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

Apache 提供一个简单的认证功能, 让使用者可以输入帐号/密码即可取得浏览的权限的,便于我们可以轻松愉快的就设定好密码保护的网页!

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

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

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

建立密码文件:处理完基本的设定后,再来则是建立登入时所需要的帐号与密码!

最后,重新启动 Apache 就OK 啦!

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

所以啦,如果我们能够通过外部的文件来取代设定 httpd.conf 内的参数,那么是否会比较好?而且最好能够该 文件设定即生效,不需要重新启动 Apache的话,那就更好啦!因为如此一来,你就可以交给使用者自行管理他们的认证网页!

我们可以通过 httpd.conf 内的 AllowOverride 参数,配合 .htaccess 这个文件来设定就 OK 搞定!这个设定项目与配置文件 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 可以浏览到才行。所以你可以立刻将一些重要的资料给他搬移到这里来。我们先这样测试一下吧!建立个简单的测试网页即可。

 


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

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

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


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

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

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

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 所建立的,这个指令的语法是这样的:

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

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

务必将全部的浏览器都关闭,再重新启动浏览器。因为你成功的登入该目录后,该次登入的信息会缓存在这次的连线上!

可以将浏览器上头的『reload (重新读取)』按下去,让浏览器重新读取一次;否则快取不会更新。

可以将浏览器的快取资料全部清除,关闭浏览器后再重新启动浏览器看看。

如果还是一直出问题,那就只好前往日志(/var/log/httpd/error_log) 查看错误信息。常见的错误只是打错字啦!

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

接下来我们要谈的是『主机代管』,也就是虚拟主机,他可以让你的一部 Apache 看起来像有多个『主站首页』的感觉!


什么是虚拟主机(Virtual Host)

所谓的虚拟主机,基本上就是『让你的一部服务器上面,有好多个"主网页"存在,也就是说,硬体实际上只有一部主机,但是由网站网址上来看,则似乎有多部主机存在的样子!』。

 


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

那么要架设虚拟主机需要什么条件呢?首先必需要有多个主机名称对应到同一个 IP 去, 所以说,你必需先拥有多个主机名称才行:

向 ISP 申请多个合法的主机名称,而不自己架设 DNS;

自行设定经过合法授权的 DNS 主机来设定自己所需要的主机名称。


范例:

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

你要注意的只有几点:
在虚拟主机的设定上还有很多的可用的功能,不过,最低的限度是需要有 ServerName 及 DocumentRoot 这两个即可!

使用了虚拟主机后,原本的主机名称(linux.getlinux.cn) 也要同时写入虚拟主机的对应中, 否则这个主机名称可能会不知道被丢到哪里去!

在 www.getlinux.cn 这个主机当中多了个 CustomLog ,表示任何向 www.getlinux.cn 要求资料的记录都会改写入 /var/log/httpd/www.access_log 而不是预设的 /var/log/httpd /access_log。但这个新增的日志文件必需要加入 logrotate 的管理当中才行!否则日志文件会大到『爆表』

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


虚拟主机常见用途

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

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

服务器资料备援系统:
你可以在两个地方放置两部主机,主机内的网页资料是一模一样的(这个可以使用 rsync 来达成的) ,那么你将可以利用 Apache 的虚拟主机功能,配合 DNS 的 IP 指向设定,让某一部主机挂点时,另外一部主机立刻接管 WWW 的要求!让你的 WWW 服务器不会有任何断线的危机。

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

参与评论