httpd配置文件详解及实例

                      httpd配置文件详解及实例

                                        作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.http协议的组成
  http协议是C/S架构:我们可以把浏览器(如:IE,Firefox,Safari,Chrome,Opera)看做客户端,当然我们也可以用命令行(elinks,curl)当做一个客户端。而服务器端就特别多,比如擅长处理静态页面的服务器httpd,lighttpd,nginx,gws等等,还有一些应用程序服务器IIS,Tomcat,jetty,resin等等。客户端和服务器之间的交互都是使用http协议的request(请求报文)和response(响应报文来实现的)。其实http协议非常简单,就是由着两种格式的报文组成,即客户端请求报文(request)和服务端响应报文(response)。
  httpd俗称Apache。其实早期它是美国的一个官方组织所研发的一款web服务器。早期也就叫做httpd,后来httpd这个项目完成了,功能基本上也就完善了,大家知道一个项目完成之后就会解散项目成员,后来这帮开发httpd的程序员就散入了各个大公司,但是他们都很喜欢这个httpd,也不愿意看见它没落下去,于是他们就通过互联网自发组织起来来维护这个web服务器,一旦发现它有漏斗就打补丁,如果需要新功能就开发新特性,这就是早起的社区模型。随着时间的推移,这些牛逼的开发者对httpd进行各种打补丁,使得其功能越来越强大。后来这些开发人员就说这个是一个打满补丁的服务器(a pachey server),后来大家都知道了,美国的武装攻击直升机叫Apache,后来他们就叫做httpd正是称之为apache服务器。
 
二.httpd的工作模式
  httpd是一个高度模块化组成的。即它的功能都是模块化的。
1>.DSO(Dynamic Shared Object)
  也就意味着你在安装httpd的时候,可以自定义选择你想要安装用到它的功能,它有些功能不不需要的可以选择不安装
2>.MPM(Multipath Processing Module),
  多道处理模块,非一个模块,而是对一种特性的称谓。
  prefork(多进程模型):一个进程响应一个请求,需要用到select(),其最大可以设置的空闲线程上线为1024,它提前创建出来这些空闲的线程就是为了响应客户请求,因此等到客户来时再去创建线程(tast_struch的创建是需要时间的)会花费时间;
  worker(多线程模型):一个进程多个线程,一个线程一个请求。一个主进程可以生成多个子进程,每个子进程又可以生成多个线程(注意:每个在某一个时刻线程可以响应一个请求,只有这个线程将请求响应结束后该线程才可以继续响应其他的请求哟~)提供服务。当一个子进程生成的线程都不工作了之后,主进程就会想法杀掉该子进程以达到释放空间的目的;
  event(事件模型):一个线程相应多个请求,(envent-driven,事件驱动,主要目的是为了实现单线程相应多个请求。)基于事件驱动维持多个用户请求;
 
3>.http的功能特性:
  a>.路径别名:alias
  b>.用户认证:authentication
  c>.虚拟主机:virtual host
  d>.反向代理:(如负载均衡)
  e>.用户站点:当前用户都可以自行打开创建一个自己的站点。
  f>.CGI:Common Gateway Interface等等。
 
4>.安装httpd
[root@yinzhengjie ~]# yum -y install httpd
 
三.了解httpd常用的工作目录功能
 1 [root@yinzhengjie ~]# cat /etc/redhat-release 
 2 CentOS release 6.6 (Final)
 3 [root@yinzhengjie ~]# 
 4 [root@yinzhengjie ~]# rpm -q httpd
 5 httpd-2.2.15-39.el6.centos.x86_64
 6 [root@yinzhengjie ~]# 
 7 [root@yinzhengjie ~]# rpm -ql httpd | head
 8 /etc/httpd                ------>运行目录;
 9 /etc/httpd/conf            ------>主配置目录;
