LAMP架构(2)

 一.Apache默认虚拟主机

一台服务器可以访问多个网站,每个网站都是一个虚拟主机 
概念:域名(主机名)、DNS、解析域名、hosts 
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机

默认虚拟主机,可以理解成Apache(也就是httpd),一个服务下面跑多了多个网站,跑了多个域名 - 例子,假如在服务器上,它既能访问百度,又能访问谷歌,这是两个不同的网站,但同时都在一台服务器运行着,就用了一个httpd的服务,这个就是一个网站多个域名,每一个域名对着一个虚拟主机。比如我们可以修改window系统上的hosts文件来将我们前面跑的服务做一个本地域名映射:

1.hosts文件路径:C:\Windows\System32\drivers\etc\hosts

2.以文本方式打开hosts文件,添加一行:115.181.80.209 www.123.com www.abc.com (一个ip可以指定多个域名)

3.保存后在浏览器上访问www.abc.com  或者www.123.com,都会访问到115.181.80.209这个服务器上。

4.或许会有一个疑问,www.123.com和www.abc.com,包括这个IP并没有在httpd的配置文件中去定义它,在配置文件中仅仅定义了 www.example.com这个域名,这个叫做Apache的默认主机 ,也就是说,任何一个域名,指向到这个 IP ,它都会访问到这个站点,这个站点就叫做默认虚拟主机——>注意:是虚拟主机

配置虚拟主机:

如果没有做任何操作,仅仅使用了httpd.conf,它实际上就是主配置文件定义的这个ServerName,以及DocumentRoot ,但这样不太好管理,毕竟一台服务器上可以跑多个域名,若不想域名都指向到这里,所以需要打开一个虚拟主机配置文件

  • 打开虚拟主机,在/usr/local/apache2.4/conf/httpd.conf 配置文件中:
[root@xzl-linux:~]# vim /usr/local/apache2.4/conf/httpd.conf  //修改httpd配置文件

# Virtual hosts
# Include conf/extra/httpd-vhosts.conf  //将这行的注释取消掉,使虚拟主机生效
  • 因为配置文件仅仅能定义一个ServerName,所以现在还需要打开二级配置文件
