WEB应用之httpd基础入门(二)
前文我们聊了下httpd的一些基础设置,聊了下httpd的配置文件格式,长连接、mpm的配置以及访问控制基于文件路径和URL管控,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12551518.html;今天我们继续来聊一聊余下的一些常用配置;
1、定义路径别名:定义路径别名需要用到alias指令语法格式是alias /URL/ “PATH/TO/SOMEDIR/”;什么意思呢?通常情况用户访问/images/这个目录,对应文件系统路径应该是documentroot指令指定的路径下的images;如果使用了路径别名,用户访问/images这个URI就不一定是documentroot指令指定的路径下的images了;它相当于把文件系统上的一个路径映射成URL路径;该指令可以用在server配置块中,虚拟主机,和directory中;
示例:
提示:以上示例表示把文件系统路径“/usr/local/apache/icons/” 映射成URL路径“/icons/”,同时明确授权允许所有人访问“/usr/local/apache/icons/”目录;也就是说用户访问/icons/目录就相当于访问文件系统路径“/usr/local/apache/icons/”目录;
提示:这里需要注意一点的是如果我们映射的URL路径是以“/”结尾,那么对应文件系统路径也必须是“/”结尾,以上面的示例如果我们访问的URL是/icons将提示我们访问不到,如下图
提示:其实很好理解,上图的URL会去找documentroot指令指定的文件系统路径中找icons文件,如果能够找到就把对应文件内容响应给用户,如果是在documentroot指令指定的文件系统路径下icons是目录的话,我们访问/icons就会被/icons/匹配,从而访问到别名路径上去;因为我们访问目录默认会把目录下的文件给以索引的方式罗列出来,所以我们访问某个目录,其URL最后会填上一个“/”,这样一来就会被对应的别名路径匹配;
2、设定默认字符集:AddDefaultCharset charset 此指令表示添加默认字符集,可以用在server配置块中、虚拟主机、directory、和.htaccess中;默认是off的
3、日志设定;web服务日志类型有两种类型,一种是访问日志,记录用户访问站点的日志,另一中类型就是错误日志,记录服务端程序出错等日志;
errorlog:此指令表示定义错误日志存放路径及名称,该指令可以用在server配置段中,表示记录中心主机错误日志,同样也可以放在各虚拟主机中,表示记录各虚拟主机的错误日志;其语法格式为:errorlog file-path |syslog [:[facility] [:tag]] ;从语法格式看我们就知道错误日志除了可以在本地指定文件来记录外还可以将其发送给syslog;
示例:
提示:以上配置表示把错误日志存放在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指定的路径;我们定义的访问日志格式到底是什么样呢?如下:
4、基于用户的访问控制
首先我们来了解下几个概念;
认证质询:客户端访问服务端时,如果我们对客户端访问的资源提前配置了需要认证才可访问,这时客户端访问服务端对应资源时,服务端会向客户端响应一个状态码为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里的成员是否可以访问呢?
提示:可以看到没有被允许的组成员是不能够认证访问的