Cgi特性:配置文件明确定义了cgi,可以使httpd实现一个动态装载的效果。

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

Cgi-bin

书接上文,在我们的配置文件内定义了cgi-bin的ScriptAlias,可以加载一个类似动态页面的效果。

我们在CentOS6.5中对/var/www/cgi-bin/下建立一个bash脚本,脚本内容如下:

#!/bin/bash
#
cat <<EOF
Content-type:text/html

<pre>
the hostname is $(hostname)
the date is $(date)
</pre>
EOF

然后把它给一个x(可执行的权限),因为默认启动我们httpd服务的是配置文件中定义的apache用户。

于是我们用客户端win7通过浏览器访问该页面,就如下图一样:

image 出现了我们定义的时间和主机名变量,是不是很好用!

因为动态资源模块加载需要解释器加入,还需要额外开启子进程进行执行程序,这无疑很大程度上加大了服务器的负荷,所以后期我们开发某个页面必须要做到动静分离,才能加速效果。

CGI协议有很多不一样的变种,如CGI与PHP联系起来就启动了三种模式,CGI、fastcgi和模块模式。

httpd基于用户访问控制

用户认证:1、基本认证(basic)  2、摘要认证:digest 基于Hmac。

虚拟用户,指的不是用于登录操作系统的账号,而仅仅是用于某服务,或者获取某个资源的用户账号。

那我们可以把虚拟用户的信息放到文本文件中,放到哪里都可以,最好啊存放于web服务配置目录下即/etc/http/ ,最好隐藏起来