[root@xzl-linux ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf     //虚拟主机配置文件

在打开配置文件,会发现有两个<VirtualHost *:80> ,每一个<VirtualHost >都是一对出现的,每一个<VirtualHost >都代表着一个主机,一个主机就是一个网站

<VirtualHost *:80>
    ServerAdmin [email protected]    //定义管理员的邮箱——>可删除
    DocumentRoot "/usr/local/apache2.4/docs/dummy-host.example.com"    //定义网站的根目录在哪里
    ServerName dummy-host.example.com    //服务器名字
    ServerAlias www.dummy-host.example.com    //定义别名,别名就是一个网站可以有多个域名访问,比如可以是abc.com访问,也可以是www.abc.com访问,访问的内容是一致的
    ErrorLog "logs/dummy-host.example.com-error_log"    //错误日志
    CustomLog "logs/dummy-host.example.com-access_log" common    //访问日志
</VirtualHost>
<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/usr/local/apache2.4/docs/dummy-host2.example.com"
    ServerName dummy-host2.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>

在打开虚拟主机配置文件后,做一个更改

更改后:

<VirtualHost *:80>
    DocumentRoot "/data/wwwroot/abc.com"   
    ServerName www.abc.com
    ServerAlias www.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 www.111.com
    ServerAlias www.example.com        //验证
    ErrorLog "logs/111.com-error_log"
    CustomLog "logs/111.com-access_log" common
</VirtualHost>
然后保存退出
  • 更改完配置文件,就去创建对应的目录
[root@xzl-linux:~]# mkdir /data/wwwroot/
[root@xzl-linux:~]# mkdir /data/wwwroot/abc.com
[root@xzl-linux:~]# mkdir /data/wwwroot/111.com
  • 在对应的站点根目录下创建,定义一个php
[root@xzl-linux:~]# vim /data/wwwroot/abc.com/index.php

在文件中写入:
<?php
echo "abc.com";
  • 然后在/data/wwwroot/111.com/index.php中也定义一个php
[root@xzl-linux:~]# vim /data/wwwroot/111.com/index.php

在文件中写入:
<?php
echo "111.com";
  • 检查服务是否有错误并重新加载配置文件
[root@xzl-linux:~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@xzl-linux:~]# /usr/local/apache2.4/bin/apachectl graceful
  • 定义一个网站最核心的参数就是网站的根目录在哪里,访问的域名是什么,ServerName只能写一个,而ServerAlias可以写多个域名
  • 一旦让虚拟主机配置文件生效了,那么之前定义的www.example.com就会失效了

测试虚拟主机:

  • curl -x命令

比如说,现在要访问abc,com,若不去绑定hosts,那么在虚拟机中ping www.abc.com会ping到外网上去,并没有在这台机器上。若想要访问abc.com在这台机器上,可以编辑/etc/hosts文件去指定下,或者使用curl -x选项

[root@xzl-linux ~]# curl -x127.0.0.1:80 www.abc.com
abc.com[root@xzl-linux ~]# curl -x127.0.0.1:80 www.abcd.com
abc.com[root@xzl-linux ~]# curl -x115.181.80.209:80 www.abcde.com
abc.com[root@xzl-linux ~]# 

在访问abcd.com,会发现访问的还是abc.com,这个之前无论把任何域名指向到115.181.80.209这台机器上,都会访问到htdocs目录下面去,但现在发生了转变,无论什么域名指向过来,它都会访问到abc.com,abc.com是我们虚拟主机配置文件里边的第一个虚拟主机,它就是默认虚拟主机。

  • 这时再来访问www.example.com
abc.com[root@xzl-linux ~]# curl -x192.168.74.129:80 www.example.com
111.com[root@xzl-linux ~]# 

在httpd主配置文件中有定义,在Virtual hosts虚拟主机中也有定义,结果访问到了111.com

总结

  1. 在主配置文件中,httpd.conf里面,打开了虚拟主机配置文件,也就是删除到 # 号,那虚拟主机配置就生效了,一旦虚拟主机配置文件生效,那主配置文件里面所定义的DocumentRoot以及ServerName失效
  2. 虚拟主机配置文件一旦打开,可以定义很多个VirtualHost,每一个VirtualHost都都有一个对应的 DocumentRoot 和 ServerName ,每一个VirtualHost都代表着一个站点,都是一个虚拟主机。在虚拟主机里面有一个特殊的默认虚拟主机,所谓默认虚拟主机就是无论任何域名解析到这个IP上,都会去访问默认虚拟主机

二.Apache用户认证

本章使用浏览器进行检测的前提是在物理机hosts文件添加虚拟机IP和虚拟主机域名。

配置用户认证

  • 编辑虚拟主机配置文件“httpd-vhosts.conf”。
[root@xzl-linux ~]# 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@xzl-linux:/usr/local/apache2.4/conf]# /usr/local/apache2.4/bin/htpasswd -c -m /data/.htpasswd xzl
New password: 
Re-type new password: 
Adding password for user xzl
[root@xzl-linux:/usr/local/apache2.4/conf]# cat /data/.htpasswd 
xzl:$apr1$pT1Csyn7$ZMGFNiCrWIGHK.0WXG9il.

即,在“/data/.htpasswd”为用户xzl(自动创建)创建一个使用MD5算法加密的密码文件。
注意: 只有在第一次创建该文件时加-c选项。

  • 配置完成后重新加载
[root@xzl-linux:/usr/local/apache2.4/conf]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@xzl-linux:/usr/local/apache2.4/conf]# /usr/local/apache2.4/bin/apachectl graceful
  • 本机测试
[root@xzl-linux ~]# curl -x127.0.0.1:80 www.abc.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="abc.com user auth"
Content-Type: text/html; charset=iso-8859-1

此时提示状态码为“401”,说明当前所访问的内容需要进行用户认证。

使用用户&密码访问:

[root@123 ~]# curl -x127.0.0.1:80 -xzl:123456 www.abc.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”,即访问成功。

  • htpasswd命令

htpasswd命令是Apache的Web服务器内置工具,用于创建和更新储存用户名、域和用户基本认证的密码文件。

语法: htpasswd [option] [参数]
Options:
-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@xzl-linux ~]# 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@xzl-linux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
[root@xzl-linux ~]# /usr/local/apache2.4/bin/apachectl graceful
[root@xzl-linux ~]# /usr/local/apache2.4/bin/apachectl -M
[root@xzl-linux ~]# 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

