httpd配置文件详解及实例

                      httpd配置文件详解及实例
html

                                        做者:尹正杰前端

版权声明:原创做品,谢绝转载!不然将追究法律责任。node

 

 

一.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 configtestpython

[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\n 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:\Windows\System32\drivers\etc这个目录下去修改。
 

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]# 
相关文章
相关标签/搜索