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

时间:2021-02-07 12:47:39

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