在此检查Apache是否加载了虚拟主机配置中调用的rewrite模块,如果没有加载,需要编辑Apache配置文件“httpd.conf”文件将rwrite模块注释去掉使模块生效。

  • 使用curl检测:
[root@xzl-linux ~]# curl -x127.0.0.1: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”。


四.apache访问日志

  • 日志文件所在位置:
[root@xzl-linux:~]# ls /usr/local/apache2.4/logs/
111.com-access_log  111.com-error_log  abc.com-access_log  abc.com-error_log  access_log  error_log  httpd.pid
[root@xzl-linux:~]#
  • 系统自带日志格式:
[root@xzl-linux ~]# vim /usr/local/apache2.4/conf/httpd.conf 
.........
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模式。但是common格式太简单了,以后工作中建议还是使用combine模式

  • 修改日志格式

编辑虚拟主机配置文件“httpd-vhosts.conf”:

[root@123 ~]# 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" common  ##将这行的common改为combined即可
</VirtualHost>

 查看日志:


五.访问日志不记录静态文件

  • 编辑虚拟主机配置文件“httpd-vhosts.conf”:  
[root@xzl-linux ~]# 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变量中所指定格式的文件内容时将不会产生访问记录。  

  • apache只记录指定URI的日志

需求: 把类似请求 www.aaa.com/aaa/... 这样的请求才记录日志。  

方法:   在httpd.conf 或者 相关的虚拟主机配置文件中添加:  

SetEnvIf Request_URI "^/aaa/.*" aaa-request  
CustomLog "|/usr/local/apache/bin/rotatelogs -l /usr/local/apache/logs/aaa-access_%Y%m%d.log 86400" combined env=aaa-request

六.访问日志切割

随着网站访问量的增大,网站的访问日志文件也会变得很大,为了保持磁盘空间,方便日志的管理(如查询、备份、删除历史日志等。),我们需要对日志进行切割操作,可以以天为单位将日志独立切割出来。

/usr/local/apache2.4/conf/extra/httpd-vhosts.conf配置文件下进行设定:

[root@123 ~]# 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秒

七.静态元素过期时间

浏览器访问网站,获取的图片、css等静态元素会保存在本地电脑缓存文件夹里,方便下次再此访问的时候提高访问速度。我们也可以在服务器端设置这些静态元素的过期时间,可以减网站的带宽压力。

在apache子配置文件/usr/local/apache2.4/conf/extra/httpd-vhosts.conf里设定:是通过expires模块实现的。

在编译apache的时候指定了参数mods=most,该模块已经编译进来。

首先在apache全局配置文件里启用该模块:

[root@xzl-linux ~]# vim /usr/local/apache2.4/conf/httpd.conf
//取消注释
LoadModule expires_module modules/mod_expires.so
[root@xzl-linux ~]# /usr/local/apache2.4/bin/apachectl -t
Syntax OK

然后在apache子配置文件中设定:

[root@localhost ~]# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
    ServerAdmin root
    DocumentRoot "/usr/local/apache2.4/htdocs/b.com"
    ServerName b.com
    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
    ErrorLog "logs/b.com-error_log"
    #%y%m%d以年月日命名,86400秒即1天切割一次。rotatelogs是apache的切割日志工具。
    CustomLog "|/usr/local/apache2.4/bin/rotatelogs -l logs/b.com-access_%y%m%d.log 86400" common env=!img
    //增加该段配置
    <IfModule mod_expires.c>
    ExpiresActive on  // 打开该功能的开关
    ExpiresByType image/gif "access plus 1 days"   //gif类型文件的失效时间是1天
    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>
</VirtualHost>

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

[root@localhost ~]# curl -x127.0.0.1:80 b.com/img/b.com.jpg -I
HTTP/1.1 200 OK
Date: Fri, 29 Jun 2018 03:46:29 GMT
Server: Apache/2.4.33 (Unix) PHP/5.6.30
Last-Modified: Thu, 28 Jun 2018 03:08:53 GMT
ETag: "4117-56fab0d131b40"
Accept-Ranges: bytes
Content-Length: 16663
Cache-Control: max-age=86400
Expires: Sat, 30 Jun 2018 03:46:29 GMT
Content-Type: image/jpeg

可以根据自己的需求对每种静态元素类型单独设置。


扩展:

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

猜你喜欢

转载自blog.csdn.net/xzl18779631005/article/details/82633291