第十八课时预习笔记

Apache虚拟主机配置

在一个Apache服务器上能够配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不一样目录。Apache虚拟主机配置有3中方法:基于IP配置、基于域名配置和基于端口配置,这里介绍基于域名配置和基于端口配置,基于IP配置方法相似。javascript

 

1. Apache基于域名配置虚拟主机:

  打开Apache安装目录下的配置文件conf/extra/httpd-vhosts.conf,添加以下配置信息:

  <VirtualHost _default_:80>

    DocumentRoot "D:/wamp/www"

    ServerName www.jtw.com

  </VirtualHost>

  <VirtualHost *:80>

       ServerAdmin 2504091004@qq.com

       DocumentRoot "D:/wamp/www2"

       ServerName www.wujuntian.com

       ErrorLog "logs/wujuntian.log"

       CustomLog "logs/wujuntian.log" common

      <Directory "D:/wamp/www2">

           Options Indexes FollowSymLinks MultiViews

           AllowOverride None

           Require all granted

      </Directory>

  </VirtualHost>

  这里配置了两个虚拟主机,其中第一个是默认虚拟主机,找不到虚拟主机的域名访问也由这个虚拟主机来提供服务。这两个主机使用的都是80端口,第一个虚拟主机指定域名为“www.jtw.com”,服务器目录为“D:/wamp/www”,第二个虚拟你主机指定域名为“www.wujuntian.com”,服务器目录为“D:/wamp/www2”。

  而后在Apache主配置文件conf/httpd.conf中包含这个配置文件:

  Include conf/extra/httpd-vhosts.conf

  最后重启Apache服务器,就能够经过访问两个不一样的域名访问同一个服务器上的两个目录了。

  注意:若是只是在本地进行配置测试的话,须要在hosts文件中加入域名到本地IP地址的映射(hosts文件位置:C:\Windows\System32\drivers\etc):

  127.0.0.1       www.jtw.com

  127.0.0.1       www.wujuntian.com

 

2. Apache基于端口配置虚拟主机:

  首先在Apache配置文件conf/httpd.conf中修改配置让Apache服务器监听多个端口:

  Listen 8080

  Listen 80

  这里监听两个端口,配置两个虚拟主机。

  而后在配置文件conf/extra/httpd-vhosts.conf,添加以下配置信息:

  <VirtualHost _default_:80>

    DocumentRoot "D:/wamp/www"

  </VirtualHost>

  <VirtualHost *:8080>

       ServerAdmin 2504091004@qq.com

       DocumentRoot "D:/wamp/www2"

      <Directory "D:/wamp/www2">

           Options Indexes FollowSymLinks MultiViews

           AllowOverride None

           Require all granted

      </Directory>

  </VirtualHost>

  在Apache主配置文件conf/httpd.conf中包含这个配置文件:

  Include conf/extra/httpd-vhosts.conf

  最后重启Apache服务器,就能够经过同一个IP地址的不一样端口来访问同一个服务器上的两个不一样目录了。

  注意:Web服务器默认使用的是80端口,因此访问80端口的站点时能够不用加上“:80”,可是访问其余端口时必须带上端口号。


  在<VirtualHost></VirtualHost>段中的配置能够覆盖外面的配置。

apache的用户认证

1. 限制用户访问的方式:php

  1. 限制访问服务的客户端主机css

  2. 须要用户名和密码html

2. 行为用户验证须要两步:java

  1. 建立一个包含用户名和密码的文件mysql

  2. 服务器上的哪些资源须要保护,哪些用户能够进行访问linux

3. 建立用户数据库sql

  许多用户名和密码须要建立在一个文件中。出于安全考虑,这个文件不能放在文档目录里。在这个例子里,这个文件建立在/usr/local/etc/httpd目录里,名字叫users。shell

  这个文件包含许多用户名和密码。用户名和密码经过冒号分割,每一个用户单独占一行。可是你不能直接在这个文件中直接输入用户名和密码,由于存储在这个文件中的密码是加密的。程序htpasswd能够用来建立该文件,添加或者修改用户。数据库

  使用htpasswd建立该文件,添加用户名‘snow’,密码‘snow’的用户到该文件(/usr/local/httpd/user)

1 htpasswd -c /usr/local/etc/httpd/users snow

-c参数告诉htpasswd建立一个新的users文件。当你运行该命令时,将提示输入该用户的密码并确认。你能够添加其它的用户到该文件中,不过必须去掉-c参数。这个命名也能够用来修改密码。当你添加一个用户后,/usr/local/etc/httpd/users文件看起来想这样:

