Apache默认虚拟主机
- 一台服务器可以访问多个网站,每个网站都是一个虚拟主机
- 虚拟主机,可以理解成httpd服务下面跑了多个网站或者域名。
- 概念;域名(主机名) 、DNS、解析域名、hosts
- 任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机
定义windows定义hosts
C:\windows\System32\drivers\etc\hosts
定义一个ip,定义多个域名,用域名访问ip
在浏览器上输入www.abc.com www.123.com 111.com就可以访问的,但是并没有在apache的配置文件中去定义它,仅仅定义了ServerName www.example.com:80,apache的默认主机。任何域名,只要指向这个IP地址,都会访问到这个站点(默认虚拟主机)
设置虚拟主机
如果想设置多个域名指向多个网页就需要设置虚拟主机
编辑配置文件 vi /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>
ServerAdmin webmaster@dummy-host.example.com //定义管理员的邮箱。可以删除
DocumentRoot "/data/wwwroot/abc.com" //定义网站的根目录路径 (核心)
ServerName www.abc.com // 指定域名。这里只支持写一个。(核心)
ServerAlias abc.com www.123.com //定义别名
ErrorLog "logs/abc.com-error_log" //指定错误日志
CustomLog "logs/abc.com-access_log" common //指定访问日志
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
创建目录
mkdir /data/wwwroot/ mkdir /data/wwwroot/abc.com mkdir /data/wwwroot/111.com
编辑一个php文件
vim /data/wwwroot/abc.com/index.php //写入<?php echo "abc.com";
?> vim /data/wwwroot/111.com/index.php //写入 <?php echo"111.com";
?>
curl命令的用法
curl -x192.168.217.129:80 abc.com //指定到192.168.244.128访问abc.com 。它是虚拟主机配置文件中的第一个主机,也就是默认虚拟主机。
curl -x192.168.217.129:80 www.example.com //则会访问到第二个虚拟主机 111.com
-u:用户:密码
curl -x127.0.0.1:80 -ulioo:12345 111.com
-i 状态码
curl -A “123123” //指定用户代理USER_AGENT
curl -e “http://www………..” //指定网址代理 referer
curl -x 相当于忽略hosts // 指定主机host
curl ……………. -I // 查看状态码
200正常 301永久重定向 302临时重定向 401用户认证 403禁止访问 404错误页面
总结1:在主配置文件中/usr/local/apache2.4/conf/httpd.conf打开了虚拟主机配置文件Include conf/extra/httpd-vhosts.conf(去掉注释就是打开),虚拟主机配置文件生效后主配置文件中定义的ServerNmae 和DocumentRoot就会失效。 默认打开就是虚拟主机中的网址
总结2:虚拟主机配置文件一旦打开,可以定义很多的virtuaHost。每个virtuaHost都会有一个DocumentRoot和ServerName(可以写多个)。每一个virtuaHost都代表一个站点,都是一个虚拟主机。默认虚拟主机比较特殊,任何域名解析到这个IP上都会访问这个默认虚拟主机的ServerNmae。
Apache用户认证
需求1:打开网址让你输入用户名密码才能登陆
1.编辑配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
修改第二个host
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
<Directory /data/wwwroot/111.com> //指定认证的目录
AllowOverride AuthConfig //这个相当于打开认证的开关
AuthName "111.com user auth" //自定义认证的名字,作用不大
AuthType Basic //认证的类型,一般为Basic
AuthUserFile /data/.htpasswd //指定密码文件所在目录
require valid-user //指定需要认证的用户为全部可用用户
</Directory>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
2.创建密码文件
/usr/local/apache2.4/bin/htpasswd -m /data/.htpasswd lioo
-c表示创建 -m表示使用md5的加密类型 /data/.htpasswd表示密码文件所在位置 zchuny表示用户名,这里可不写useradd 创建第二个用户是就不用加-c 了
cat /data/.htpasswd //这里可以看到输入。冒号左边是用户名,右边是加密字符串
3.重新加载服务
/usr/local/apache2.4/bin/apachectl -t 检查错误 /usr/local/apache2.4/bin/apachectl graceful 重新加载
测试
浏览器输入网址111.com (需要把111.com绑定到windows的hosts里)会提示需要进行身份验证。输入之前设置的账号密码
curl -x127.0.0.1:80 111.com -I 显示401需要密码认证
需求2:针对单个文件进行认证。
1.修改第2台虚拟主机修改为以下内容
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
# <Directory /data/wwwroot/111.com>
<FilesMatch 123.php> //匹配到123.php文件后才会去执行下面的操作
AllowOverride AuthConfig
AuthName "111.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</FilesMatch>
# </Directory>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
2.重新加载
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
3. 编辑 一个查看需要密码的php文件
vim /data/wwwroot/111.com/123.php //写入
<?php
echo "123.php";
发现不用账号密码也显示200正常
但是访问111.com/123.php 就又显示401需要账号密码了
域名跳转
301永久重定向 302临时重定向
1. 修改虚拟主机配置文件中编辑第二台虚拟主机
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com 2111.com.cn //2111.com.cn写到windows的hosts里
<IfModule mod_rewrite.c> //需要mod_Rewrite模块支持
RewriteEngine on //打开Rewrite功能
RewriteCond %{HTTP_HOST} !^111.com$ //定义Rewrite的条件,主机名(域名)不是www.123.com的满足条件
RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L] //定义Rewrite规则,当满足上面的条件时,这条规则才会执行 。L表示只跳一次。
</IfModule>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
2. 测试之前检查apache是否加载了rewrite模块,如果没有加载。可以在配置文件中打开它,将#LoadModule rewrite_module modules/mod_rewrite.so这行的#号去掉即可。 再次加载配置文件查看是否已加载
3.重新加载
加载前需要把2111.com.cn绑定到windows的hosts里
/usr/local/apache2.4/bin/apachectl -t
/usr/local/apache2.4/bin/apachectl graceful
4. 访问 curl -x127.0.0.1:80 2111.com.cn -I 显示301
5.状态码含义
404:表示页面不存在
301:永久跳转,提升权重
302: 临时跳转,不会增加权重
401:用户名密码验证。验证不对是401,验证正确为200
403:在配置文件中granted表示授权,允许访问。状态码为200
denied表示不允许访问。这是会出现403
403:修改配置文件vi /usr/local/apache2.4/conf/httpd.conf 中granted表示授权,允许访问。状态码为200
denied表示不允许访问。这是会出现403
<Directory /> AllowOverride none Require all granted </Directory>
Apache访问日志
1. 访问日志作用很大,不仅可以记录网站的访问情况,还可以在网站有异常发生时帮助我们定位问题。比如有攻击时,是可以通过查看日志看到一些规律。
2. 之前操作的第2台虚拟主机的访问日志是定义在/usr/local/apache2.4/logs/目录下,可以看到111.com-access_log(访问日志)和111.com-error_log(错误日志)。通过cat来查看访问日志,可以看到其中”HEAD”是因为使用curl命令加上-I后只出现状态码而产生的。而GET则是使用curl不加-I选项后产生的。还可以看到来源IP ,访问时间,访问的域名,行为,HTTP的版本。状态码。
3. 定义日志格式
在apache的主配置文件/usr/local/apache2.4/conf/httpd.conf中,
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined ///User-Agent表示用户代理,用户通过浏览器获取到网站的内容 Referer记录你的浏览器上次访问的网址是什么。 LogFormat "%h %l %u %t \"%r\" %>s %b" common //默认使用这个
4.在更改虚拟主机配置文件将CustomLog "logs/111.com-access_log" common
//最后的common改为combined
5.加载配置文件
6.再次curl后去查看访问日志的格式已经发生了变化
访问日志不记录静态文件
网站静态文件,如图片、css、js等元素可以不用记录
1. 修改虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
</IfModule>
ErrorLog "logs/111.com-error_log"
SetEnvIf Request_URI ".*\.gif$" img //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
SetEnvIf Request_URI ".*\.css$" img
CustomLog "logs/111.com-access_log" combined env=!img //env=!img表示将img标签的全部排除,不用进行记录
</VirtualHost>
2. 重新加载配置文件
/usr/local/apache2.4/bin/apachectl graceful
在访问jpg png 等图片就不会记录日志了
3. 在111.com/目录下上传一张图片
curl -x127.0.0.1:80 111.com/timg.jpg -I 显示200日志里也不会记录
将配置文件中加入的 env=!img删除,重新加载配置文件后,
将配置文件中加入的 env=!img删除,重新加载配置文件后,再去访问那个图片就可以在访问日志中看到。在访问日志中看到
访问日志切割
1. 修改虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
修改最后一行
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
//%y%m%d以年月日命名,86400秒即1天切割一次。rotatelogs是apache的切割日志工具。
2. 重新加载配置文件
/usr/local/apache2.4/bin/apachectl graceful
3. curl -x127.0.0.1:80 111.com/123.php
去访问网址下php得文件(其它图片之前禁止记录日志了)之后可以看到在 ls /usr/local/apache2.4/logs/ 目录下生成一个带有当前日期的日志文件了。以后只要到了00:00时就会重新生成一个日志文件了。
4. 做一个任务计划,将超过一定时间的文件删除掉,因为日志分割只是分成了多个文件方便查看 但是还是会将磁盘写满
配置静态元素过期时间
浏览器访问网站的图片时会把静态的文件缓存在本地电脑里,这样下次再访问时就不用去远程下载了
1. 修改虚拟主机配置文件
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加
<IfModule mod_expires.c>
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>
2. 打开主配置文件的expires模块
vi /usr/local/apache2.4/conf/httpd.conf 去掉#号注释
重新加载配置文件 检查模块是否打开
/usr/local/apache2.4/bin/apachectl graceful
/usr/local/apache2.4/bin/apachectl -M |grep expires
4.上传一个log.jpg的图片 /data/wwwroot/111.com/log.jpg
重启配置文件 /usr/local/apache2.4/bin/apachectl graceful
最后访问这个图片 curl -x127.0.0.1:80 111.com/log.jpg -I
DaTa;当前时间
Expires : 过期时间
cache-control:缓存多少秒
没有打开expires模块看不到这些信息的