10 /etc/httpd/conf.d/*.conf    ------->扩展配置目录;
11 /etc/logrotate.d/httpd    ------>日志滚动目录;
12 /usr/sbin/httpd            ------>可执行命令目录;
13 /var/www/html/            ------>文档根目录,所有需要请求的文件都放在该目录下;
14 /var/www/cgi-bin/        ------>CGI目录;
15 /etc/httpd/logs            ----->日志目录,其实他是一个链接;
16 /etc/httpd/modules        ------>存放各种不同模块的目录,其实它也是一个链接;
17 /etc/httpd/run            ------>保存运行的pid;
18 /etc/sysconfig/httpd        ------->脚本的配置文件;
19 /etc/init.d/httpd            ------->服务启动脚本;
20 ..........
21 [root@yinzhengjie ~]# 
22 [root@yinzhengjie ~]# cd /etc/httpd/
23 [root@yinzhengjie httpd]# ll
24 total 8
25 drwxr-xr-x. 2 root root 4096 Sep 18 07:34 conf
26 drwxr-xr-x. 2 root root 4096 Sep 18 07:34 conf.d
27 lrwxrwxrwx. 1 root root   19 Sep 18 07:34 logs -> ../../var/log/httpd
28 lrwxrwxrwx. 1 root root   29 Sep 18 07:34 modules -> ../../usr/lib64/httpd/modules
29 lrwxrwxrwx. 1 root root   19 Sep 18 07:34 run -> ../../var/run/httpd
30 [root@yinzhengjie httpd]# 
四.httpd配置文件详解
  /etc/httpd/conf/httpd.conf 是Apache的主配置文件,
1>.配置文件格式:
  全局配置
  主机配置:用于仅提供一个站点时
  虚拟机主机:用于提供多个站点时,主机配置和虚拟机主机配置不能同时启用。
 
2>.配置文件语法测试:

[root@yinzhengjie ~]# service httpd configtest

[root@yinzhengjie ~]# httpd -t
  绝大多数配置修改后,可以通过server httpd reload来生效,如果修改了监听的地址和端口,比如重启服务才能生效。
 
3>.监听套接字
  Listen [IP:]port ----->此指令可以出现多次,例如:Listen 80,表示监听本机所有网卡的80端口,Listen 127.0.0.1:8080,表示只监听本机的8080端口。
 
4>.配置使用keep alive
[root@yinzhengjie ~]# more /etc/httpd/conf/httpd.conf | grep -v ^# | grep KeepAlive
KeepAlive Off ------>默认是关闭状态,它是保持连接的开关,它一旦开启,下面的两个参数任意一个都会生效。
MaxKeepAliveRequests 100 ------->定义最大请求次数。即单个连接请求到达100时会自动断开连接。
KeepAliveTimeout 15 -------->定义连接的超时时间为15秒。
[root@yinzhengjie ~]#
 
5>.查看http当前可以支持编译至内核的模块列表
1 [root@yinzhengjie ~]# httpd -l 
2 Compiled in modules:
3   core.c        --------->核心模块
4   prefork.c    --------->支持的MPM,早httpd2.2版本编译时,有且只能有指定一种MPM。
5   http_core.c    --------->http的核心模块
6   mod_so.c    --------->支持DSO的机制
7 [root@yinzhengjie ~]# 
 
6>.查看httpd.worker支持的模块列表
1 [root@yinzhengjie ~]# httpd.worker -l
2 Compiled in modules:
3   core.c
4   worker.c        --------->你会发现他们只是MPM的类型不同。如果想要启动worker模式可以用该命令。
5   http_core.c
6   mod_so.c
7 [root@yinzhengjie ~]# 
7>.修改多道处理模块类型
 1 [root@yinzhengjie ~]# more /etc/sysconfig/httpd  | grep HTTPD=  
 2 #HTTPD=/usr/sbin/httpd.worker   ------->服务默认是讲worker模式是关闭的。而是用的httpd
 3 [root@yinzhengjie ~]# 
 4 [root@yinzhengjie ~]# ps aux | grep httpd | grep -v grep
 5 root       2404  0.0  0.3 183936  3828 ?        Ss   18:44   0:00 /usr/sbin/httpd
 6 apache     2407  0.0  0.3 184072  3168 ?        S    18:44   0:00 /usr/sbin/httpd
 7 apache     2408  0.0  0.3 184072  3080 ?        S    18:44   0:00 /usr/sbin/httpd
 8 apache     2409  0.0  0.3 184072  3080 ?        S    18:44   0:00 /usr/sbin/httpd
 9 apache     2410  0.0  0.3 184072  3096 ?        S    18:44   0:00 /usr/sbin/httpd
10 apache     2411  0.0  0.3 184072  3084 ?        S    18:44   0:00 /usr/sbin/httpd
11 apache     2412  0.0  0.3 184072  3156 ?        S    18:44   0:00 /usr/sbin/httpd
12 apache     2413  0.0  0.3 184072  3156 ?        S    18:44   0:00 /usr/sbin/httpd
13 apache     2414  0.0  0.2 183936  2468 ?        S    18:44   0:00 /usr/sbin/httpd
14 [root@yinzhengjie ~]# 
15 [root@yinzhengjie ~]# more /etc/sysconfig/httpd  | grep HTTPD=
16 HTTPD=/usr/sbin/httpd.worker              --------------->当然,我们可以手动吧worker功能给打开。
17 [root@yinzhengjie ~]# service httpd restart
18 Stopping httpd: [  OK  ]
19 Starting httpd: httpd.worker: Could not reliably determine the server's fully qualified domain name, using 192.168.1.200 for ServerName                          ------------->这行不用管,原因是你的主机名和IP对应的不一致,该服务会自动进行反解的,只要服务可以正常启动即可。
20 [  OK  ]
21 [root@yinzhengjie ~]# 
22 [root@yinzhengjie ~]# ps aux | grep httpd | grep -v grep
23 root       2848  0.0  0.4 184140  4036 ?        Ss   19:44   0:00 /usr/sbin/httpd.worker
24 apache     2852  0.6  0.5 593936  5368 ?        Sl   19:44   0:00 /usr/sbin/httpd.worker
25 apache     2853  0.0  0.5 528400  5368 ?        Sl   19:44   0:00 /usr/sbin/httpd.worker
26 apache     2854  0.4  0.5 528400  5372 ?        Sl   19:44   0:00 /usr/sbin/httpd.worker
27 [root@yinzhengjie ~]# 
8>./etc/httpd/conf/httpd.conf配置文件的MPM的配置详解
<IfModule prefork.c> ------>IfModule 方法是判断模块是否存在的,很显然这个标签是为了判断prefork.c这个模块是否存在;
StartServers 8 ------->默认去启东的工作进程数;
MinSpareServers 5 ------->最少空闲进程数;
MaxSpareServers 20 ------->最大空闲进程数;
ServerLimit 256 ------->最大活动进程数;
MaxClients 256 ------->最大并发请求连接数;
MaxRequestsPerChild 4000 ------->每个子进程在生命周期内所能够服务的最多请求个数;
</IfModule>
 
 
<IfModule worker.c>
StartServers 4 -------->启动的子进程的个数;
MaxClients 300 -------->并发请求的最大数;
MinSpareThreads 25 -------->最小空闲线程数;
MaxSpareThreads 75 -------->最大空闲线程数;
ThreadsPerChild 25 -------->每个子进程可生成的线程数;
MaxRequestsPerChild 0 ------->每个子进程在生命周期内所能够服务的最多请求个数,注意,“0”表示的是不限定请求个数;
</IfModule>
 
9>.DSO模块加载方式
  加载模块的格式为:"LoadModule module_name /path/to/module",如果使用相对路径,则对于ServerRoot所定义的位置而言,例如:“LoadModule ldap_module /usr/lib64/httpd/modules/mod_ldap.so ”,如果不需要加载模块,只需要你在该行前添加“#”号进行注释,并且让服务重装配置文件方能生效。
[root@yinzhengjie ~]# httpd -M:列出已经装载的所有DSO及非DSO模块;
[root@yinzhengjie ~]# httpd -l:列出支持使用的非DSO模块;
 
10>.配置站点根目录
[root@yinzhengjie ~]# more /etc/httpd/conf/httpd.conf | grep DocumentRoot | grep -v ^#
DocumentRoot "/var/www/html" ---------->这是默认的站点根目录,当然,你可以自行修改,修改的目录必须得存在哟~
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# more /etc/httpd/conf/httpd.conf | grep DocumentRoot | grep -v ^#
DocumentRoot "/yinzhengjie/www/htdocs/" ------>这就是我们修改后的站点根目录
[root@yinzhengjie ~]#
 
11>.配置页面访问属性(也就是专门为根目录设置的容器的属性)
  如果你想定义你的网页文件能被谁访问或者是不能被谁访问就得设置给你的站点根目录定义页面访问属性。
<Directory "/yinzhengjie/www/htdocs/">
  Options:
    Indexes:
      缺少指定的默认页面时,运行将目录中的所有的文件以列表的形式返回给用户,(这个功能不建议开启,除非你是想让人下载你的文件。);
    FollowSymLinks:
      运行跟随符号链接所指向的原始文件,就是说用户可以通过浏览器访问到你连接的文件的真实内容哟;
    None:
      所有属性都不启用;
    All:
      所有属性都启用;
    ExecCGI:
      允许跟随符号链接所指向的原始文件;
    Includes:
      允许使用mod_include模块实现服务器端包含(SSI);
    MultiViews:
      允许使用mod_negotiation实现内容协商;
    SymLinksIfOwnerMatch:
      在连接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件;.
  AllowOverride
<Directory>
 
12>.基于主机的访问控制
  以下说明是针对Apache2.2版本的,官网文档地址:http://httpd.apache.org/docs/2.2/mod/core.html#options
<Directory "/yinzhengjie/www/htdocs/">
  Options:
    请参考上面的基于页面的访问控制;
    AllowOverride :
      None:
        该参数表示Order选项其后跟的参数Allow和Deny的配置不被禁用,我们默认下面的配置是基于该参数为None的模式来说的,因为如果你换成其他的模式会导致下面的配置无效的哟~;
      ALL:
        和上面的参数想法,一次都禁用。
      FileInfo:
      AuthConfig:
         表示基于用户的认证,而不再完全基于IP的认证了;
      Limit:
 
  Order :
    该行和Allow以及Deny这三行是用来控制基于IP访问的,Order主要是定义允许或是解决的次序(例如:Order Deny,Allow 表示默认规则是Allow,不过优先匹配Deny,如果不在Deny的匹配列表中就表示默认运行访问哟),默认设置为:Order Allow,deny 表示拒绝所有的主机访问,没有在Allow的匹配列表中的都被拒绝,但是如果Allow如果写成Allow from all表示允许所有主机访问,配合Order的优先匹配规则则表示不拒绝任何的主机,因为所有的规则都会走Allow的优先匹配,换句话说,Order支持最小匹配范围,它可以智能的支持最佳匹配;
 
  Allow:
    允许访问的主机IP范围,例如Allow from 172.16.0.0/16则表示只允许“172.16.0.0/16”这个网段的人访问,其他地址则不允许访问!,默认设置为Allow from all,表示允许给所有人访问;
 
  Deny:
    拒绝访问的主机IP范围,加入Order指定的次序是:"Order allow,deny"表示默认拒绝优先匹配allow例如,如果allow指定的IP范围是:“Allow from 172.16.0.0/16”则表示允许“172.16.0.0/16”这个网段访问,这个时候我们如果将Deny写成"Deny from 172.16.3.210 Deny from 172.16.3.230"则表示拒绝 172.16.3.210这个主机和 172.16.3.230这个主机的配置,虽然Allow是允许一个网段访问,但是有2个IP是被拒绝访问的,因此它会拒绝这个网段的2个IP的访问,这种机制叫做最佳匹配(从里表中找出最小的能匹配到访问者的地址的条目为最终生效的,注意,这个和iptables是有所不同多~)。;
 
<Directory>
 
扩展小知识:
  关于Allow和Deny之间的匹配关系如下:(网址:http://httpd.apache.org/docs/2.2/mod/mod_authz_host.html#order
Match Allow,Deny result Deny,Allow result
Match Allow only Request allowed Request allowed
Match Deny only Request denied Request denied
No match Default to second directive: Denied Default to second directive: Allowed
Match both Allow & Deny Final match controls: Denied Final match controls: Allowed
  根据上表我们队Allow和Deny的匹配规则可以总结一句话:二者都匹配或二者都五匹配时,则以Order定义的后者为准,否则,则以匹配到的为准;
 
13>.定义默认主页面
DirectoryIndex :
  改参数用于定义首页的文件名称,它的意思当用户访问一个目录时,如果他没有敲击URL的绝对路径,比如用户访问“www.baidu.com”用户并没有输出完整的URL,这个时候就该DirectoryIndex 表演了,它会默认返回客户一个页面,比如:"DirectoryIndex index.html yinzhengjie.html home.html",表示他会优先去找“index.html”这个配置文件,如果当前目录没有这个文件的话就会去找“yinzhengjie.html ”这个配置文件,如果这2个文件都没有的话,就会去找“home.html”这个配置文件,如果在DirectoryIndex 列表中均为找到的话,默认会把当前目录下的所有文件列出来供用户选择(当然如果设置可以被修改的哟!)。
 
14>.用户目录
  如果期望让每个用户都可以创建个人站点,访问格式为:"http://Serverr_IP/~Username/"注意访问格式是在用户名前面加一个“~”符号哟!
  UserDir:
    disabled:
      改参数跟在userdlied后面表示禁止使用用户目录,
    yinzhengjie_html:
      yinzhengjie_html是用户家目录的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问,但是要注意的是:用户的家目录得富有运行httpd进程的用户拥有执行权限。
 
15>.配置日志功能
  httpd的日志默认存放在:/var/log/httpd/目录下,该目录下默认有2个文件:
  access.log:
    访问日志,其需要记录的内容(比如客户端地址等等)需要自定义;
  LogFormat:
    自定义log的格式,如:“LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" yinzhengjie”这个用关键字LogFormat定义了一个格式为“"%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" ”并且给它起了一个变量名称叫做:yinzhengjie。
    注意:
      %h:表示主机名;
      %l:表示远程登录名,通常为“-”;
      %u:表示认证时的远程用户名,没有指定是为“-”;
      %t:表示收到请求的具体时间;
      "%r":表示请求报文的起始行;注意“”符号表示转移符,为了就是转移双引号;
      %>s:表示响应状态码;
      %b:表示响应报文的长度,单位为字节;
      %{Header_name}:记录请求报文首部的内容(Value)
 
 
  CustomLog:
    该目录是访问日志的指令,格式为:【CustomLog "/path/to/access_log_file" LogFormat_name 】,比如:【CustomLog logs/access_log yinzhengjie】,这里就三个参数,第一个参数是用CustomLog生命了一个变量, 第二个参数“logs/access_log”表示日志的路径名称,第三个参数值指定日志的格式,表示用一个叫“yinzhengjie”的变量定义的格式来记录日志内容;
  error.log:
    错误日志,它的信息就没有那么麻烦了,直接指定路径即可,因为它就是记录错误日志的,没有必要弄的那么繁琐,如:ErrorLog logs/error_log
 
16>.路径别名
  这个很好理解,其功能就类似于咱们玩Linux上的软连接,只需要定义别名,就可以直接访问到定义别名里的具体内容,格式为:Alias /yinzhengjie/ "/yinzhengjie/www/htdocs/",这就意味着用户访问:"http://Server_IP/yinzhengjie/"时,其页面文件来自于“/yinzhengjie/www/htdocs/”这个目录资源。
 
17>.设置默认字符集
  AddDefaultCharset UTF-8表示设置成默认的字符集为:UTF-8,当然,如果你真正页面的字符集不是UTF-8的,而是GBK的,那么在浏览器打开的内容可能是乱码,因为你这里设置了其默认的字符集是UTF-8。
 
18>.CGI(全称Common Gateway Interface,通用网关接口)脚本路径别名
  我们前面说的路径别名指的是在根目录下创建一个连接文件,从而访问到这个连接文件的源文件内容,而我们这里说的脚本路径别名功能和其差不多,只不过路径别名里面存放的是各种资源,而脚本路径别名里面存放着的是CGI脚本;
a>.什么是CGI呢
  web服务器能够跟某一个应用程序执行环境通信,并且能够通过这个环境获取执行结果的协议叫做CGI。我们知道httpd本事是无法解析脚本的,它更不可能将脚本执行的结果返回给你。当用户请求一种特定资源,我们不把这个资源返回给客户端,而是让这个资源在服务器上先执行一下,将结果返回给客户端。这个时候就该CGI协议上场了,httpd就可以基于CGI协议去调用运行程序的环境,把用户请求的文件通过CGI协议调用的程序运行一下,再将该文件的执行结果返回给httpd服务器。
b>.遵循CGI协议
  所有能够支持CGI协议的客户端程序本身都能够用于开发动态网站,所以bash是其中的一种哟!如果你用bash写的这个脚本本身遵循CGI协议它就能够实现将结果返还给客户端。一般而言,CGI协议要求支持CGI的应用程序第一行需要返回“Content-Type text/html”
c>.CGI的缺陷
  CGI协议过于粗糙和简陋,并且基于CGI协议通信时,它要求运行程序为了获取某种资源必须以管理员的身份运行,这种操作是非常危险的,因为如果它执行的脚本是“rm -rf /”之类的话,别人再一次请求你的web服务器你就会发现你的web服务挂啦!CGI这种协议目前来讲都很少有人用了,因为他的很多程序的实现要求机遇SUID或SGID的机制,这是相当危险的,所以现在有很多其他的动态网站跟前端通信时都不在基于CGI啦。比如像比较安全的PHP,它用的就是SAPI机制,像python用的是UWSGI机制等等。
d>.Apache指定CGI脚本路径格式
  生产环境中毕竟还有一些比较老的项目仍然还是基于CGI协议来进行的,尤其是像一些邮箱站点,web mail等基于CGI模式做起来可能比较容易。而开发CGI模式的语言早期年用的一般是perl语言,它不仅仅是一门脚本语言,它有丰富的库。接下来,我们看看Apache是如何调用CGI协议吧。
  对于Apache而言,并非你写的任何路径的CGI脚本都能够被执行,通常是通过ScriptAlias指令所定义的脚本路径别名下的脚本才会被执行,它是通过mod_alias(实现路径别名)和mod_cgi(实现支持CGI协议的)这2个模块完成工作的。它的格式为:ScriptAlias /URL/ "/path/to/somewhere" ,具体实例我们可以看下Apache配置文件:
 1 [root@yinzhengjie ~]# more /etc/httpd/conf/httpd.conf | grep -v ^# | grep -v ^$ | grep ScriptAlias
 2 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
 3 [root@yinzhengjie ~]# 
 4 [root@yinzhengjie ~]# more /var/www/cgi-bin/yinzhengjie 
 5 #!/bin/bash
 6 #@author :yinzhengjie
 7 #blog:http://www.cnblogs.com/yinzhengjie
 8 #EMAIL:y1053419035@qq.com
 9 
10 cat <<EOF
11 Content-Type:text/html
12 
13 <pre>
14 <h1>The hostname is `hostname`.</h1>
15 The time is `date +%F`
16 <h1>My name is yinzhengjie!</h1>
17 </pre>
18 
19 EOF
20 [root@yinzhengjie ~]# 
21 [root@yinzhengjie ~]# chmod +x /var/www/cgi-bin/yinzhengjie 
22 [root@yinzhengjie ~]# 
23 [root@yinzhengjie ~]# ll /var/www/cgi-bin/yinzhengjie 
24 -rwxr-xr-x. 1 root root 247 Oct 21 02:51 /var/www/cgi-bin/yinzhengjie
25 [root@yinzhengjie ~]# 
26 [root@yinzhengjie ~]# /etc/init.d/iptables stop
27 iptables: Setting chains to policy ACCEPT: filter [  OK  ]
28 iptables: Flushing firewall rules: [  OK  ]
29 iptables: Unloading modules: [  OK  ]
30 [root@yinzhengjie ~]# 
31 [root@yinzhengjie ~]# service httpd reload
32 Reloading httpd: 
33 [root@yinzhengjie ~]# 
34 [root@yinzhengjie ~]# ip a | grep brd |grep inet | awk '{print $2}' | awk -F "/" '{print $1}'
35 192.168.1.115
36 [root@yinzhengjie ~]# 

 

19.基于用户访问控制
a>.HTTP的认证机制
HTTP认证分为四个步骤:
  第一步(请求):客户端用GET方法发送第一条请求,改请求是没有认真信息的;
  第二步(质询):服务器接收到了客户端的request报文,服务器用401状态拒绝了客户端的请求,说明需要用户提供用户名和密码。服务器上可能会分为不同的区域,每个区域都有自己的密码,所以服务器会在www-Authenticate首部对保护区进行描述。同样,认证算法也是在www-Authenticate首部中指定的;
  第三步(授权):客户端重新发送请求,但这一次会附加一个GET Authorization首部,用来说明认证算法,用户名和密码;
  第四步(成功):如果授权书是正确的,服务器会用200状态告诉客户端验证成功,并将文档返回。有些授权算法在可选的Authentication-Info首部返回一些与授权会话相关的附加信息;
b>.服务虚拟用户
  顾名思义,服务的虚拟用户并不是指操作系统的用户名和密码。而仅仅是为了获取某一个服务的特定资源访问时所使用的认证标致而已,所以它的账号和密码只是在某种意义上所对应起来的字符串。那么这个虚拟用户的账号和密码应该放在那里呢?解决方案有很多种,比如你可以放在web服务器本地,也可以放在SQL数据库里,也可以放在dbm二进制数据库里(已被Oracle公司收购),还可以放在ldap等等。
c>.认证类型(auth)
  认证类型分为两种,即基本认证(basic)和摘要认证(digest)。
  基本认证:账号和密码是明文发送的;
  摘要认证:将所有内容hash编码之后发送,遗憾的是,很多浏览器都不支持摘要认证。
d>.认证提供者(authentication provider)
  可以理解是账号密码的存放位置
e>.授权机制(authorization)
  表示根据什么类型进行授权;
f>.基于文件做基本认证,根据用户和组进行授权
  编辑Apache的主配置文件:“/etc/httpd/conf/httpd.conf”
 1 <Directory "/yinzhengjie/www/htdocs/caiwu">
 2         Options None                                         ------>表示所有属性都不启用
 3         AllowOverride AuthConfig                             ------->表示基于用户的认证,而不再完全基于IP的认证了    
 4         AuthType  Basic                                     ------>指定认真类型为基本认证
 5         AuthName "Please enter your username and password"    ------>该参数给用户一个提示的标题
 6         AuthBasicProvider file                                 -------->指定认真模式为基于文件的,认证方式,其实该行可以不写,默认就是基于文件认真的,而且下面一行以及充分说明认证时基于文件的
 7         AuthUserfile /etc/httpd/conf/.ApachePassword             -------->指定存放用户的配置文件
 8        #AuthGroupFile /etc/httpd/conf/.ApacheGroup                ------->指定存放组名的配置文件
 9  Require user yinzhengjie                                    -------->表示只允许yingzhengjie这个用户访问,如果你想要“ /etc/httpd/conf/.ApachePassword”这个配置文件的所有用户都有可以访问,就可以改成“Require valid-user”。
10 #Require valid-user                                    ----------->允许用户配置文件的所有用户都可以访问
11  #Require group GroupName                                ------>允许访问的组名
12 </Directory>
13 g>.创建用户和密码
14 [root@yinzhengjie ~]# htpasswd -c -m /etc/httpd/conf/.ApachePassword  yinzhengjie     #第一次要加“-c”选项,如果第二次创建用户就不需要啦!
15 New password: 
16 Re-type new password: 
17 Adding password for user yinzhengjie
18 [root@yinzhengjie ~]# 
19 [root@yinzhengjie ~]# htpasswd  -m /etc/httpd/conf/.ApachePassword  yzj     #这是第二次创建用户,如果加“-m”参数之后,就会将之前的配置给清空掉。
20 New password: 
21 Re-type new password: 
22 Adding password for user yzj
23 [root@yinzhengjie ~]# 
24 [root@yinzhengjie ~]# more /etc/httpd/conf/.ApachePassword     #查看我们创建的用户名和密码
25 yinzhengjie:$apr1$t/P8rFq4$PAbZS1icMTxnCvIG8lAS3/
26 yzj:$apr1$WKxSWG2B$HuYha4pS6z7.SHyv9zNxv0
27 [root@yinzhengjie ~]# 
28 [root@yinzhengjie ~]# ll /yinzhengjie/www/htdocs/caiwu/index.html 
29 -rw-r--r--. 1 root root 6792 Oct 21 04:50 /yinzhengjie/www/htdocs/caiwu/index.html
30 [root@yinzhengjie ~]# 
31 htpasswd命令:(更多关于htpasswd命令的使用可以参考man帮助。)
32 -c:创建文件,创建第一个用户时使用;
33 -m:“密码基于MD5编码存储;

 

扩展小知识:
  好了,到这里我们以及学习了基于IP的认证方式和基于用户的认证方式,显然后者的相比前面的认证机制要安全的多,因为IP是可以伪装的,但是基于用户认真不管你的IP是多少都得需要验证用户名和密码。我们称IP认证和用户认证为http协议认证。
  基于用户认证当你访问某一个特定资源的时候回出现一个弹窗效果让你输入用户名和密码,当你输入正确的用户信息就可以访问这些特定的资源。但是你可能会为,为什么别人家的认证都不需要弹窗效果,直接在网页输入用户信息就可以啦?比如,登录网页版的QQ,邮箱之类的。嘿嘿,问得好,我们直接在网页上输入验证消息的方式我们称之为表单认证。表单认证直观程度要比协议认证更好用(更易于控制),所以,大多数认证方式都基于表单认证机制。除非不具备表单认证能力,而又不得不使用认证方式的才会使用协议认证。比如我们用Nagios监控整个网络,它的控制台是直接可以打开的,这个时候我们就可以基于协议认证。
 
 
20.虚拟主机
  所谓虚拟主机就是一个物理服务器提供多个站点。如果你的web服务器访问量不大且你需要提供多个站点,比如,你想访问:www.yinzhengjie.com,又想访问www.yinzhengjie.org.cn,还想访问www.yinzhengjie.gov.cn等等。你是需要找三台服务器去搭建web吗?答案是否定的,因为这3个web访问量都不大占用服务器资源不会很多,因此,我们可以把这三个网站部署在同一个服务器上,想要是实现这种功能就得用到Apache的虚拟主机的功能啦!
 
a>.实现虚拟主机的三种方式
  我们知道web服务都是基于socket套接字来向外提供服务的,因此我们有三种方式提供web服务。要注意的是,使用虚拟机主机得先取消中心主机。
  第一种,基于不同的IP实现不同的虚拟主机(变化IP);
  第二种,基于不同的PORT实现不同的虚拟机主机(变化端口);
  第三种,基于不同的FQDN实现不同的虚拟主机(变化ServerName值);
 
b>.定义虚拟机格式
<VirtualHost IP:PORT> ------>定义虚拟主机;
  ServerAdmin webmaster@dummy-host.example.com
  DocumentRoot ------->指定网页存放目录;
  <Directory /> -------->当然也可以给这个目录定义相应的属性;
    Options FollowSymLinks
    AllowOverride None
  </Directory>
  ServerName ------->设置主机名;
  ServerAlias ------->设置服务器的别名,可以定义多个名字;
  ErrorLog -------->定义错误存放位置和日志的格式
  CustomLog -------->定义访问存放位置和日志的格式
  </VirtualHost>
 
c>.基于不同IP实现虚拟机主机案例
 1 [root@yinzhengjie ~]# ifconfig eth0:0 192.168.1.116/24        #在web服务器中添加多个IP以便测试
 2 [root@yinzhengjie ~]# ifconfig  | grep addr|grep Bcast | awk '{print $2}'|awk -F ":" '{print $2}'
 3 192.168.1.115
 4 192.168.1.116
 5 [root@yinzhengjie ~]# 
 6 [root@yinzhengjie ~]# more /etc/httpd/conf/httpd.conf | grep DocumentRoot | grep ^#DocumentRoot            
 7 #DocumentRoot "/yinzhengjie/www/htdocs/"                ----->需要先关闭中心主机才能配置虚拟主机
 8 [root@yinzhengjie ~]# 
 9 [root@yinzhengjie ~]# tail -11 /etc/httpd/conf/httpd.conf         ------>配置虚拟主机格式如下
10 #ADD by yinzhengjie
11 <VirtualHost 192.168.1.115:80>
12         ServerName www.yinzhengjie.com
13         DocumentRoot "/yinzhengjie/www/yinzhengjie.com/htdocs"
14 </VirtualHost>
15 
16 <VirtualHost 192.168.1.116:80>            ------->你会发现虚拟主机的IP不一致;
17         ServerName yinzhengjie.org.cn
18         DocumentRoot "/yinzhengjie/www/yinzhengjie.org.cn/htdocs"
19 </VirtualHost>
20 
21 [root@yinzhengjie ~]# 
22 [root@yinzhengjie ~]# mkdir -p /yinzhengjie/www/yinzhengjie.com/htdocs 
23 [root@yinzhengjie ~]# mkdir -p /yinzhengjie/www/yinzhengjie.org.cn/htdocs
24 [root@yinzhengjie ~]# more /yinzhengjie/www/yinzhengjie.org.cn/htdocs/index.html ---->设置主机的IP
25 <h1>www.yinzhengjie.org.cn</h1>
26 [root@yinzhengjie ~]# 
27 [root@yinzhengjie ~]# 
28 [root@yinzhengjie ~]# more /yinzhengjie/www/yinzhengjie.com/htdocs/index.html
29 <h1>www.yinzhengjie.com</h1>
30 [root@yinzhengjie ~]# 
31 [root@yinzhengjie ~]# httpd -t                ------>测试配置文件的语法格式是否正确
32 httpd: apr_sockaddr_info_get() failed for yinzhengjie
33 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
34 Syntax OK            ------>诺,这是没问题的,说是语法OK。
35 [root@yinzhengjie ~]# 
36 [root@yinzhengjie ~]# service httpd reload        ------->重新加载服务即可。
37 Reloading httpd: 
38 [root@yinzhengjie ~]# 

 

d>.基于不同IP和端口的虚拟主机案例展示:
 1 [root@yinzhengjie ~]# tail -17 /etc/httpd/conf/httpd.conf 
 2 #ADD by yinzhengjie
 3 <VirtualHost 192.168.1.115:80>
 4         ServerName www.yinzhengjie.com
 5         DocumentRoot "/yinzhengjie/www/yinzhengjie.com/htdocs"
 6 </VirtualHost>
 7 
 8 <VirtualHost 192.168.1.115:8888>        ----->我们发现其和上面的虚拟主机不同之处在于端口,一次一定要监听8080端口哟。
 9         ServerName www.yinzhengjie.gov.cn
10         DocumentRoot "/yinzhengjie/www/yinzhengjie.gov.cn/htdocs"
11 </VirtualHost>
12 
13 
14 <VirtualHost 192.168.1.116:80>
15         ServerName www.yinzhengjie.org.cn
16         DocumentRoot "/yinzhengjie/www/yinzhengjie.org.cn/htdocs"
17 </VirtualHost>
18 
19 [root@yinzhengjie ~]# 
20 [root@yinzhengjie ~]# more /yinzhengjie/www/yinzhengjie.gov.cn/htdocs/index.html 
21 <h1>www.yinzhengjie.gov.cn</h1>
22 [root@yinzhengjie ~]# 
23 [root@yinzhengjie ~]# grep Listen /etc/httpd/conf/httpd.conf  | grep -v ^#
24 Listen 80
25 Listen 8888                ------>注意,一定要启用该端口,不然即使上面的虚拟主机配置正确也无法访问哟
26 [root@yinzhengjie ~]# 
27 [root@yinzhengjie ~]# service httpd configtest        ------->验证语法格式是否正确
28 httpd: apr_sockaddr_info_get() failed for yinzhengjie
29 httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
30 Syntax OK                ------->很显然,语法都是OK的。
31 [root@yinzhengjie ~]# 
32 [root@yinzhengjie ~]# /etc/init.d/httpd restart            ------>重启服务即可
33 Stopping httpd: [  OK  ]
34 Starting httpd: [  OK  ]
35 [root@yinzhengjie ~]# 

 

e>.基于主机名(FQDN)的虚拟机主机案例展示
 1 [root@yinzhengjie ~]# grep NameVirtualHost /etc/httpd/conf/httpd.conf  | grep -v ^#
 2 NameVirtualHost *:80    ------>在httpd2.2版本,想要实现FQDN方法,该功能需要开启。httpd2.4则不需要开启该功能啦!
 3 [root@yinzhengjie ~]# 
 4 [root@yinzhengjie ~]# tail -17 /etc/httpd/conf/httpd.conf 
 5 #ADD by yinzhengjie
 6 <VirtualHost *:80>
 7         ServerName www.yinzhengjie.com
 8         DocumentRoot "/yinzhengjie/www/yinzhengjie.com/htdocs"
 9 </VirtualHost>
10 
11 <VirtualHost *:80>
12         ServerName www.yinzhengjie.gov.cn
13         DocumentRoot "/yinzhengjie/www/yinzhengjie.gov.cn/htdocs"
14 </VirtualHost>
15 
16 
17 <VirtualHost *:80>
18         ServerName www.yinzhengjie.org.cn
19         DocumentRoot "/yinzhengjie/www/yinzhengjie.org.cn/htdocs"
20 </VirtualHost>
21 
22 [root@yinzhengjie ~]# 
23 [root@yinzhengjie ~]# more /etc/hosts | grep yinzhengjie        ----->我打算在本地进行测试,因此需要修改配置文件
24 192.168.1.105   node1.yinzhengjie.com
25 192.168.1.110   node2.yinzhengjie.com
26 192.168.1.115   node3.yinzhengjie.com
27 192.168.1.200   node4.yinzhengjie.com
28 192.168.1.115 www.yinzhengjie.com
29 192.168.1.115 www.yinzhengjie.gov.cn
30 192.168.1.115 www.yinzhengjie.org.cn
31 [root@yinzhengjie ~]# 
32 [root@yinzhengjie ~]# yum -y install elinks        ----->安装命令行工具
33 [root@yinzhengjie ~]# elinks -dump www.yinzhengjie.com        -----以下是Linux测试结果
34                               www.yinzhengjie.com
35 [root@yinzhengjie ~]# 
36 [root@yinzhengjie ~]# 
37 [root@yinzhengjie ~]# elinks -dump www.yinzhengjie.gov.cn
38                               www.yinzhengjie.com
39 [root@yinzhengjie ~]# 
40 [root@yinzhengjie ~]# elinks -dump www.yinzhengjie.org.cn
41                               www.yinzhengjie.com
42 [root@yinzhengjie ~]# 
  当然如果你非要用windows进行测试的话也简单,和Linux访问方式一样,也需要修改hosts文件,我们可以到C:WindowsSystem32driversetc这个目录下去修改。
 

f>.虚拟主机的单独配置
  在虚拟主机中,可以实现用户认证,访问日志,错误日志,路径别名。脚本别名等等。它的配置方法和配置中心主机一致。接下来我们设置一个访问日志的功能,具体配置如下:
 
 1 [root@yinzhengjie ~]# tail -20 /etc/httpd/conf/httpd.conf 
 2 #ADD by yinzhengjie
 3 <VirtualHost *:80>
 4         ServerName www.yinzhengjie.com
 5         DocumentRoot "/yinzhengjie/www/yinzhengjie.com/htdocs"
 6         CustomLog "/var/log/httpd/www.yinzhengjie.com.log" combined
 7 </VirtualHost>
 8 
 9 <VirtualHost *:80>
10         ServerName www.yinzhengjie.gov.cn
11         DocumentRoot "/yinzhengjie/www/yinzhengjie.gov.cn/htdocs"
12         CustomLog "/var/log/httpd/www.yinzhengjie.gov.cn.log" combined
13 </VirtualHost>
14 
15 
16 <VirtualHost *:80>
17         ServerName www.yinzhengjie.org.cn
18         DocumentRoot "/yinzhengjie/www/yinzhengjie.org.cn/htdocs"
19         CustomLog "/var/log/httpd/www.yinzhengjie.org.cn.log" combined
20 </VirtualHost>
21 
22 [root@yinzhengjie ~]# 
23 [root@yinzhengjie ~]# httpd -t
24 Syntax OK
25 [root@yinzhengjie ~]# /etc/init.d/httpd restart
26 Stopping httpd: [  OK  ]
27 Starting httpd: [  OK  ]
28 [root@yinzhengjie ~]# 
29 [root@yinzhengjie ~]# cd /var/log/httpd/        ----->客户端访问之后,再去日志目录下查看。
30 [root@yinzhengjie httpd]# ll
31 total 52
32 -rw-r--r--. 1 root root 13007 Oct 21 06:33 access_log
33 -rw-r--r--. 1 root root 19566 Oct 21 06:44 error_log
34 -rw-r--r--. 1 root root   194 Oct 21 06:44 www.yinzhengjie.com.log
35 -rw-r--r--. 1 root root   194 Oct 21 06:44 www.yinzhengjie.gov.cn.log
36 -rw-r--r--. 1 root root   194 Oct 21 06:44 www.yinzhengjie.org.cn.log
37 [root@yinzhengjie httpd]# 
38 [root@yinzhengjie httpd]# cat www.yinzhengjie.com.log
39 192.168.1.161 - - [21/Oct/2017:06:44:35 -0700] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
40 [root@yinzhengjie httpd]# 
41 [root@yinzhengjie httpd]# cat www.yinzhengjie.gov.cn.log
42 192.168.1.161 - - [21/Oct/2017:06:44:32 -0700] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
43 [root@yinzhengjie httpd]# 
44 [root@yinzhengjie httpd]# cat www.yinzhengjie.org.cn.log
45 192.168.1.161 - - [21/Oct/2017:06:44:31 -0700] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"
46 [root@yinzhengjie httpd]# 
47 [root@yinzhengjie httpd]# 
原文地址:https://www.cnblogs.com/yinzhengjie/p/7764392.html