WEB应用之httpd基础入门(二)

  前文咱们聊了下httpd的一些基础设置,聊了下httpd的配置文件格式,长链接、mpm的配置以及访问控制基于文件路径和URL管控,回顾请参考http://www.javashuo.com/article/p-mfwxfiqq-dv.html;今天咱们继续来聊一聊余下的一些经常使用配置;html

  一、定义路径别名:定义路径别名须要用到alias指令语法格式是alias /URL/ “PATH/TO/SOMEDIR/”;什么意思呢?一般状况用户访问/images/这个目录,对应文件系统路径应该是documentroot指令指定的路径下的images;若是使用了路径别名,用户访问/images这个URI就不必定是documentroot指令指定的路径下的images了;它至关于把文件系统上的一个路径映射成URL路径;该指令能够用在server配置块中,虚拟主机,和directory中;node

  示例:web

   提示:以上示例表示把文件系统路径“/usr/local/apache/icons/” 映射成URL路径“/icons/”,同时明确受权容许全部人访问“/usr/local/apache/icons/”目录;也就是说用户访问/icons/目录就至关于访问文件系统路径“/usr/local/apache/icons/”目录;数据库

   提示:这里须要注意一点的是若是咱们映射的URL路径是以“/”结尾,那么对应文件系统路径也必须是“/”结尾,以上面的示例若是咱们访问的URL是/icons将提示咱们访问不到,以下图apache

   提示:其实很好理解,上图的URL会去找documentroot指令指定的文件系统路径中找icons文件,若是可以找到就把对应文件内容响应给用户,若是是在documentroot指令指定的文件系统路径下icons是目录的话,咱们访问/icons就会被/icons/匹配,从而访问到别名路径上去;由于咱们访问目录默认会把目录下的文件给以索引的方式罗列出来,因此咱们访问某个目录,其URL最后会填上一个“/”,这样一来就会被对应的别名路径匹配;centos

  二、设定默认字符集:AddDefaultCharset  charset   此指令表示添加默认字符集,能够用在server配置块中、虚拟主机、directory、和.htaccess中;默认是off的浏览器

  三、日志设定;web服务日志类型有两种类型,一种是访问日志,记录用户访问站点的日志,另外一中类型就是错误日志,记录服务端程序出错等日志;安全

  errorlog:此指令表示定义错误日志存放路径及名称,该指令能够用在server配置段中,表示记录中心主机错误日志,一样也能够放在各虚拟主机中,表示记录各虚拟主机的错误日志;其语法格式为:errorlog file-path |syslog [:[facility] [:tag]]   ;从语法格式看咱们就知道错误日志除了能够在本地指定文件来记录外还能够将其发送给syslog;bash

  示例:服务器

   提示:以上配置表示把错误日志存放在logs/error_log文件中,这里的相对路径是相对于serverroot指定的路径;

  loglevel :此指令表示指定错误日志级别,咱们知道日志是有级别的,这个指令的做用就是告诉服务器,什么级别或该级别以上的日志信息记录到错误日志中;

  示例:

   提示:以上表示记录日志级别为warn以及以上级别的日志;

  访问日志:logformat:此指令表示指定访问日志格式,并给该格式取一名字,在后续的使用中能够经过customlog指令来调用该名字便可把访问日志格式记录成咱们想要的格式;日志格式中有不少httpd内建的宏,每一个宏都有不一样的意义,咱们定义访问日志格式也是经过组合这些宏来定义的;常见的宏以及对应的意思以下

  %h:客户端IP地址;

  %l:Remote User, 一般为一个减号(“-”);该用户指identd方式认证的用户;

  %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登陆访问时,其为一个减号;该用户指authenticated认证的用户;

  %t:服务器收到请求时的时间;

  %r:First line of request,即表示请求报文的首行;记录了这次请求的“方法”,“URL”以及协议版本;

  %>s:响应状态码;记录最后一次响应状态码,若是没有">"号就表示记录第一次状态码信息;若是在重定向中这种状态码就不是很准确了;

  %b:响应报文的大小,单位是字节;不包括响应报文的http首部;

  %{Referer}i:请求报文中首部“referer”的值;即从哪一个页面中的超连接跳转至当前页面的;

  %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