还可以选择放到SQL数据库中,或者放到dbm(基于文本文件的数据库引擎,它的存放方式基于哈希编码存放的,所以检索起来比快。

 

基于服务器本身做认证,basic认证和digest摘要认证。

如何基于文件方式做访问控制

1、你想对网页文件那个做访问,就先在linux下建立该目录,如我们想在根文件目录下建立一个bbs目录,明确对bbs目录进行用户认证。

[root@www html]# pwd
/var/www/html
[root@www html]# mkdir bbs

drwxr-xr-x 2 root root 4096 Aug 10 02:55 bbs

然后在配置文件里面directory里设定限定,格式如下:

<Directory "/var/www/html/bbs"> 定义对哪个目录进行用户认证

Options none 选项可以没有
AllowOverride AuthConfig 表示用户认证的配置
AuthType Basic 用户认证使用的方式,这里用是basic
AuthName "auth" 用户请求资源之前看到的提示
AuthUserFile /etc/httpd/conf/.htpasswd 对于哪个记录了用户的信息的文件

如果我们使用文件类型来验证用户信息,这里还可以选择一个不用填写的叫

AuthBasicProvider file 明确指出针对basic认证使用的认证方式是文件。

还可以丰富这个限定内容,比如这个bbs区域仅允许bill登录,我们还可以添加

Require user bill

如果允许所有用户就使用valid-user

</Directory>

第二步,创建认证文件.htpasswd

认证文件中的账号是明文的,密码是摘要的,即密文的。所以我们不应该手动编辑生成,所以有命令可以帮助我们生成.htpasswd文件。

命令htpasswd

-c :如果文件事先不存在就创建(仅能在创建第一个用户中使用)

-m 以md5的格式编辑存储用户的密码信息。

-D 删除指定用户的

我们来手动为bill用户生成一个文件记录他的账号密码:

[root@www ~]# htpasswd /etc/httpd/conf/.htpasswd bill
htpasswd: cannot modify file /etc/httpd/conf/.htpasswd; use '-c' to create it它提示我们这个文件事先并不存在,需要-c选项先创建它。

[root@www ~]# htpasswd -c /etc/httpd/conf/.htpasswd billNew password:
Re-type new password:
Adding password for user bill

显示添加成功。

我们还想为其他人在此文件里添加账号和密码就不能使用-c选项了,直接使用命令:htpasswd –m /etc/httpd/conf/.htpasswd jimmy

这里看:

[root@www ~]# htpasswd -m /etc/httpd/conf/.htpasswd jimmy
New password:
Re-type new password:
Adding password for user jimmy

jimmy用户账号和密码创建成功。

接下来我们来查看下该文件:

[root@www ~]# cat /etc/httpd/conf/.htpasswd
bill:/4xE19TDXwecQ
jimmy:$apr1$OIw1LAIH$I1G2kBR.jxWJogmCZbZkF0

接下来让我们客户端访问一下看看!

image_thumb

删除用户:

[root@www ~]# htpasswd -D /etc/httpd/conf/.htpasswd jimmy
Deleting password for user jimmy

看看jimmy就不能登录了。

上面是用户的认证,我们的httpd还可以对组进行认证。还是修改配置文件,在

<Directory "/var/www/html/bbs">

Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "auth"
AuthUserFile /etc/httpd/conf/.htpasswd

添加 AuthgroupFile /etc/httpd/conf/.htgroup
AuthBasicProvider file

添加 Require group 组名

</Directory>

剩下的就是要用vim编辑一个.htgroup的文件,但是在编辑之前,最好编辑htpasswd文件多添加几个用户(建议而已)

编辑组文件

fas: libai lvbu

保存并重读配置文件,用客户端登陆验证下:

image_thumb[1] bill登陆多次都登陆不上不去,而试试我们的组用户信息。用libai测试,则显示

image_thumb[2]

---------------------------------------------------------------------------------------------------------------------------------------------------------------

下面是最重要的部分之一!

虚拟主机

在httpd默认下,它把整个主机或者一个物理主机当做一个站点来使用,在httpd中叫做主服务器。

而虚拟主机是在一个台服务器上提供多个站点,而一个主机是使用一个IP地址加端口的,使用多个虚拟主机,是不是需要更多的IP地址加端口呢?

要想实现虚拟主机效果,各虚拟主机要使用不同的访问路径,如何实现不同?

1、用多个端口,但是还是有缺陷,因为客户很多不会知道你用哪个端口的。虽然能基于端口实现,但必须告知客户。

2、那么基于ip地址,但是ip地址的经费也很贵。

故我们使用第三种。

因为tcp/ip通信本质上只能认识ip+端口的方式用套接字文件进行传输,它根本不会直接使用你在浏览器输入的域名直接去互联网上该资源,它先会在它本机内的hosts文件里看看有没有对应的记录,如果没有,就去找DNS服务器进行域名解析拿着域名解析的ip地址去找ip对应的主机进行通信的。

但是我们的http的确可以做到用i一台开启了虚拟主机服务的基于访问多个域名来通信的,在http的首部有个host选项,构建请求报文,会在host中加上你在浏览器中输入的域名,但虽说如此,在ip报文到达主机的时候还是要靠ip地址来到达那个物理主机的,在应用层拆除http请求首部,会根据这些域名来访问这个物理主机上的各个虚拟主机。这样多台虚拟主机共享一个物理主机的资源。

所以是基于主机名的虚拟主机

由于虚拟主机特别重要,所以我们对上述三个环境都必须进行测试

这里有个最重要的前提,使用虚拟主机的前提,需要取消主服务器的web服务。需要注释主配置文件中的DocumentRoot。

2定义虚拟主机。使用virtualhost,格式如下:

<Virtualhost IP:PORT>

ServerName:主机名

DocumentRoot:虚拟主机的根目录

SeverAlias给服务器定义个别名

ErrorLog

</virtualhost>

测试方法,如果虚拟主机要基于端口测试,就要每个虚拟主机的ip绑在不同的端口上,如果虚拟主机要基于IP测试,就要每个虚拟主机ip地址不相同,如果虚拟主机要基于主机名,就要每个虚拟主机的主机名ServerName不相同。

如果想基于名称不相同在http2.2 我们需要定义一个NameVirtualhost IP:PORT

第一步:

先查找/etc/httpd/conf/httpd.conf下找到Listen 监听,在全局配置中加入你想为虚拟主机增加的端口号是什么,如下图:

#Listen 12.34.56.78:80
136 Listen 80
137 Listen 38080

第二步

注释掉DocumentRoot

#DocumentRoot "/var/www/html"

第三步

开始建立我们的虚拟主机

在配置文件里编辑

<VirtualHost 192.168.1.184:80>
ServerName www.aaabig.com
DocumentRoot /web/host1
</VirtualHost>
<VirtualHost 192.168.1.184:38080>
ServerName www.aaabig.com
DocumentRoot /web/host2
</VirtualHost>

[root@www ~]# service httpd configtest 或者命令http -t
Warning: DocumentRoot [/web/host1] does not exist
Warning: DocumentRoot [/web/host2] does not exist
Syntax OK

显示我们没有创建虚拟主机的目录,我们还有创建一下:

[root@www /]# mkdir -pv /web/host1
mkdir: created directory `/web'
mkdir: created directory `/web/host1'
[root@www /]# mkdir -pv /web/host2
mkdir: created directory `/web/host2'

第四步:我们为两个不同的虚拟主机提供各自的主页面。

[root@www /]# vim /web/host1/index.html
[root@www /]# vim /web/host2/index.html
[root@www /]# cat /web/host1/index.html
this is host1
[root@www /]# cat /web/host2/index.html
this is host2

第五步:我们做一下测试

这是80的端口

image_thumb[5]

这是38080的端口

image_thumb[3]

--------------------------------------------------------------以上是不同的虚拟主机基于不同端口的--------------------------------------------------------------

下面是基于不同IP地址的虚拟主机:

第一步:先创建一个新的ip地址,因为演示,所以临时创建一个:

[root@www ~]# ifconfig eth0:0 192.168.1.134/24
[root@www ~]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:7B:06:EC
inet addr:192.168.1.184 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe7b:6ec/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31928 errors:0 dropped:0 overruns:0 frame:0
TX packets:11008 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:3475011 (3.3 MiB) TX bytes:1652801 (1.5 MiB)

eth0:0 Link encap:Ethernet HWaddr 00:0C:29:7B:06:EC
inet addr:192.168.1.134 Bcast:192.168.1.255 Mask:255.

第二步:编辑httpd.conf,修改虚拟主机那里。

<VirtualHost 192.168.1.184:80>
ServerName www.aaabig.com
DocumentRoot /web/host1
</VirtualHost>
<VirtualHost 192.168.1.134:80>

修改并保存,用httpd -t检查语法错误

[root@www ~]# httpd -t
Syntax OK

第三步 重新加载配置文件 service httpd reload

image_thumb[6] 测试成功!

---------------------------------------------------------------------------------------------

我们也可以把它们都混着使用,譬如:

我们再次添加一个新的虚拟主机,host3

VirtualHost 192.168.1.134:38080>
ServerName www.aaabig.com
DocumentRoot /web/host3
</VirtualHost>

再次编辑它根目录再里面创建一个index.html的首页。

[root@www ~]# cat /web/host3/index.html
this is host3

重读配置文件,再检查我们的效果:

image_thumb[7] 测试成功!

因为我们定义了三个虚拟主机,主机名都一样,所以如果使用www.aaabig.com我们会访问第一个,因为配置的执行测序是自上而下的。

-------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------

下面我们测试不同的虚拟主机用不同的ServerName

第一步:准备环境,修改配置文件,把它们设置成相同的IP地址和端口,但是主机名称不相同。

<VirtualHost 192.168.1.184:80>
ServerName www.aaabig.com
DocumentRoot /web/host1
</VirtualHost>
<VirtualHost 192.168.1.184:80>
ServerName www.bigfire.com
DocumentRoot /web/host2
</VirtualHost>
<VirtualHost 192.168.1.184:80>
ServerName


DocumentRoot /web/host3

下面的步骤尤为重要,因为用到主机名,所以要麻烦到DNS服务器来工作,因为在我的测试环境下我的DNS服务器可以连接到外网,对你该的网址进行解析,所以我们可以修改我们客户端(即一直在用的win7的DNS指向我的服务器CentOS6.5的DNS服务器的IP地址,还要修改CentOS6.5的DNS服务器的区域解析库文件,添加主机名等等等,所以我们暂时使用hosts文件来看看是否能够虚拟主机加载成功!)

所以这里我们修改win7的hosts文件,在

image_thumb[8] 下用编辑器打开,修改为

image_thumb[9]

下面为演示页面:

image_thumb[10]

image_thumb[11]

image 以上3个都能正常显示,这里我做实验的时候出现了一次bug,小错误,后来发现是配置文件里面的NameVirtualhost前面的注释没有去掉。这里亏了好朋友志财的“点拨”啦~就是如下情况:

image

当然还有Secret内容!!!!!博客并没有终结还有关键的第三篇!!!