默认虚拟主机,用户认证,域名跳转,访问日志,缓存时间,防盗链,访问控制

11.16-11.27 默认虚拟主机,用户认证,域名跳转,访问日志,缓存时间,防盗链,访问控制

默认虚拟主机

httpd可以支持多个虚拟主机,当一个域名被指向这台服务器,而域名又没有在这台服务器上标注,那么就由默认虚拟主机来处理。

vim /usr/local/apache2.4/conf/httpd.conf //把下面这行前面的#去掉,开启虚拟主机后,实体主机自动失效
Include conf/extra/httpd-vhosts.conf


vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf  //编辑虚拟主机配置文件
<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com" //文件存放路径
    ServerName abc.com                   //主机名,只能设置一个域名
    ServerAlias www.abc.com www.123.com  //别名,可以设置多个域名
    ErrorLog "logs/abc.com-error_log"    //错误日志
    CustomLog "logs/abc.com-access_log" common  //访问日志
</VirtualHost>


[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法是否正确
Syntax OK
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件
[root@cent01 mariadb]# curl -x127.0.0.1:80 abc.com  //用curl访问主域名,成功
abc.com[root@cent01 mariadb]# curl -x127.0.0.1:80 www.abc.com //访问别名1,成功
abc.com[root@cent01 mariadb]# curl -x127.0.0.1:80 www.123.com //访问别名2,成功
abc.com[root@cent01 mariadb]# 

用户认证

有时候我们需要对网站进行加密,只有密码通过的用户才能访问。

方法如下:

<VirtualHost *:80>

    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn

<Directory /data/wwwroot/111.com>  //指定加密目录
         AllowOverride AuthConfig //打开加密开关
         AuthName "111.com user auth"  //自定义认证的名字
         AuthType Basic //加密类型,basic就够了
         AuthUserFile /data/.htpasswd  //指定密码文件
         require valid-user  //指定需要认证的用户为全部可用用户
</Directory>

</VirtualHost>

//配置完成后需要创建密码文件
/usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd aming //用apache自带的密码工具,-c表示创建,-m表示加密方式为md5,aming为用户名。第一次创建时需要加-c,创建第二个用户名时不需要。否则之前的用户名密码会被清空。

/usr/local/apache2.4/bin/htpasswd -m /data/.htpasswd user2  //再创建用户时不需要加-c

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法是否正确
Syntax OK
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

在宿主机host上定义111.com到本机ip。
在浏览器中输入域名,则要求输入用户名密码。

域名跳转

域名跳转也是常用的功能,做域名跳转,并设置状态码为301,也有利于网站的seo。

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn

 <IfModule mod_rewrite.c> //需要rewrite模块支持
        RewriteEngine on  //打开rewrite功能
        RewriteCond %{HTTP_HOST} !^111.com$  //定义条件,当主机名不是111.com时
        RewriteRule ^/(.*)$ http://www.111.com/$1 [R=301,L] //当满足上面的条件时,把实际域名转化为后面的这一段。状态码301表示原主机永久被移除,L表示last只跳转一次。
 </IfModule>
</VirtualHost>


vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf  //打开rewrite模块
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件
/usr/local/apache2.4/bin/apachectl -M |grep -i rewrite  //检查是否已加载模块

curl -x127.0.0.1:80 -I www.example.com  //测试成功
HTTP/1.1 301 Moved Permanently
Location: http://www.111.com

访问日志与切割

日志记录了很多系统的信息,通过读日志,可以找到系统问题的原因。而日志有不同的格式,分为common和combined,combined可以记录更多的信息。

同时,日志日积月累,数据文件会越来越大,所以也需要对日志进行自动切割。

[root@cent01 ~]# vim /usr/local/apache2.4/conf/httpd.conf  //搜索LogFormat,可以看到以下两种日志格式。

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common


<VirtualHost *:80>       //后面customlog后的common改为combined即可
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  
 <IfModule mod_rewrite.c> //需要rewrite模块支持
        RewriteEngine on  //打开rewrite功能
        RewriteCond %{HTTP_HOST} !^111.com$  //定义条件,当主机名不是111.com时
 </IfModule>
    ErrorLog "logs/111.com-error_log"
    CustomLog "logs/111.com-access_log" combined
</VirtualHost>

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

curl -x127.0.0.1:80 -I www.example.com  //测试
tail /usr/local/apache2.4/logs/111.com-access_log //查看日志

阻隔对静态文件的访问记录在日志里
用户访问页面时会调用大量的静态文件,会占用大量的日志空间,但是对静态文件访问的日志对我们分析系统几乎没有作用,所以应该排除掉记录对静态文件的访问。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  

    SetEnvIf Request_URI ".*\.gif$" img  //定义变量
    SetEnvIf Request_URI ".*\.jpg$" img
    #SetEnvIf Request_URI ".*\.png$" img
    SetEnvIf Request_URI ".*\.bmp$" img
    SetEnvIf Request_URI ".*\.swf$" img
    SetEnvIf Request_URI ".*\.js$" img

    CustomLog "logs/111.com-access_log" combined env=!img  //只记录非img的访问
</VirtualHost>

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

curl -x127.0.0.1:80 -I 111.com  //测试
curl -x127.0.0.1:80 -I 111.com/1.jpg  //测试
tail /usr/local/apache2.4/logs/111.com-access_log //查看日志,发现访问1.jpg没有记录在日志中

日志自动切割
如果日志总是在一个文件里,那么我们即不能删掉日志,也没法控制日志占用的磁盘大小。所以需要对日志进行自动的切割。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  

    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400 " combined   //表示使用apache自带的rotatelogs工具,%Y%m%d表示按日期命名,86400秒是一天的间隔,每天生成一个新文件
</VirtualHost>

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

curl -x127.0.0.1:80 -I 111.com  //测试
curl -x127.0.0.1:80 -I 111.com/1.jpg  //测试
ls /usr/local/apache2.4/logs/111.com-access_log //查找新生成的日志文件

设置缓存时间

为了提高用户的访问速度,用户再次访问已经过的页面时,可以直接读取上一次访问时下载的文件。但是这个文件是有有效期的,称为缓存有效期。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  

<IfModule mod_expires.c>  //需要加载expire模块
    ExpiresActive on  //打开该功能的开关
    ExpiresByType image/gif  "access plus 1 days"
    ExpiresByType image/jpeg "access plus 24 hours"
    ExpiresByType image/png "access plus 24 hours"
    ExpiresByType text/css "now plus 2 hour"
    ExpiresByType application/x-javascript "now plus 2 hours"
    ExpiresByType application/javascript "now plus 2 hours"
    ExpiresByType application/x-shockwave-flash "now plus 2 hours"
    ExpiresDefault "now plus 0 min"
</IfModule>

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

</VirtualHost>

//在httpd配置文件里打开对expire模块的支持
[root@cent01 bin]# vim /usr/local/apache2.4/conf/httpd.conf

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件


[root@cent01 bin]# curl -x127.0.0.1:80 -I 111.com/chrome.png
HTTP/1.1 200 OK
Date: Mon, 13 Nov 2017 08:53:45 GMT
Server: Apache/2.4.29 (Unix) PHP/5.6.32
cache-control:max-age 86400 //缓存时间24小时

防盗链

防盗链的主要原理是检测链接的referer,这个referer指的是这个链接的上一级是哪里,他是从哪里跳转过来的。在combined日志中,就有这一项。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  
    <Directory /data/wwwroot/111.com>
        SetEnvIfNoCase Referer "http://www.111.com" local_ref //设置上一级的referer
        SetEnvIfNoCase Referer "http://111.com" local_ref
        SetEnvIfNoCase Referer "http://www.jianshu.com" local_ref
        SetEnvIfNoCase Referer "^$" local_ref //上一级referer为空,即直接用文件的链接访问
        <filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)"> //定义需要过滤的文件类型
            Order Allow,Deny  //顺序是先允许再拒绝
            Allow from env=local_ref
        </filesmatch>
    </Directory>