更多宏指令说明,请参考官方文档http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#logformat
  示例:

   提示:以上配置表示定义了两个格式的日志格式,分别叫combined 和common

  customlog:此指令表示指定访问日志路径及名称以及日志格式名称

  示例:

   提示:以上配置表示指定访问日志为logs/access_log,而且使用combined的格式记录访问日志;一样的这里的日志路径也是相对于serverroot指定的路径;咱们定义的访问日志格式究竟是什么样呢?以下:

   四、基于用户的访问控制

   首先咱们来了解下几个概念;

  认证质询:客户端访问服务端时,若是咱们对客户端访问的资源提早配置了须要认证才可访问,这时客户端访问服务端对应资源时,服务端会向客户端响应一个状态码为401,响应首部叫www-authenticate,明确的拒绝客户端访问,并告诉客户端,访问此资源须要认证提供用户名和密码;这个过程叫认证质询,意思就是告诉客户端访问的资源须要提供用户名和密码;以下

   认证:当客户端收到服务端的认证质询响应后,此时浏览器上会有一个对话框,提示用户输入用户名和密码,用户把对应的用户名和密码输入到对话框中,点击肯定,此时客户端的用户名和密码会经过authorization请求首部发送给服务端,服务端拿到客户端的用户名和密码,就会去比对客户端提供的用户名和密码是否正确,若是正确,则服务端把对应资源内容响应给客户端;这样的一个过程叫认证的过程,简单点说就是客户端提供用户名和密码,服务端进行验证是否正确,正确就响应对应资源内容,不正确就不响应;以下图所示

  安全域:所谓安全域就是用户访问的资源路径,咱们须要明确的经过名称对其进行表示,以便明确告知用户认证的缘由;

  了解了以上三个概念,咱们不难理解,要想认证,首先得须要要用户名和密码,这个用户名和密码怎么存放?咱们知道登陆Linux系统时会提示咱们输入用户名和密码,登陆成功后咱们就能够正常的输入命令操做Linux系统了,在Linux里咱们把登陆系统的用户名和密码信息存放在/etc/passwd和/etc/shadow文件中;但httpd认证的帐号和密码怎么存放的呢?其实存放帐号密码的工具备不少,咱们能够存放在数据库中,也能够借鉴Linux系统帐号密码的存放方式,把用户名和密码存放在文件中,只不过存放在数据库中,咱们还须要考虑httpd怎么去数据库找对应的用户名和密码;一般状况下咱们在登陆某宝的网站,也是须要帐号和密码的,这里的帐号和密码不是经过这种方式验证的,像咱们说的认证质询是http协议内部实现的访问控制机制,咱们在登陆某宝网站提供的用户名和密码认证的方式和这里说的认证不是一回事;一般状况下若是帐号和密码的数量比较大时,咱们一般会把帐号密码信息存放在数据库里;若是用户名和密码的数量极少,咱们用数据库存放帐号和密码就显得不那么高效了;

  在httpd程序中,提供了一个工具就能够用来建立存放用户名和密码的文件的工具,它叫htpasswd;咱们来了解下它的使用法吧;

[root@test_node1-centos7 conf]# htpasswd --help
Usage:
        htpasswd [-cimBdpsDv] [-C cost] passwordfile username
        htpasswd -b[cmBdpsDv] [-C cost] passwordfile username password

        htpasswd -n[imBdps] [-C cost] username
        htpasswd -nb[mBdps] [-C cost] username password
 -c  Create a new file.
 -n  Don't update file; display results on stdout.
 -b  Use the password from the command line rather than prompting for it.
 -i  Read password from stdin without verification (for script usage).
 -m  Force MD5 encryption of the password (default).
 -B  Force bcrypt encryption of the password (very secure).
 -C  Set the computing time used for the bcrypt algorithm
     (higher is more secure but slower, default: 5, valid: 4 to 31).
 -d  Force CRYPT encryption of the password (8 chars max, insecure).
 -s  Force SHA encryption of the password (insecure).
 -p  Do not encrypt the password (plaintext, insecure).
 -D  Delete the specified user.
 -v  Verify password for the specified user.