1 snow:$apr1$VmvJWi7o$diZjyiUiHkd8pSmb/8/gE0

第一个列是用户名,第二列是加密事后的密码。

4. 配置服务

为了让server使用在该文件中的用户名和密码,你须要配置一个realm,为了使用.htaccess文件限制一个目录的访问,你首先须要修改apache的配置文件(如何找到apache的配置文件),使目录使用.htaccess的形式限制访问,这个被AuthConfig属性控制,若是你想限制/var/www目录的访问,你修改apache的配置文件:

1 <Directory /var/www/>
2          Options Indexes FollowSymLinks
3          AllowOverride AuthConfig
4          Require all granted
5 </Directory>

而后在/var/www目录中创建一个.htaccess文件,内容以下:

AuthName "restricted stuff"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users

require valid-user

第一个指令AuthName,为这个资源配置一个realm名字,只要用户输入有效的用户名和密码,相同realm名字的其余资源也能够经过这个用户访问,这样作,主要是为了建立两个区域,使同一个用户能够访问这两个区域。

第二个指令AuthType告诉服务使用哪一种协议进行认证,目前来讲,仅有Baisc可用。可是出现了Digest,并且已经被标准化啦,只要浏览器实现了它,就可使用它。digest认证比Basic认证更安全。

第三个指令AuthUserFile告诉服务被htpasswd建立的文件在哪里。

第四个指令require告诉服务该文件中的哪些用户能够访问该文件,valid-user参数是告诉服务该文件中的任何用户均可以访问该资源,你也能够配置特定用户能够访问该资源。例如:

require user snow john

只有snow,john两个用户能够访问该资源,其余用户都会被拒绝。

若是一个用户被容许访问不一样的区域,他们仅仅须要输入一次密码,可是若是在不一样的区域有不一样的realm,用户须要再次输入他的密码。

5. 使用Groups

若是你想要users文件的一些用户访问一个资源,你须要在require行列出全部的用户,若是你有不少用户的话,这种方式是不太好的。有一种方式能够解决这种问题,就是用一个group文件,你可使用require行限制到特定的group。例如:有一个叫做staff的组,它包含全部访问特定资源的用户。

1 require group staff

多个group也可使用,用户也能够同时使用,

require group staff admin
require user adminuser

 

 它容许组staff和admin访问资源和用户adminuser访问资源。

group文件的形式:

staff: martin jane

admin: art adminuser

staff和admin是组,martin和jane属于staff组,art和adminuser属于admin组。

AuthGroupFile指令是告诉group文件在哪里。记住,在group文件中一行的最大长度是8000字符(大约8K),若是你有超过行的长度的用户数,你能够再写一行伴随着相同组。

当你添加AuthGroupFIle指令时,遇到以下错误时:/var/www/html/.htaccess: Invalid command 'AuthGroupFile', perhaps misspelled or defined by a module not included in the server configuration。请执行:

1 sudo a2enmod authz_groupfile

6. 伴随着许多用户的问题

使用htpasswd建立用户和以文本的形式管理组相对来讲比较简单,可是若是用户增多,服务器要作许多的处理来找响应的组和密码信息,这种处理必须在每一个请求中都要作(受保护的区域,尽管用户仅仅输入一次密码,可是在每次请求中,都必须从新认证),若是伴随着不少用户,那是至关慢的,增长服务器负载。比较块的访问是使用DBM格式文件,它容许服务作比较块的搜索,可是管理DBM文件也是比较复杂的。

7. 存储用户信息的其余方式

apache仅能访问在文本文件中的用户信息,可是有各类各样的模块容许用户信息存储到数据库中。除了有DBM格式(mod_auth_dbm module),用户信息和组信息也能够存储以DB的格式文件(mod_auth_db),或者各类各样的数据库也可使用。例如mSQL(mod_auth_msql),Postgres95(mod_auth_95),或者兼容DBI的数据库(mod_auth_dbi),也能够有一个额外的程序检测用户和密码是否有效(主要是用接口来检测数据库或者认证服务)。modules也能够用来检测系统密码文件或者使用Kerberos系统。

8. 限制不一样的方法

在上面的例子中,require指令并无包含在<Limit>指令中,这样意味着它应用到全部的请求方法,可是在一些应用中,须要将其放入<Limit>部分,例如:

1 <Limit GET POST PUT>
2     require valid-user
3 </Limit>

 在Apache中,最好忽略<Limit>标签,是为了确保保护应用到全部的方法中。可是,这种格式主要用来限制特定的方法。例如:仅仅限制POST方法。

