Apache默认虚拟主机
默认虚拟主机,可以理解成Apache(也就是httpd),一个服务下面跑多了多个网站,跑了多个域名 - 例子,假如在服务器上,它既能访问百度,又能访问谷歌,这是两个不同的网站,但同时都在一台服务器运行着,就用了一个httpd的服务,这个就是一个网站多个域名,每一个域名对着一个虚拟主机
-
一台服务器可以访问多个网站,每个网站都是一个虚拟主机
-
概念:域名(主机名)、DNS、解析域名、hosts
-
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机
配置如下:
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/httpd.conf
//搜索httpd-vhost,去掉#
# Virtual hosts
Include conf/extra/httpd-vhosts.conf
vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf //改为如下
<VirtualHost *:80>
ServerAdmin harry@harrylinux.com
DocumentRoot "/data/wwwroot/harry.com"
ServerName harry.com
ServerAlias www.harry.com
ErrorLog "logs/haryy.com-error_log"
CustomLog "logs/harry.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
//启动apache
[root@harry-01 data]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@harry-01 data]# /usr/local/apache2.4/bin/apachectl graceful
httpd not running, trying to start
[root@harry-01 data]# /usr/local/apache2.4/bin/apachectl start
httpd (pid 2291) already running
[root@harry-01 data]# /usr/local/apache2.4/bin/apachectl graceful
[root@harry-01 data]#
更改hosts :
hosts的作用:它的目的就是让你临时访问到一个服务器上去
可以在这个里面定义一个IP,定义一个域名,然后让这个域名指向到这个IP上去
格式: 192.168.31.137 www.haryy.com
192.168.31.137 www.123.com
物理机去ping 网址,能看到都能ping通
然后用物理机中的浏览器去访问www.abc.co测试虚拟主机m或www.123.com 出现了403错误 没有权限进入这台服务器。
第一步:
apache主配置文件修改:
用文本编辑器打开apache的conf目录下 httpd.conf
将下面以下代码取消注释
LoadModule rewrite_module modules/mod_rewrite.so
Include conf/extratpd-vhosts.conf
第二步:
httpd-vhosts.conf文件修改
<VirtualHost *:80>
ServerAdmin harry@harrylinux.com
DocumentRoot "/data/wwwroot/harry.com" //虚拟主机根目录
ServerName harry.com
ServerAlias www.harry.com
ErrorLog "logs/haryy.com-error_log"
CustomLog "logs/harry.com-access_log" common
<Directory "/data/wwwroot/harry.com/"> //目录权限
Options FollowSymLinks Indexes
AllowOverride none
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com" //虚拟主机根目录
ServerName www.123.com
<Directory "/data/wwwroot/www.123.com/"> //目录权限
Options FollowSymLinks Indexes
AllowOverride none
Order deny,allow
Allow from all
然后在虚拟的根目录下创建测试文件
<?php
phpinfo()
?>
测试虚拟主机
curl -x命令
假如现在要访问harry.com,若不去绑定hosts,那么在虚拟机中ping www.abc.com会ping到外网上去,并没有在这台机器上。若想要访问harry.com在在这台机器上,可以编辑/etc/hosts文件去指定下,或者使用curl -x选项
默认虚拟主机,就是无论访问什么域名,只要解析到192.168.31.137IP上,它都会访问这个网站对应的虚拟主机配置
在主配置文件中,httpd.conf里面,打开了虚拟主机配置文件,也就是删除到 # 号,那虚拟主机配置就生效了,一旦虚拟主机配置文件生效,那主配置文件里面所定义的DocumentRoot以及ServerName失效
虚拟主机配置文件一旦打开,可以定义很多个VirtualHost,每一个VirtualHost都都有一个对应的 DocumentRoot 和 ServerName ,每一个VirtualHost都代表着一个站点,都是一个虚拟主机。在虚拟主机里面有一个特殊的默认虚拟主机,所谓默认虚拟主机就是无论任何域名解析到这个IP上,都会去访问默认虚拟主机
Apache用户认证
配置用户认证
编辑虚拟主机配置文件“httpd-vhosts.conf 内容如下:
<VirtualHost *:80>
ServerAdmin harry@harrylinux.com
DocumentRoot "/data/wwwroot/harry.com"
ServerName harry.com
ServerAlias www.harry.com
ErrorLog "logs/haryy.com-error_log"
CustomLog "logs/harry.com-access_log" common
<Directory "/data/wwwroot/harry.com/"> #指定认证的目录
Options FollowSymLinks Indexes
AllowOverride AuthConfig #该行相当于打开用户认证的开关
AuthType Basic #认证类型,一般为basic
AuthUserFile /data/.htpasswd #指定密码文件所在位置(需要手动添加)
require valid-user #设定需要认证的用户为“AuthUserFile”中定义的所有可用用户
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
创建“httpd-vhosts.conf”中指定的密码文件
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
[root@harry-01 ~]# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd 123
New password:
Re-type new password:
Adding password for user 123
[root@harry-01 ~]# [root@harry-01 ~]# cat /data/.htpasswd
123:$apr1$4AdnPKdh$nz.3JkuXn0cAooEyD0FrS1
[root@harry-01 ~]#
在“/data/.htpasswd”为用户adai(自动创建)创建一个使用MD5算法加密的密码文件。注意: 只有在第一次创建该文件时加-c选项。
配置完成后重新加载
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@harry-01 ~]#
测试。此时提示状态码为“401”,说明当前所访问的内容需要进行用户认证。
[root@harry-01 ~]# curl -x192.168.31.137:80 haryy.com -I
HTTP/1.1 401 Unauthorized
Date: Mon, 03 Dec 2018 20:03:19 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="harry.com user auth"
Content-Type: text/html; charset=iso-8859-1
使用用户&密码访问:
[root@harry-01 ~]# curl -x192.168.31.137:80 -uharry:123 haryy.com -I
HTTP/1.1 200 OK
Date: Mon, 03 Dec 2018 20:02:45 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Content-Type: text/html;charset=ISO-8859-1
状态码“200”,即访问成功
用浏览器测试:
对网站中指定文件设置用户认证!
虚拟主机配置如下:
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
内容如下:
<VirtualHost *:80>
ServerAdmin harry@harrylinux.com
DocumentRoot "/data/wwwroot/harry.com"
ServerName harry.com
ServerAlias www.harry.com
ErrorLog "logs/haryy.com-error_log"
CustomLog "logs/harry.com-access_log" common
<Directory "/data/wwwroot/harry.com/">
AllowOverride AuthConfig
AuthName "harry.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
Options FollowSymLinks Indexes
Order deny,allow
Allow from all
</Directory>
检测:
[root@harry-01 ~]# curl -x192.168.31.137:80 harry.com/1.php -I
HTTP/1.1 401 Unauthorized
Date: Mon, 03 Dec 2018 20:21:34 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
WWW-Authenticate: Basic realm="harry.com user auth"
Content-Type: text/html; charset=iso-8859-1
[root@harry-01 ~]# curl -x192.168.31.137:80 -uharry:123 harry.com/1.php -I
HTTP/1.1 200 OK
Date: Mon, 03 Dec 2018 20:22:07 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
X-Powered-By: PHP/5.6.32
Content-Type: text/html; charset=UTF-8
htpasswd命令
语法: htpasswd [option] [参数]
-c:=create,创建一个加密文件
-n:不更新加密文件,只将更新后的用户名密码显示在屏幕上
-m:使用MD5算法对密码进行加密(默认)
-d:使用CRYPT算法对密码进行加密
-p:不对密码进行加密,即明文密码
-s:使用SHA算法对密码进行加密
-b:在命令行一并输入用户名和密码,而不是根据提示输入密码
-D:删除指定用户
域名跳转
域名跳转分类及区别
种类:
301表示永久跳转;302表示临时跳转。
区别:
使用效果不同
- 302跳转是暂时的跳转,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。
- 301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址
SEO使用方式不同
在搜索引擎优化中302跳转被众多黑帽SEO优化人员追求,对网站进行恶意302跳转至非用户目标访问网站,因此搜索引擎对于网站的302跳转通常是比较不友好,所以要慎用302跳转!
SEO
SEO(Search Engine Optimization)搜索引擎优化,在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的预期目标。
域名跳转配置
配置虚拟主机配置文件:httpd-vhosts.conf
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
<IfModule mod_rewrite.c>
#需要mod_rewrite的支持
RewriteEngine on
#开启rewrite功能
RewriteCond %{HTTP_HOST} !^www.123.com$
#Cond=condition,定义rewrite条件:所有非111.com的主机名(域名)
RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
#定义rewrite规则:当满足上面条件时才执行当前规则,即跳转到111.com。
</IfModule>
ErrorLog "logs/111.com-error_log"
Customlog "logs/111.com-access_log" common
<Directory "/data/wwwroot/www.123.com/">
Options FollowSymLinks Indexes
AllowOverride none
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
检查系统配置:
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl -M
#在此检查Apache是否加载了虚拟主机配置中调用的rewrite模块,如果没有加载,需要编辑Apache配置文件“httpd.conf”
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule php5_module modules/libphp5.so
使用curl检测:
[root@harry-01 ~]# curl -x192.168.31.137:80 www.example.com -I
HTTP/1.1 301 Moved Permanently
Date: Tue, 04 Dec 2018 05:18:47 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Location: http://www.123.com/
Content-Type: text/html; charset=iso-8859-1
[root@harry-01 ~]#
此时,状态码为301,即设定了域名永久跳转!
在浏览器进行检测时,访问“www.example.com”会直接跳转到“www.123.com”
访问日志
日志文件所在位置:/usr/local/apache2.4/logs
自定义日志格式
系统自带日志格式:combined common
默认使用common模式。
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的网站)
配置日志格式
编辑虚拟主机配置文件“httpd-vhosts.conf”
将日志文件后面原有 common改为combined。
<VirtualHost *:80>
ServerAdmin harry@harrylinux.com
DocumentRoot "/data/wwwroot/harry.com"
ServerName harry.com
ServerAlias www.harry.com
ErrorLog "logs/haryy.com-error_log"
CustomLog "logs/harry.com-access_log" combined
<Directory "/data/wwwroot/harry.com/">
AllowOverride AuthConfig
AuthName "harry.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
Options FollowSymLinks Indexes
Order deny,allow
Allow from all
</Directory>
重新加载后查看样式:
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@harry-01 ~]# cat /usr/local/apache2.4/logs/harry.com-access_log
访问日志不记录静态文件
编辑虚拟主机配置文件“httpd-vhosts.conf”
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
ServerAlias www.example.com
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.123.com$
RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
</IfModule>
ServerName www.123.com
ServerAlias www.example.com
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.123.com$
RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
</IfModule>
RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L]
</IfModule>
ErrorLog "logs/www.123.com-error_log"
setEnvIf Request_URI ".*\.gif$" img
setEnvIf Request_URI ".*\.jpg$" img
setEnvIf Request_URI ".*\.bmp$" img
setEnvIf Request_URI ".*\.swf$" img
setEnvIf Request_URI ".*\.js$" img
setEnvIf Request_URI ".*\.css$" img
#以上为定义变量:将所有关于图片的请求定义为变量img
Customlog "logs/www.123.com-access_log" combined
#“env=!img”表示非img变量。本行命令的含义是:不记录关于变量img的请求日志。
<Directory "/data/wwwroot/www.123.com/">
Options FollowSymLinks Indexes
AllowOverride none
Order deny,allow
Allow from all
</Directory>
</VirtualHost>
将所有访问图片的请求定义为变量img,在访问记录(日志)中将其排除即可。重新加载后使用curl访问img变量中所指定格式的文件内容时将不会产生访问记录
访问日志切割
日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件
把虚拟主机配置文件改成如下:
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
更改CustomLog配置
1.首先指定一个工具rotatelogs
2.在定义一个日志的名称%Y%m%d
3.规定时间去生成,时间段就为1天,换算成秒,就是86400秒
CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/123.com-access_%Y%m%d.log 86400" combined env=!img
rotatelogs工具,它是Apache自带的一个切割工具
-l参数,目的是以当前系统时间为基准。如果不指定 -l ,那么就会指定 UTC时间 的格式去切割日志
在中国是 CST,在美国是 UTC ,两者时区不同
定义日志的名称,因为是切割的,所以根据时间日期让它自动变,就需要加一个变量%Y%m%d
- %Y,表示 年
- %m,表示 月
- %d,表示 日
按规定时间去生成,时间段为1天,换算成秒,就是86400秒
查看配置文件语法有无错误,并重新加载配置文件
这时候还需要去做一些访问,因为还没有任何的日志生成,在这个目录下还没有生成一个新的文件
[root@harry-01 ~]# ls /usr/local/apache2.4/logs/
access_log error_log harry.com-access_log haryy.com-error_log httpd.pid www.123.com-access_log www.123.com-error_log
#用curl命令访问
[root@harry-01 ~]# curl -x192.168.31.137:80 www.123.com/1.php
#这时候会看到一个以日期为后缀的新日志文件
[root@harry-01 ~]# ls /usr/local/apache2.4/logs/
access_log harry.com-access_log httpd.pid www.123.com-access_log
error_log haryy.com-error_log www.123.com-access_20181204.log www.123.com-error_log
查看新生成的日志文件内容,会看到就是刚刚curl命令访问的
配置静态元素过期时间
静态元素,就是访问的图片、css、js
当用浏览器去访问一个网站的时候,这个网站里所有的静态文件(比如图片的样式、js),浏览器就会默认把静态文件缓存在电脑里,叫做临时的目录或目录
缓存的时间是在服务器上定义的,如果不去定义,那么浏览器也不会把这些文件清空,或者浏览器有自己的机制去清空这些文件,或者说电脑软件会定时帮你清理这些缓存的文件
为什么电脑会自动加载这些静态文件呢?目的就是第二次,第三次访问的时候,不去服务器去下载这些静态文件了
定义静态文件失效日期
启用expires_module模块,定义失效日期
打开虚拟主机配置文件vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf,并添加配置文件
- 这里有所有的图片定义成一天
- 所有的 css 和 js 都定义成两小时
- 其他的没有任何的缓存
[root@harry-01 ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<IfModule mod_expires.c>
ExpiresActive on #打开该功能的开关
ExpiresByType image/gif "access plus 1 days" #定义Type类型,这里是一天
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>
然后检查是否存在语法错误
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@harry-01 ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@harry-01 ~]#
按ctrl+F5可以强制把浏览器本地的缓存清空
用curl命令去访问图片
[root@harry-01 ~]# curl -x192.168.31.137:80 www.123.com/sugar.jpg -I
HTTP/1.1 200 OK
Date: Tue, 04 Dec 2018 13:57:16 GMT #当前时间
Server: Apache/2.4.33 (Unix) PHP/5.6.32
Last-Modified: Tue, 04 Dec 2018 12:17:46 GMT
ETag: "26bfc-57c3140cd6e80"
Accept-Ranges: bytes
Content-Length: 158716
Cache-Control: max-age=86400 #缓存的时间
Expires: Wed, 05 Dec 2018 13:57:16 GMT #过期时间
Content-Type: image/jpeg