On other systems than Windows and NetWare the '-p' flag will probably not work.
The SHA algorithm does not use a salt and is less secure than the MD5 algorithm.
[root@test_node1-centos7 conf]# 

  提示:-c表示第一次建立存放用户名和密码的文件,-m表示使用md5方式加密存放密码(默认加密方式),-s表示使用sha方式加密密码,-B表示强制使用bcrypt方式加密密码,-p表示不加密密码,明文存放;-D表示删除一个用户和密码;-b表示使用模式,直接在命令行指定用户名和密码,直接建立,不须要手动输入密码;-i表示从标准输入获取密码一般用于脚本中;

  了解了htpasswd工具的选项后,咱们再来讲说认证方式,在httpd中基于用户的认证有两种,basic明文认证和digest消息摘要认证,一般basic认证是不安全的,很容易泄露用户名和密码,可是digest认证相对是比较安全的,可是须要客户端支持才行;了解了以上httpd的认证过程后,咱们来看看httpd是怎么配置认证的;

  authtype:此指令表示指定认证类型;

  authname “string”:此指令表示告诉用户为何认证,一般用于提示用户输入用户名和密码;

  authuserfile:指定存放用户名和密码的文件路径已经文件名称;

  require user:指定容许认证的用户,没有被指定的用户是不可以被认证的,即使authuserfile文件中存放的有对应用户名和密码;

以上指令只能用于directory或.htaccess中使用,一般用于定义安全域;

  示例:

  建立虚拟用户用于httpdbasic认证

[root@test_node1-centos7 conf]# htpasswd -c /etc/httpd/conf.d/.htpasswd tom
New password: 
Re-type new password: 
Adding password for user tom
[root@test_node1-centos7 conf]# htpasswd  /etc/httpd/conf.d/.htpasswd jerry
New password: 
Re-type new password: 
Adding password for user jerry
[root@test_node1-centos7 conf]# cat /etc/httpd/conf.d/.htpasswd 
tom:$apr1$xLIN6FgB$tQbKDzRRMyx/ahUGHhtN10
jerry:$apr1$5gjGaRfC$hK0MOgR6/dYpU5HBDH1nC/
[root@test_node1-centos7 conf]# 

  提示:咱们建立了/etc/httpd/conf.d/.htpasswd文件来存放用户名和密码;并建立了两个虚拟用户tom和jerry

   提示:以上配置表示用户访问根路径须要用户认证,认证用户是tom,认证类型是basic

   提示:能够看到咱们用tom用户数能够正常登陆的,咱们用jerry用户是否能够登陆呢?以下

   提示:能够看到没有写在require user 里的用户是不能登陆的,即使是authuserfile里有的用户名和密码;

   require valid-user:此指令表示容许authuserfile中的全部用户登陆访问

   提示:以上配置表示容许/etc/httpd/conf.d/.htpasswd文件中的全部用户能够登陆访问

   提示:能够看到authuserfile里的用户均可以登陆访问

以上是基于用户账号进行认证的配置实例演示,接下来咱们在来讲说基于组帐号认证

  authgroupfile:此指令表示指定组文件,这个文件的格式是组名:用户名1 用户名2……

  require group :此指令表示指定容许认证的组名

  示例:

  首先建立一个authguoupfile

[root@test_node1-centos7 conf.d]# htpasswd /etc/httpd/conf.d/.htpasswd xiaoming
New password: 
Re-type new password: 
Adding password for user xiaoming
[root@test_node1-centos7 conf.d]# htpasswd /etc/httpd/conf.d/.htpasswd xiaohong
New password: 
Re-type new password: 
Adding password for user xiaohong
[root@test_node1-centos7 conf.d]# cat /etc/httpd/conf.d/.htpasswd 
tom:$apr1$xLIN6FgB$tQbKDzRRMyx/ahUGHhtN10
jerry:$apr1$5gjGaRfC$hK0MOgR6/dYpU5HBDH1nC/
xiaoming:$apr1$xA1lDL.b$frhycSz3Ainlm4kktPn5A1
xiaohong:$apr1$HhAZCYJE$C/75gZ0k9x/5cw47Udooz1
[root@test_node1-centos7 conf.d]# cat > /etc/httpd/conf.d/.htgroup <<EOF
> group1:xiaohong xiaoming
> group2:tom jerry
> EOF
[root@test_node1-centos7 conf.d]# cat /etc/httpd/conf.d/.htgroup 
group1:xiaohong xiaoming
group2:tom jerry
[root@test_node1-centos7 conf.d]# 

  提示:以上新增了两个用户小明和小红,而后在/etc/httpd/conf.d/建立了一个authgroupfile 名为.htgroup,并在组文件中明肯定义了两个组group1里面有两个成员xiaoming和xiaohong ;group2中定义了两个成员tom和jerry,接下来咱们配置只容许group1里的用户访问;

   提示:以上配置表示group1组里的成员容许认证访问

   提示:能够看到group1里的xiaoming和xiaohong用户都是能够正常的认证访问;那么对应的group2里的成员是否能够访问呢?

 

   提示:能够看到没有被容许的组成员是不可以认证访问的

相关文章
相关标签/搜索