复制代码

AuthName "restrict posting"
AuthType Basic
AuthUserFile /usr/local/etc/httpd/users

<Limit POST>
    require group staff
</Limit>

复制代码

 仅仅组staff的成员能够访问POST方法,其余的用户(未认证的)可使用其它的方法。例如:GET方法。这样作,主要是为了CGI程序让任何人能够访问。可是仅仅受权的用户能够请求POST方法。

9. 被主机或者用户限制

apache颇有可能同时使用用户和主机限制,正常状况下,apache须要两个条件同时知足,那便是,来自容许的主机或者域名的用户必须输入有效的用户名和密码才能进行资源访问。可是Satisfy any指令被使用在.htaccess文件或者<Directory>,<Location>,<Files>部分,当这个指令被使用的时候,来自容许的主机或者域名不须要输入用户名和密码就能进行访问,来自不容许的主机或者域名必须输入有效的用户名和密码。

10. WWW认证如何进行工做?

在HTTP中用户认证的方法至关简单,由于HTTP是无状态的协议。只要一个请求完成,服务器并不会记得关于那个请求的任何信息。浏览器须要在每次请求中从新发送用户名和密码。这就是他的工做原理。

当第一次访问须要认证的资源时,服务器返回401状态(未受权)和包含一个WWW-Authenticate响应头,这个包含认证策略(目前仅有Basic容许)和realm名字。浏览器而后询问用户名和密码。而后再次请求相同的资源。这一次包含Authorization头,它包含策略名字(Basic)和用户名和密码。

服务器检测用户名和密码,若是他们有效,就返回页面,若是密码无效或者用户并不容许,服务器返回401状态,浏览器将会继续询问用户名和密码。

假如用户名和密码有效,用户将会继续请求另外一个保护的资源,在这种状况下,服务器继续返回401状态,浏览器伴随着用户名和密码继续请求该资源,可是,这种将会很慢的。因此浏览器在接下来的请求中发送Authorization头,浏览器必须保证发送用户名和密码到相同的服务器上。(若是用户信息发送到不一样的服务器,将会不安全的)

浏览器须要记住用户名和密码。因此它能够发送用户名和密码信息在接下来的请求中。可是在测试认证的时候,将会引发问题,由于浏览器第一次已经记住用户名和密码信息,强制浏览器再次询问用户名和密码将会很困难的。

11. 安全和数字认证

认证容许资源被访问,是针对特定的用户。可是存在着一些潜在的安全问题。

  • 确保资源被限制在全部的方法中,例如:若是使用<Limit GET>,将会使其余的请求方法不被保护。
  • 用户名和密码放在文本文件中,虽然密码是加密的,可是并非绝对安全的。该文件不能被系统中的其余用户访问,更不能放在文档目录。(该目录能够被来自于网络的用户访问)
  • 用户名和密码应该要绝对安全。用户不该该告诉其余人他们的密码。
  • Basic认证策略在网络中传递密码是以非加密的方式传递的。因此他们能够被拦截。数字认证主要用来解决这个问题。

数字认证的方式将会使在网络中密码的方式更安全,在发送以前,密码会被加密,而后服务器会解密它。数字认证工做的方式和Basic认证的方式同样,数字认证的使用主要依赖于浏览器提供商是否写入他们的产品。Apache已经作了数字认证,被mod_digest模块所编译。

域名跳转

域名跳转也叫作301重定向,当咱们变动网站域名,或者申请多个域名指向一个网站的时候,这个时候咱们就会用到域名跳转(或者叫域名重定向redirect、域名转向)

几个特征码: 
401 访问认证 
403 不容许访问(配置文件能设置) 
404 页面不存在 
301 永久重定向 
302 临时重定向 
200 正确

域名跳转设置:

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/www.123.com"
    ServerName www.123.com
    ServerAlias 123.com
    <IfModule mod_rewrite.c> //须要mod_rewrite模块支持
        RewriteEngine on  //打开rewrite功能
        RewriteCond %{HTTP_HOST} !^www.123.com$  //定义rewrite的条件,主机名(域名)不是www.123.com知足条件就跳转
        RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L] //定义rewrite规则,当知足上面的条件时,这条规则才会执行,并将域名后面的移到www.123.com/后面
    </IfModule>
</VirtualHost>

^/(.*)$表示除域名以外的其余部分,$1也表示这一部分。如https://blog.csdn.net/aoli_shuai/article/list/3,这个^/(.*)$表示/aoli_shuai/article/list/3

