1 Apache默认虚拟主机
2 Apache用户认证
3 域名跳转
4 Apache访问日志
5 访问日志不记录静态文件
6 访问日志切割
7 静态元素过期时间
扩展
apache虚拟主机开启php的短标签 http://ask.apelearn.com/question/5370
apache日志记录代理IP以及真实客户端IP http://ask.apelearn.com/question/960
apache只记录指定URI的日志 http://ask.apelearn.com/question/981
apache日志记录客户端请求的域名 http://ask.apelearn.com/question/1037
apache 日志切割问题 http://ask.apelearn.com/question/566
1 Apache默认虚拟主机
Windows系统hosts管理
Windows系统中hosts位置“C:\Windows\System32\drivers\etc\hosts”。
用记事本打开该文件:
说明: 在此可以自定义匹配本地IP和域名,目的是添加临时访问地址(在DNS未生效的时候使用)。
添加虚拟主机
在hosts文件中添加“192.168.8.131 www.adai.com”即可将本地虚拟主机添加到Windows系统,访问该域名时会自动解析到本地虚拟主机“ServerName www.example.com:80”。
LinuxApache虚拟主机管理
在物理机访问的域名“www.adai.com”并未在虚拟机Apache配置文件中定义,虚拟机中只定义了“ServerName www.example.com:80”一个域名,该域名即为Apache的默认主机,此时通过任何一个绑定该虚拟机IP的域名进行访问都会跳转到该主机。
因为一台服务器可以跑多个域名,为了方便管理,需要对虚拟主机进行配置:
配置虚拟主机
- 编辑Apache配置文件:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/httpd.conf
……
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
……
说明: 编辑“Virtual hosts(虚拟主机)”的参数,去掉#,启用虚拟主机配置文件“httpd-vhosts.conf”。
注: Apache也支持单独管理每个虚拟主机,配置参数如下:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/httpd.conf
……
# Virtual hosts
Include conf/extra/vhosts/*.conf
……
[root@adailinux ~]# mkdir /usr/local/apache/conf/extra/vhosts
之后在/usr/local/apache/conf/extra/vhosts目录中创建虚拟主机就可以。
- 编辑虚拟主机配置文件
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
该配置文件下每组“< VirtualHost *:80 >”代表一个主机(即:一个网站):
进行如下编辑:
<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-error_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>
此时即定义了一个网站,定义网站的核心参数即为:DocumentRoot(网站根目录)、ServerName(域名)。
注意: 虚拟主机生效后,原Apache配置文件中的默认主机(www.example.com ~ 192.168.8.131)就会失效(在此用www.example.com ~ 111.com进行验证)。
添加虚拟主机相应目录
[root@adailinux ~]# mkdir /data/wwwroot/
[root@adailinux ~]# mkdir /data/wwwroot/abc.com
[root@adailinux ~]# mkdir /data/wwwroot/111.com
在相应目录创建PHP文件:
[root@adailinux ~]# vim /data/wwwroot/abc.com/index.php
<?php
echo "welcome to abc.com";
?>
[root@adailinux ~]# vim /data/wwwroot/111.com/index.php
<?php
echo "welcome to 111.com";
?>
检测、重载Apache配置文件:
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl graceful
虚拟主机测试
在此使用浏览器和curl命令分别进行测试。
如果不在虚拟机中进行本地域名配置(hosts),在进行ping命令测试虚拟主机域名时会访问到外网。
[root@adailinux ~]# ping www.abc.com
PING abc.com (199.181.132.250) 56(84) bytes of data.
如果想在访问“abc.com”时指向到本地虚拟机IP,可以在/etc/hosts文件中指定域名,或者使用curl命令进行访问,如下:
eg:
- curl -x 指定访问端口
[root@adailinux ~]# curl -x192.168.8.131:80 abc.com
welcom to abc.com
注意: 此时访问所有未定义的域名都会将访问地址指向到默认虚拟主机,因为已经自定义添加了虚拟主机,所以此时的默认虚拟主机为配置文件“httpd-vhosts.conf”中的第一个虚拟主机(在此为abc.com),效果如下:
[root@adailinux ~]# curl -x192.168.8.131:80 www.abcde.com
welcom to abc.com
- 使用服务器访问:
注: 使用浏览器访问本地虚拟主机IP时会将IP指向到默认虚拟主机,即 abc.com。
2 Apache用户认证
注意: 本章使用浏览器进行检测的前提是在物理机hosts文件添加虚拟机IP和虚拟主机域名。
配置用户认证
- 编辑虚拟主机配置文件“httpd-vhosts.conf”。
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
……
<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
#设定需要认证的用户为“AuthUserFile”中定义的所有可用用户
</Directory>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
- 创建“httpd-vhosts.conf”中指定的密码文件
[root@adailinux ~]# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd adai
New password:
Re-type new password:
Adding password for user adai
[root@adailinux ~]# cat /data/.htpasswd
adai:$apr1$F7lSqIT0$hEgMT0Nhuxh6.BpmLvi57/
即,在“/data/.htpasswd”为用户adai(自动创建)创建一个使用MD5算法加密的密码文件。
注意: 只有在第一次创建该文件时加-c选项。
- 配置完成后重新加载
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl graceful
- 测试
[root@adailinux ~]# curl -x192.168.8.131:80 111.com -I
HTTP/1.1 401 Unauthorized
Date: Mon, 31 Jul 2017 01:42:50 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
WWW-Authenticate: Basic realm="111.com user auth"
Content-Type: text/html; charset=iso-8859-1
此时提示状态码为“401”,说明当前所访问的内容需要进行用户认证。
使用用户&密码访问:
[root@adailinux ~]# curl -x192.168.8.131:80 -uadai:123456 111.com -I
HTTP/1.1 200 OK
Date: Mon, 31 Jul 2017 02:18:21 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
X-Powered-By: PHP/5.6.30
Content-Type: text/html; charset=UTF-8
状态码“200”,即访问成功。
用浏览器测试:
输入用户名“adai”和密码后即可访问:
htpasswd命令
htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。
语法: htpasswd [option] [参数]
Options:
-c:=create,创建一个加密文件
-n:不更新加密文件,只将更新后的用户名密码显示在屏幕上
-m:使用MD5算法对密码进行加密(默认)
-d:使用CRYPT算法对密码进行加密
-p:不对密码进行加密,即明文密码
-s:使用SHA算法对密码进行加密
-b:在命令行一并输入用户名和密码,而不是根据提示输入密码
-D:删除指定用户
应用
对网站中指定文件设置用户认证!
- 虚拟主机配置
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias 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>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
说明: 注释掉< Directory >,取消对目录设定的用户认证,更改为< FilesMatch>,即对文件设定用户认证。
- 检测
[root@adailinux ~]# curl -x192.168.8.131:80 111.com
welcome to 111.com
[root@adailinux ~]# curl -x192.168.8.131:80 111.com/123.php -I
HTTP/1.1 401 Unauthorized
Date: Mon, 31 Jul 2017 03:04:31 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
WWW-Authenticate: Basic realm="111.com user auth"
Content-Type: text/html; charset=iso-8859-1
说明: 此时可以自由访问“111.com”指定的目录,但是当访问目录下的“123.php”文件时会报错:401,即,需要进行用户认证。
使用指定用户名&密码访问:
[root@adailinux ~]# curl -x192.168.8.131:80 -uadai:123456 111.com/123.php
welcom to 123file
成功!
使用浏览器检测:
访问 “111.com”:
访问"111.com/123.php":
输入指定用户“adai”及密码即可访问:
3 域名跳转
域名跳转分类及区别
种类:
301表示永久跳转;302表示临时跳转。
区别:
- 使用效果不同
- 302跳转是暂时的跳转,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。
- 301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。
- SEO使用方式不同
在搜索引擎优化中302跳转被众多黑帽SEO优化人员追求,对网站进行恶意302跳转至非用户目标访问网站,因此搜索引擎对于网站的302跳转通常是比较不友好,所以要慎用302跳转!
SEO
SEO(Search Engine Optimization)搜索引擎优化,在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的预期目标。
域名跳转配置
- 配置虚拟主机配置文件:httpd-vhosts.conf。
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
……
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
<IfModule mod_rewrite.c>
#需要mod_rewrite的支持
RewriteEngine on
#开启rewrite功能
RewriteCond %{HTTP_HOST} !^111.com$
#Cond=condition,定义rewrite条件:所有非111.com的主机名(域名)
RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]
#定义rewrite规则:当满足上面条件时才执行当前规则,即跳转到111.com。
</IfModule>
ErrorLog "logs/111.com-error_log"
CustomLog "logs/111.com-access_log" common
</VirtualHost>
- 检查系统配置:
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -M
在此检查Apache是否加载了虚拟主机配置中调用的rewrite模块,如果没有加载,需要编辑Apache配置文件“httpd.conf”:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/httpd.conf
……
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module modules/libphp5.so
#LoadModule php7_module modules/libphp7.so
即,去掉注释符号“#”,加载rewrite模块。
- 检测
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite
rewrite_module (shared)
使用curl检测:
[root@adailinux ~]# curl -x192.168.8.131:80 www.example.com -I
HTTP/1.1 301 Moved Permanently
Date: Mon, 31 Jul 2017 07:17:37 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Location: http://111.com/
Content-Type: text/html; charset=iso-8859-1
此时,状态码为301,即设定了域名永久跳转!
在浏览器进行检测时,访问“www.example.com”会直接跳转到“111.com”。
4 Apache访问日志
日志文件所在位置:
[root@adailinux ~]# ls /usr/local/apache2.4/logs
111.com-access_log abc.com-access_log access_log httpd.pid
111.com-error_log abc.com-error_log error_log
自定义日志格式
系统自带日志格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
#h表示host来源IP,l表示login用户,u表示user用户密码,t表示time时间,r表示request(行为),s表示status状态码,b表示byte大小
#user-agent:用户代理
#referer:跳转到当前位置的上一个网址(即:提供当前IP的网站)
即:有combine和common两种格式,默认使用common模式。
配置日志格式
编辑虚拟主机配置文件“httpd-vhosts.conf”:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
<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" combined
</VirtualHost>
说明: 将日志文件后面原有 common改为combined。
重新加载:
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux ~]# /usr/local/apache2.4/bin/apachectl graceful
样式:
[root@adailinux ~]# cat /usr/local/apache2.4/logs/111.com-access_log
Apache虚拟主机开启PHP短标签
在虚拟主机配置文件中加入如下内容即可:
php_admin_flag short_open_tag on
短标签作用
如果不开启短标签,服务器将无法解析如下形式的PHP文件:
<?
phpinfo()
?>
而只能解析:
<?php
phpinfo()
?>
这种形式的PHP文件。
5 访问日志不记录静态文件
编辑虚拟主机配置文件“httpd-vhosts.conf”:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
……
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
<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"
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
SetEnvIf Request_URI ".*\.css$" img
#以上为定义变量:将所有关于图片的请求定义为变量img
CustomLog "logs/111.com-access_log" combined env=!img
#“env=!img”表示非img变量。本行命令的含义是:不记录关于变量img的请求日志。
</VirtualHost>
说明: 将所有访问图片的请求定义为变量img,在访问记录(日志)中将其排除即可。重新加载后使用curl访问img变量中所指定格式的文件内容时将不会产生访问记录。
6、访问日志切割
配置
编辑虚拟主机配置文件:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
……
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
<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"
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
SetEnvIf Request_URI ".*\.css$" img
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
#使用rotatelogs工具,以系统时间为基准,每天切割一次日志,并且日志名字格式为“111.com-access_%Y%m%d.log”。
#每小时切割一次日志,语法:
#CustomLog "|/usr/local/apache2.4/bin/rotatelogs logs/access_%Y%m%d%H.log 3600" combined
说明: rotatelogs是Apache切割日志的工具;-l表示使用系统(CST=Chinese time)时间,如果加-l选项,将以默认的(UTC)时间为准;日志文件名“%Y%m%d”表示年月日;时间间隔设定为一天(1day=24h=1440min=86400s)。
检测
- 重载配置文件:
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful
- 访问、检测日志:
[root@adailinux ~]# curl -x192.168.8.131:80 111.com/http.jpg -I
[root@adailinux 111.com]# ls /usr/local/apache2.4/logs/
111.com-access_20170801.log 111.com-error_log abc.com-error_log error_log
111.com-access_log abc.com-access_log access_log httpd.pid
说明: 配合计划任务使用,定期清理日志文件,避免日志文件累计导致磁盘空间不足。
7 静态元素过期时间
当浏览器访问网站时会把静态文件(如图片文件、css、js文件等)缓存到本地电脑,这样下次访问的时候就不用去远程下载了,可以自定义清除该部分缓存的时间,即设定静态元素过期时间。该设置可用于优化网站,特别是公司内网。
配置
编辑虚拟主机配置文件:
[root@adailinux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
……
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/111.com"
ServerName 111.com
ServerAlias www.example.com
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^111.com$
RewriteRule ^/(.*)$ http://111.com/$1 [R=301,L]
</IfModule>
<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>
ErrorLog "logs/111.com-error_log"
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
SetEnvIf Request_URI ".*\.css$" img
CustomLog "|usr/local/apache2.4/bin/rotatelogs -l logs/111.com-access_%Y%m%d.log 86400" combined env=!img
#使用rotatelogs工具,以系统时间为基准,每天切割一次日志,并且日志名字格式为“111.com-access_%Y%m%d.log”。
说明: 在配置文件添加mod_expires.c模块内容,其余不变。
检测
检测语法错误:
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
检测Apache配置文件是否开启expire模块:
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl -M |grep expires
说明: 在此未检测到expires模块,所以需要编辑Apache配置文件,加载expires模块。
配置Apache,加载expires模块
编辑Apache配置文件:
[root@adailinux 111.com]# vim /usr/local/apache2.4/conf/httpd.conf
LoadModule expires_module modules/mod_expires.so
加载配置文件:
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl graceful
检查模块是否开启:
[root@adailinux 111.com]# /usr/local/apache2.4/bin/apachectl -M |grep expires
expires_module (shared)
说明: 输入“/”查找expires模块,并开启加载该模块的命令行(去掉#即可)。
再次检测
[root@adailinux 111.com]# curl -x192.168.8.131:80 111.com/baidu.png -I
HTTP/1.1 200 OK
Date: Tue, 01 Aug 2017 10:17:36 GMT
Server: Apache/2.4.27 (Unix) PHP/5.6.30
Last-Modified: Tue, 01 Aug 2017 10:13:45 GMT
ETag: "e7a-555ae670b0840"
Accept-Ranges: bytes
Content-Length: 3706
Cache-Control: max-age=86400
Expires: Wed, 02 Aug 2017 10:17:36 GMT
Content-Type: image/png
说明: 当前时间“Date: Tue, 01 Aug 2017 10:17:36 GMT”,缓存时长“Cache-Control: max-age=86400s”,失效时间“Expires: Wed, 02 Aug 2017 10:17:36 GMT”,即png格式图片缓存时长为1天。