</VirtualHost>


[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

curl -x127.0.0.1:80 -I -e "http://www.111.com" www.111.com/1.jpg
返回状态码200,访问成功。因为-e模拟了referer。

curl -x127.0.0.1:80 -I -e "http://www.1112.com" www.111.com/1.jpg
返回状态码403。因为-e模拟的referer不合法。

访问控制

有时候我们需要只允许某一个ip或者ip段进行访问。这时就需要用到访问控制功能。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  
    <Directory /data/wwwroot/111.com>  //设置限制的目录
       Order Deny,Allow  //先允许,后拒绝
       Deny from all
       Allow from 127.0.0.1 //表示只有从本机ip访问的才合法
    </Directory>
</VirtualHost>

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

[root@cent01 bin]# curl -x127.0.0.1:80 111.com -I  //从本机访问ok,但是如果从浏览器访问,则是403
HTTP/1.1 200 OK

针对某个文件夹做限制

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  
    <Directory /data/wwwroot/111.com>  //设置限制的目录
      <FilesMatch  "admin.php(.*)">  //针对路径下匹配admin.php的路径
          Order deny,allow
          Deny from all
          Allow from 127.0.0.1
      </FilesMatch>
    </Directory>
</VirtualHost>

[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl -t  //检查语法
[root@cent01 mariadb]# /usr/local/apache2.4/bin/apachectl graceful  //重载配置文件

[root@cent01 bin]# curl -x127.0.0.1:80 111.com -I //连接成功
HTTP/1.1 200 OK
[root@cent01 bin]# curl -x127.0.0.1:80 111.com/admin.php -I  //连接失败
HTTP/1.1 404 Not Found

禁止解析php
有时候网站有上传文件的需求,这时如果被黑客上传了有害的代码,就会造成隐患。所以我们应该把能上传文件的目录禁用php代码解析。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  
    <Directory /data/wwwroot/111.com/upload>  //针对upload目录做限制
        php_admin_flag engine off  //关闭解析引擎
    </Directory>
</VirtualHost>

[root@cent01 bin]# mkdir /data/wwwroot/111.com/upload/
[root@cent01 bin]# cp -p  /usr/local/apache2.4/htdocs/1.php /data/wwwroot/111.com/upload/   //创建php文件到upload目录
[root@cent01 bin]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@cent01 bin]# /usr/local/apache2.4/bin/apachectl graceful
[root@cent01 bin]# curl -x127.0.0.1:80 111.com/upload/1.php  //返回结果证实未解析
<?php
phpinfo();
?>

针对user_agent做限制
user_agent指的是浏览器,但是这里我们并不是要针对浏览器做限制。而是针对搜索引擎的爬虫。爬虫太多,或者有一种类似于爬虫的cc攻击,都会消耗我们的服务器资源。所以可以通过以下方式进行限制。

<VirtualHost *:80>       
    DocumentRoot "/data/wwwroot/111.com"
    ServerName 111.com
    ServerAlias www.example.com  2111.com.cn  
   <IfModule mod_rewrite.c>  //调用模块
        RewriteEngine on   //打开引擎
        RewriteCond %{HTTP_USER_AGENT}  .*curl.* [NC,OR]  //agent为curl,NC不区分大小写,OR表示或
        RewriteCond %{HTTP_USER_AGENT}  .*baidu.com.* [NC]
        RewriteRule  .*  -  [F]  //规则,forbidden
    </IfModule>
</VirtualHost>

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

[root@cent01 ~]# curl -x127.0.0.1:80 111.com -I  //agent是curl,被禁用
HTTP/1.1 403 Forbidden
[root@cent01 ~]# curl -A "123" -x127.0.0.1:80 111.com -I  //-A模拟agent为123,通过
HTTP/1.1 200 OK
[root@cent01 ~]# curl -A "baidu.com" -x127.0.0.1:80 111.com -I //-A模拟agent为baidu,禁用
HTTP/1.1 403 Forbidden
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值