域名跳转须要mod_rewrite模块支持

打开虚拟主机配置文件:

[root@shuai-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.111.com www.example.com
  #  <Directory /data/wwwroot/111.com> 
  #  <FilesMatch 123.php>
  #     AllowOverride AuthConfig 
  #      AuthName "111.com user auth" 
  #      AuthType Basic 
  #      AuthUserFile /data/.htpasswd  
  #      require valid-user 
  #  </FilesMatch>
   # </Directory> 
       <IfModule mod_rewrite.c>
        RewriteEngine on
        RewriteCond %{HTTP_HOST} !^111.com$
        RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]
        </IfModule>

    ErrorLog "logs/111.com-error_log"
    CustomLog "logs/111.com-access_log" common
</VirtualHost>

检测配置文件语法并从新加载配置文件

[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl graceful

检测Apache是否加载rewrite模块

[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite

没有加载,去配置文件设置

[root@shuai-01 ~]# vi /usr/local/apache2.4/conf/httpd.conf


LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module        modules/libphp5.so


[root@shuai-01 ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite
 rewrite_module (shared)

访问www.example.com会跳转到111.com

[root@shuai-01 ~]# curl -x127.0.0.1:80 www.example.com -I
HTTP/1.1 301 Moved Permanently
Date: Wed, 20 Dec 2017 08:57:28 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.30
Location: http://111.com/
Content-Type: text/html; charset=iso-8859-1

这里写图片描述

Apache访问日志详解

 1、访问日志的格式
  Apache内建了记录服务器活动的功能,这就是它的日志功能。这个《Apache日志》系列文章介绍的就是Apache的访问日志、错误日志,以及如何分析日志数据,如何定制Apache日志,如何从日志数据生成统计报表等内容。
  若是Apache的安装方式是默认安装,服务器一运行就会有两个日志文件生成。这两个文件是access_log(在Windows上是access.log)和error_log(在Windows上是error.log)。采用默认安装方式时,这些文件能够在/usr/local/apache/logs下找到;对于Windows系统,这些日志文件将保存在Apache安装目录的logs子目录。不一样的包管理器会把日志文件放到各类不一样的位置,因此你可能须要找找其余的地方,或者经过配置文件查看这些日志文件配置到了什么地方。
  正如其名字所示,访问日志access_log记录了全部对Web服务器的访问活动。下面是访问日志中一个典型的记录:
  180.168.41.175 - - [19/Aug/2000:14:47:37 -0400] "GET / HTTP/1.0" 200 654

【216.35.116.91 - - [19/Aug/2000:14:47:37 -0400] "GET / HTTP/1.0" 200 654】【可忽略此行】
  这行内容由7项构成,上面的例子中有两项空白,但整行内容仍旧分红了7项。
  第一项信息是远程主机的地址,即它代表访问网站的到底是谁。在上面的例子中,访问网站的主机是(我用咱们公司的域名解析查询的结果是180.168.41.175)【216.35.116.91忽略】。随便说一句,这个地址属于一台名为si3001.inktomi.com的机器(要找出这个信息,可使用nslookup工具查找DNS),inktomi.com是一家制做Web搜索软件的公司。能够看出,仅仅从日志记录的第一项出发,咱们就能够获得有关访问者的很多信息。
  默认状况下,第一项信息只是远程主机的IP地址,但咱们能够要求Apache查出全部的主机名字,并在日志文件中用主机名字来替代IP地址。然而,这种作法一般不值得推荐,由于它将极大地影响服务器记录日志的速度,从而也就减低了整个网站的效率。另外,有许多工具可以将日志文件中的IP地址转换成主机名字,所以要求Apache记录主机名字替代IP地址是得不偿失的。
  然而,若是确实有必要让Apache找出远程主机的名字,那么咱们可使用以下指令:
  HostNameLookups on
  若是HostNameLookups设置成double而不是on,日志记录程序将对它找到的主机名字进行反向查找,验证该主机名字确实指向了原来出现的IP地址。默认状况下HostNameLookups设置为off。
  上例日志记录中的第二项是空白,用一个“-”占位符替代。实际上绝大多数时候这一项都是如此。这个位置用于记录浏览者的标识,这不仅是浏览者的登陆名字,而是浏览者的email地址或者其余惟一标识符。这个信息由identd返回,或者直接由浏览器返回。很早的时候,那时Netscape 0.9还占据着统治地位,这个位置每每记录着浏览者的email地址。然而,因为有人用它来收集邮件地址和发送垃圾邮件,因此它未能保留多久,好久以前市场上几乎全部的浏览器就取消了这项功能。所以,到了今天,咱们在日志记录的第二项看到email地址的机会已经微乎其微了。
  日志记录的第三项也是空白。这个位置用于记录浏览者进行身份验证时提供的名字。固然,若是网站的某些内容要求用户进行身份验证,那么这项信息是不会空白的。可是,对于大多数网站来讲,日志文件的大多数记录中这一项仍旧是空白的。
  日志记录的第四项是请求的时间。这个信息用方括号包围,并且采用所谓的“公共日志格式”或“标准英文格式”。所以,上例日志记录表示请求的时间是2000年8月19日星期三14:47:37。时间信息最后的-0400”表示服务器所处时区位于UTC以前的4小时
  日志记录的第五项信息或许是整个日志记录中最有用的信息,它告诉咱们服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法资源协议”。
  在上例中,METHOD是GET,其余常常可能出现的METHOD还有POST和HEAD。此外还有很多可能出现的合法METHOD,但主要就是这三种。
  RESOURCE是指浏览者向服务器请求的文档,或URL。在这个例子中,浏览者请求的是“/”,即网站的主页或根。大多数状况下,“/”指向DocumentRoot目录的index.html文档,但根据服务器配置的不一样它也可能指向其余文件。
  PROTOCOL一般是HTTP,后面再加上版本号。版本号或者是1.0,或者是1.1,但出现1.0的时候比较多。咱们知道,HTTP协议是Web得以工做的基础,HTTP/1.0是HTTP协议的早期版本,而1.1是最近的版本。当前大多数Web客户程序仍使用1.0版本的HTTP协议。
  日志记录的第六项信息是状态代码。它告诉咱们请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。此处不许备给出状态代码的完整清单以及解释它们的含义,请参考相关资料了解这方面的信息。但通常地说,2开头的状态代码表示成功,以3开头的状态代码表示因为各类不一样的缘由用户请求被重定向到了其余位置,以4开头的状态代码表示客户端存在某种错误,以5开头的状态代码表示服务器遇到了某个错误
  日志记录的第七项表示发送给客户端的总字节数。它告诉咱们传输是否被打断(即,该数值是否和文件的大小相同)。把日志记录中的这些值加起来就能够得知服务器在一天、一周或者一月内发送了多少数据。
  2、配置访问日志
  访问日志文件的位置其实是一个配置选项。若是咱们检查httpd.conf配置文件,能够看到该文件中有以下这行内容:
  CustomLog /usr/local/apache/logs/access_log common
  注意,对于版本较早的Apache服务器,这行内容可能略有不一样。它使用的可能不是CustomLog指令,而是TransferLog指令。若是你的服务器属于这类状况,建议你尽量地早日升级服务器。
  CustomLog指令指定了保存日志文件的具体位置以及日志的格式。至于如何定制日志文件的格式以及内容,咱们将在这个《Apache日志》系列文章的后面几篇讨论。上面这行指令指定的是common日志格式,自从有了Web服务器开始,common格式就是它的标准格式。由此咱们也能够理解,虽然几乎再也不有任何客户程序向服务器提供用户的标识信息,但访问日志却还保留着第二项内容。
  CustomLog指令中的路径是日志文件的路径。注意,因为日志文件是由HTTP用户打开的(用User指令指定),所以必须注意这个路径要有安全保证,防止该文件被随意改写。
  《Apache日志》系列文章的后面几篇将继续介绍:Apache错误日志,定制日志的格式和内容,如何将日志内容写入指定的程序而不是文件,如何从日志文件得到一些很是有用的统计信息,等等。

3、进程统计
  UNIX能够跟踪每一个用户运行的每条命令,若是想知道昨晚弄乱了哪些重要的文件,进程统计子系统能够告诉你。它对还跟踪一个侵入者有帮助。与链接时间日志不一样,进程统计子系统缺省不激活,它必须启动。在Linux系统中启动进程统计使用accton命令,必须用root身份来运行。Accton命令的形式accton file,file必须先存在。先使用touch命令来建立pacct文件:touch /var/log/pacct,而后运行accton: accton /var/log/pacct。一旦accton被激活,就可使用lastcomm命令监测系统中任什么时候候执行的命令。若要关闭统计,可使用不带任何参数的accton命令。
  lastcomm命令报告之前执行的文件。不带参数时,lastcomm命令显示当前统计文件生命周期内纪录的全部命令的有关信息。包括命令名、用户、tty、命令花费的CPU时间和一个时间戳。若是系统有许多用户,输入则可能很长。下面的例子:
  crond F root ?? 0.00 secs Sun Aug 20 00:16
  promisc_check.s S root ?? 0.04 secs Sun Aug 20 00:16
  promisc_check root ?? 0.01 secs Sun Aug 20 00:16
  grep root ?? 0.02 secs Sun Aug 20 00:16
  tail root ?? 0.01 secs Sun Aug 20 00:16
  sh root ?? 0.01 secs Sun Aug 20 00:15
  ping S root ?? 0.01 secs Sun Aug 20 00:15
  ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
  sh root ?? 0.01 secs Sun Aug 20 00:15
  ping S root ?? 0.02 secs Sun Aug 20 00:15
  ping6.pl F root ?? 0.02 secs Sun Aug 20 00:15
  sh root ?? 0.02 secs Sun Aug 20 00:15
  ping S root ?? 0.00 secs Sun Aug 20 00:15
  ping6.pl F root ?? 0.01 secs Sun Aug 20 00:15
  sh root ?? 0.01 secs Sun Aug 20 00:15
  ping S root ?? 0.01 secs Sun Aug 20 00:15
  sh root ?? 0.02 secs Sun Aug 20 00:15
  ping S root ?? 1.34 secs Sun Aug 20 00:15
  locate root ttyp0 1.34 secs Sun Aug 20 00:15
  accton S root ttyp0 0.00 secs Sun Aug 20 00:15
  进程统计的一个问题是pacct文件可能增加的十分迅速。这时须要交互式的或通过cron机制运行sa命令来保持日志数据在系统控制内。sa命令报告、清理并维护进程统计文件。它能把/var/log/pacct中的信息压缩到摘要文件/var/log/savacct和/var/log/usracct中。这些摘要包含按命令名和用户名分类的系通通计数据。sa缺省状况下先读它们,而后读pacct文件,使报告能包含全部的可用信息。sa的输出有下面一些标记项:
  avio--每次执行的平均I/O操做次数
  cp--用户和系统时间总和,以分钟计
  cpu--和cp同样
  k--内核使用的平均CPU时间,以1k为单位
  k*sec--CPU存储完整性,以1k-core秒
  re--实时时间,以分钟计
  s--系统时间,以分钟计
  tio--I/O操做的总数
  u--用户时间,以分钟计
  例如:
  842 173.26re 4.30cp 0avio 358k
  2 10.98re 4.06cp 0avio 299k find
  9 24.80re 0.05cp 0avio 291k ***other
  105 30.44re 0.03cp 0avio 302k ping
  104 30.55re 0.03cp 0avio 394k sh
  162 0.11re 0.03cp 0avio 413k security.sh*
  154 0.03re 0.02cp 0avio 273k ls
  56 31.61re 0.02cp 0avio 823k ping6.pl*
  2 3.23re 0.02cp 0avio 822k ping6.pl
  35 0.02re 0.01cp 0avio 257k md5sum
  97 0.02re 0.01cp 0avio 263k initlog
  12 0.19re 0.01cp 0avio 399k promisc_check.s
  15 0.09re 0.00cp 0avio 288k grep
  11 0.08re 0.00cp 0avio 332k awk
  用户还能够根据用户而不是命令来提供一个摘要报告。例如sa -m显示以下:
  885 173.28re 4.31cp 0avk
  root 879 173.23re 4.31cp 0avk
  alias 3 0.05re 0.00cp 0avk
  qmailp 3 0.01re 0.00cp 0avk
  4、Syslog设备
  Syslog已被许多日志函数采纳,它用在许多保护措施中--任何程序均可以经过syslog纪录事件。Syslog能够纪录系统事件,能够写到一个文件或设备中,或给用户发送一个信息。它能纪录本地事件或经过网络纪录另外一个主机上的事件。
  Syslog设备依据两个重要的文件:/etc/syslogd(守护进程)和/etc/syslog.conf配置文件,习惯上,多数syslog信息被写到/var/adm或/var/log目录下的信息文件中(messages.*)。一个典型的syslog纪录包括生成程序的名字和一个文本信息。它还包括一个设备和一个优先级范围(但不在日之中出现)。
  每一个syslog消息被赋予下面的主要设备之一:
  LOG_AUTH--认证系统:login、su、getty等
  LOG_AUTHPRIV--同LOG_AUTH,但只登陆到所选择的单个用户可读的文件中
  LOG_CRON--cron守护进程
  LOG_DAEMON--其余系统守护进程,如routed
  LOG_FTP--文件传输协议:ftpd、tftpd
  LOG_KERN--内核产生的消息
  LOG_LPR--系统打印机缓冲池:lpr、lpd
  LOG_MAIL--电子邮件系统
  LOG_NEWS--网络新闻系统
  LOG_SYSLOG--由syslogd(8)产生的内部消息
  LOG_USER--随机用户进程产生的消息
  LOG_UUCP--UUCP子系统
  LOG_LOCAL0~LOG_LOCAL7--为本地使用保留
  Syslog为每一个事件赋予几个不一样的优先级:
  LOG_EMERG--紧急状况
  LOG_ALERT--应该被当即改正的问题,如系统数据库破坏
  LOG_CRIT--重要状况,如硬盘错误
  LOG_ERR--错误
  LOG_WARNING--警告信息
  LOG_NOTICE--不是错误状况,可是可能须要处理
  LOG_INFO--情报信息
  LOG_DEBUG--包含情报的信息,一般旨在调试一个程序时使用
  syslog.conf文件指明syslogd程序纪录日志的行为,该程序在启动时查询配置文件。该文件由不一样程序或消息分类的单个条目组成,每一个占一行。对每类消息提供一个选择域和一个动做域。这些域由tab隔开:选择域指明消息的类型和优先级;动做域指明syslogd接收到一个与选择标准相匹配的消息时所执行的动做。每一个选项是由设备和优先级组成。当指明一个优先级时,syslogd将纪录一个拥有相同或更高优先级的消息。因此若是指明"crit",那全部标为crit、alert和emerg的消息将被纪录。每行的行动域指明当选择域选择了一个给定消息后应该把他发送到哪儿。例如,若是想把全部邮件消息纪录到一个文件中,以下:
  #Log all the mail messages in one place
  mail.* /var/log/maillog
  其余设备也有本身的日志。UUCP和news设备能产生许多外部消息。它把这些消息存到本身的日志(/var/log/spooler)中并把级别限为"err"或更高。例如:
  # Save mail and news errors of level err and higher in aspecial file.
  uucp,news.crit /var/log/spooler
  当一个紧急消息到来时,可能想让全部的用户都获得。也可能想让本身的日志接收并保存。
  #Everybody gets emergency messages, plus log them on anther machine
  *.emerg *
  *.emerg @linuxaid.com.cn
  alert消息应该写到root和tiger的我的帐号中:
  #Root and Tiger get alert and higher messages
  *.alert root,tiger
  有时syslogd将产生大量的消息。例如内核("kern"设备)可能很冗长。用户可能想把内核消息纪录到/dev/console中。下面的例子代表内核日志纪录被注释掉了:
  #Log all kernel messages to the console
  #Logging much else clutters up the screen
  #kern.* /dev/console
  用户能够在一行中指明全部的设备。下面的例子把info或更高级别的消息送到/var/log/messages,除了mail之外。级别"none"禁止一个设备:
  #Log anything(except mail)of level info or higher
  #Don't log private authentication messages!
  *.info:mail.none;authpriv.none /var/log/messages
  在有些状况下,能够把日志送到打印机,这样网络入侵者怎么修改日志都没有用了。一般要普遍纪录日志。Syslog设备是一个攻击者的显著目标。一个为其余主机维护日志的系统对于防范服务器攻击特别脆弱,所以要特别注意。
  有个小命令logger为syslog(3)系统日志文件提供一个shell命令接口,使用户能建立日志文件中的条目。用法:logger例如:logger This is a test!
  它将产生一个以下的syslog纪录:Aug 19 22:22:34 tiger: This is a test!
  注意不要彻底相信日志,由于攻击者很容易修改它的。
  5、程序日志
  许多程序经过维护日志来反映系统的安全状态。su命令容许用户得到另外一个用户的权限,因此它的安全很重要,它的文件为sulog。一样的还有sudolog。另外,想Apache有两个日志:access_log和error_log。

配置静态元素过时时间

浏览器去访问网站时会把静态文件(图片,css , js)默认缓存在电脑里。这样下次访问时就不用再去远程下载了。缓存多长时间?浏览器会有本身的机制,清空缓存。或者在远程服务器端能够设置。

服务器经过expires模块能够定义失效时间。

服务器定义静态元素过时时间配置:

 
  1. <IfModule mod_expires.c>

  2. ExpiresActive on //打开该功能的开关

  3. ExpiresByType image/gif "access plus 1 days"

  4. ExpiresByType image/jpeg "access plus 24 hours"

  5. ExpiresByType image/png "access plus 24 hours"

  6. ExpiresByType text/css "now plus 2 hour"

  7. ExpiresByType application/x-javascript "now plus 2 hours"

  8. ExpiresByType application/javascript "now plus 2 hours"

  9. ExpiresByType application/x-shockwave-flash "now plus 2 hours"

  10. ExpiresDefault "now plus 0 min"

  11. </IfModule>

  •  

这是expires模块,开关(ExpiresActive on ),为某些类型的静态元素配置过时时间,gif 的时间为1天( ExpiresByType image/gif “access plus 1 days”),png的一天(ExpiresByType image/png “access plus 24 hours”),css的两小时( ExpiresByType text/css “now plus 2 hour”)

打开网站(111.com/logo.png),这是会显示304 
这里写图片描述

在服务器段配置元素过时时间:

编辑虚拟主机配置文件:

 
  1. [root@shuai-01 111.com]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf

  2.  
  3. <VirtualHost *:80>

  4. DocumentRoot "/data/wwwroot/111.com"

  5. ServerName 111.com

  6. ServerAlias www.111.com www.example.com

  7. # <Directory /data/wwwroot/111.com>

  8. # <FilesMatch 123.php>

  9. # AllowOverride AuthConfig

  10. # AuthName "111.com user auth"

  11. # AuthType Basic

  12. # AuthUserFile /data/.htpasswd

  13. # require valid-user

  14. # </FilesMatch>

  15. # </Directory>

  16. <IfModule mod_rewrite.c>

  17. RewriteEngine on

  18. RewriteCond %{HTTP_HOST} !^111.com$

  19. RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]

  20. </IfModule>

  21. <IfModule mod_expires.c>

  22. ExpiresActive on

  23. ExpiresByType image/gif "access plus 1 days"

  24. ExpiresByType image/jpeg "access plus 24 hours"

  25. ExpiresByType image/png "access plus 24 hours"

  26. ExpiresByType text/css "now plus 2 hour"

  27. ExpiresByType application/x-javascript "now plus 2 hours"

  28. ExpiresByType application/javascript "now plus 2 hours"

  29. ExpiresByType application/x-shockwave-flash "now plus 2 hours"

  30. ExpiresDefault "now plus 0 min"

  31. </IfModule>

  32. SetEnvIf Request_URI ".*\.gif$" img

  33. SetEnvIf Request_URI ".*\.jpg$" img

  34. SetEnvIf Request_URI ".*\.png$" img

  35. SetEnvIf Request_URI ".*\.bmp$" img

  36. SetEnvIf Request_URI ".*\.swf$" img

  37. SetEnvIf Request_URI ".*\.js$" img

  38. SetEnvIf Request_URI ".*\.css$" img

  39. ErrorLog "logs/111.com-error_log"

  40. CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img

  41. </VirtualHost>

  •  

这是一个模块,先看这个模块文件有没有打开

[root@shuai-01 111.com]# /usr/local/apache2.4/bin/apachectl -M |grep expires
  •  

在主配置文件中加载模块

 
  1. [root@shuai-01 111.com]# vim /usr/local/apache2.4/conf/httpd.conf

  2.  
  3. LoadModule env_module modules/mod_env.so

  4. LoadModule expires_module modules/mod_expires.so

  5. LoadModule headers_module modules/mod_headers.so

  •  

检查配置文件语法是否错误并从新加载

 
  1. [root@shuai-01 111.com]# /usr/local/apache2.4/bin/apachectl -t

  2. Syntax OK

  3. [root@shuai-01 111.com]# /usr/local/apache2.4/bin/apachectl graceful

  •  

这是在访问网站(111.com/logo.png)

没作过时和作了过时先后对比: 
没作过时 
这里写图片描述

作过时 
这里写图片描述

在curl里也能反映出来

 
  1. [root@shuai-01 111.com]# curl -x127.0.0.1:80 111.com/logo.png -I

  2. HTTP/1.1 200 OK

  3. Date: Thu, 21 Dec 2017 14:46:37 GMT

  4. Server: Apache/2.4.29 (Unix) PHP/5.6.30

  5. Last-Modified: Thu, 21 Dec 2017 14:12:26 GMT

  6. ETag: "1914-560da4a1b6680"

  7. Accept-Ranges: bytes

  8. Content-Length: 6420

  9. Cache-Control: max-age=86400

  10. Expires: Fri, 22 Dec 2017 14:46:37 GMT

  11. Content-Type: image/png