LAMP框架学习(二)
httpd的默认虚拟主机
虚拟主机概念:
一台服务器可以访问多个网站,每个网站都是一个虚拟主机
概念:域名、DNS、解析域名、hosts
任何一个域名解析到这台机器,都可以访问的虚拟主机就是默认虚拟主机
# vim /usr/local/apache2.4/conf/httpd.conf
删除注释
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
防止误操作先备份
# cp httpd-vhosts.conf httpd-vhosts.conf bak
<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
ErrorLog "logs/dummy-host.example.com-error_log"
CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
ServerAdmin // 用户地址
DocumentRoot // 网站的根目录
ServerName // 域名
ServerAlias // 网站的别名
ErrorLog // 日志
CustomLog // 日志
根据个人需要修改文件
在两个目录分别创建index.html文件,输入一些测试内容
# curl -xlocalhost:80 www.lht.com
//访问www.lht.com/index.html
# curl -xlocalhost:80 www.lht2.com
验证成功
httpd的用户认证
用户认证用来对某些目录中的网页进行访问控制,当用户访问这些页面的时候需要输入用户名和密码进行认证。现在只针对特定需要安全性较高的网页使用,一般使用较少。
修改配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhost.conf
<Directory /data/wwwroot/testdomain.com> // 指定认证的目录
AllowOverride AuthConfig // 这个相当于打开认证的开关
AuthName "testdomain.com user auth" //自定义认证的名字,作用不大
AuthType Basic //认证的类型,一般为Basic
AuthUserFile /data/.htpasswd //指定密码文件所在位置
require valid-user // 指定需要认证的用户为全部可用用户
</Directory>
AuthUserFile //密码文件位置和网页一样放在docs目录下
创建密码文件,指定用户与密码
# /usr/local/apache2.4/bin/htpasswd -cm /usr/local/apache2.4/docs/.htpasswd lht
//htpasswd为创建用户的工具,-c为creat
//-m为指定密码加密的方式为MD5
// /usr/local/apache2.4/docs/.htpasswd lht为密码文件
检测配置是否成功
# /usr/local/apache2.4/bin/apachectl –t
Syntax OK
使配置生效
# /usr/local/apache2.4/bin/apachectl graceful
使用curl访问验证
# curl -xlocalhost:80 -u lht:123456 lht.com -I
// -u 输入用户名与密码
在本机验证,首先修改hosts文件
文件位置C:\Windows\System32\drivers\etc
把这条加入到文件中
192.168.100.10 lht.com www.yjs181-lht.com
打开浏览器输入网址
访问成功
域名跳转
简介:
当我们变更网站域名或者申多个域名指向一个网站的时候,这个时候我们就会用到域名跳转。
修改配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhost.conf
<IfModule mod_rewrite.c>
//-需要mod_ _rewrite模块支持
RewriteEngine on
// 打开rewrite功能
RewriteCond %{HTTP_HOST} !^lht.com$
//定义rewrite的条件,当主机名不是lht.com时满足条件
RewriteRule ^/(.*)$ http://lht.com/$1 [R=301,L]
//定义rewrite规则,当满足上面的条件时,这条才会执行
</IfModule>
如果我访问的网址站不是以lht开头并且后面还跟着一些网址,这些网址一律会跳转到lht.com以及下面的子网页上面来。状态码为301
[R=301,L] //表示返回的状态码为301
加载rewrite模块
# vim /usr/local/apache2.4/conf/httpd.conf
删除rewrite这行前面的注释,**模块
重新加载配置文件
# /usr/local/apache2.4/bin/apachectl graceful
# /usr/local/apache2.4/bin/apachectl -t
Syntax OK
检测是否加载了rewrite模块
# /usr/local/apache2.4/bin/apachectl -M | grep rewrite
加载成功
访问测试跳转配置是否成功
先测试其中包含lht的网址
# curl -xlocalhost:80 321lht.com -I
跳转到http://lht.com/ 返回的状态码为301
配置Apache的访问日志
简介:
访问日志作用很大,不仅可以记录网站的访问情况,还可以在网站有异常发生时帮助我们定位问题,访问日志还会记录用户的每一个请求
打开虚拟主机的配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
可以看到日志文件的存放位置
# cat /usr/local/apache2.4/logs/lht.com-access_log
查看日志文件
Apache日志文件详解
1.远程主机IP:表明访问网站的是谁
2.空白(E-mail):为了避免用户邮箱泄露,第二项就用“-”取代了
3.空白(登录名):用于记录浏览者进行身份验证时提供的名字。
4.请求时间:用方括号包围,而且采用“公用日志格式”或者“标准英文格式”。 时间信息最后的“+0800”表示服务器所处时区位于UTC之后的8小时。
5.方法+资源+协议:服务器收到的是一个什么样的请求。该项信息的典型格式是“METHOD RESOURCE PROTOCOL”,即“方法 资源 协议”。
METHOD: GET、POST、HEAD、……
RESOURCE: /、index.html、/default/index.php、……(请求的文件)
PROTOCOL: HTTP+版本号
6.状态代码:请求是否成功,或者遇到了什么样的错误。大多数时候,这项值是200,它表示服务器已经成功地响应浏览器的请求,一切正常。
7.发送字节数:表示发送给客户端的总字节数。它告诉我们传输是否被打断(该数值是否和文件的大小相同)。把日志记录中的这些值加起来就可以得知服务器在一天、一周或者一月内发送了多少数据
在Apache的主配置为文件查看日志的两种类型及显示格式
# vim /usr/local/apache2.4/conf/httpd.conf
Common 格式
%h //host访问的来源ip地址
%l //表示登录用户 login
%u //表示用户
%t //表示登录时间
\"%r\" //表示行为
%>s //表示状态码
%b //表示发送字节数
Combined 格式
\"%{Referer}i\" //表示用户访问网页的方式比如使用curl访问和用浏览器打开
\"%{User-Agent}i\"" //表示浏览器上一层访问的地址
验证
重新加载配置文件
# /usr/local/apache2.4/bin/apachectl graceful
# /usr/local/apache2.4/bin/apachectl -t
使用curl访问网页
# curl localhost lht.com
查看日志
# cat logs/lht.com-access_log
发现成功更改了日志的格式,因为这里显示了访问方式为curl
使用windows的浏览器访问之后查看日志,访问方式改变
访问日志不记录指定类型的文件
网站的大多数元素为静态文件,比如图片、css、js等,这些文件可以不用记录
使日志文件的可读性更高。
打开配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加以下的内容到图中位置
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
添加env=!img //表示不记录img变量的文件(也就是上面定义的各种类型统一整合为img)
先定义了一个image-request环境变量,把gif,jpg,png, bmp,swf,js,css等格式文件全归类到此
重新加载配置文件
# /usr/local/apache2.4/bin/apachectl graceful
# /usr/local/apache2.4/bin/apachectl -t
测试环节
先注释掉这几行代码,保存之后重新加载配置文件
# cd /usr/local/apache2.4/docs/lht.com/
然后在Windows的浏览器上打开网址lht.com/900628.png
查看日志文件,发现了访问记录
接着修改配置文件,去掉注释符号重新加载配置文件
继续访问一遍网址
# curl -xlocalhost:80 lht.com/900628.png -I
查看日志文件,发现从20:42分之后并没有新的访问记录出现
访问日志切割
日志一直记录总有一天会把整个磁盘占满,所以有必要让它自动切割,并删除老的日志文件
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
在图中添加如下
"|/usr/local/apache2.4/bin/rotatelogs –l logs/lht.com-access_%Y%m%d.log 86400"
/usr/local/apache2.4/bin/rotatelogs
//这是日志切割工具rotatelogs(Apache自带的日志切割工具)的目录 。
“-l” //改参数表示以当前系统时间切割,如果不指定默认将以UTC(美国时间格式)切割日志。
%Y%m%d //定义了日志的切割命名,以时间格式命名。
86400 //表示了一天的秒数。
重新加载配置文件 -t graceful
使用curl访问lht.com
# curl -xlocalhost:80 lht.com -I
然后切换到存放日志的目录之下查看以日期生成的日志文件
# cd /usr/local/apache2.4/logs
配置成功
静态元素过期时间
浏览器去访问网站时会把静态文件(图片,css , js)默认缓存在电脑里。这样下次访问时就不用再去远程下载了。缓存多长时间?浏览器会有自己的机制,清空缓存。或者在远程服务器端可以设置。
首先使用浏览器访问之前添加的图片
我们使用浏览器访问lht.com/900628.png
发现状态码为304表示这张图片上次访问过并且加入到了缓存里
修改一下图片的名字 图片目录/usr/local/apache2.4/docs/lht.com
# mv 900628.png 9006281.png
重新访问,发现状态码变成200,表示是第一次访问并且重新下载该图片,但是图片是同一张但却占用了双倍的内存。
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加如下内容
<IfModule mod_expires.c>
ExpiresActive on //**模块
ExpiresByType image/gif "access plus 1 days" //表示gif图片保存时间
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>
定义各类图片、css、js缓存文件的保存时间
使用这个功能需要
**expires模块,打开Apache主配置文件
# vim /usr/local/apache2.4/conf/httpd.conf
找到这一行,删除前面的注释符号
重新加载配置文件 -t graceful
检测是否加载了expires模块
# /usr/local/apache2.4/bin/apachectl -M | grep expires
加载成功
然后使用curl访问图片,查看状态
# curl -xlocalhost:80 lht.com/9006281.png -I
发现多了两行 Cache-Control: max-age=86400
表示缓存过期86400秒,是我们之前设置的一天
Expires: Sun, 26 Jul 2020 12:51:30 GMT
表示具体什么时间过期
配置防盗链
是什么防盗链
作为普通的网民来说,一般不需要知道也不用关心什么是盗链,不过如果你是网站的开发者或维护者,就不得不重视盗链的问题了。如果你刚刚开发完一个没有防盗链的带有文件下载功能的网站,挂上internet,然后上传几个时下非常热门的软件或电影并在网站内公布下载地址,让MSN上的所有好友都来体验一下你的杰作。不用多久就会发现网速出奇地变慢,甚至服务器托管中心的服务员会热情地打电话告诉你的网站流量很大,估计是网站受欢迎起来了,问你是不是该考虑加钱租用带宽更宽但价格更贵的网线了。在这个值得庆祝的时候赶快打开Google Analytics看看有多少人来光顾你的网站了吧,如果发现访客每天才十来个人,很遗憾地告诉你:你的网站资源不幸地被人盗链了。而且更糟糕的是,当你把网站上的文件和电影通通删光之后,网站仍然没有变快多少,从web服务器的访问日志里会发现疯狂的访问请求正从四面八方涌过来,web服务器为了迎接这批访客而没有时间处理正常的页面,这种状况可能会一直持续好几个周时间。
网站资源被盗链简单来说就是别人不是从你的网站通过下载资源,被盗链的几种可能情况:
1、在人气非常旺的网站、论坛、社区的网页里直接引用了(使用 标记)你网站上的图片,或者直接在其他网页(使用flash或媒体播放插件)里嵌入了你网站上的mp3。
2、在人气非常旺的网站、论坛、社区里提供了你的资源的下载地址。
3、你网站的资源可能被一些下载软件列入了“资源候选名单”,当其他人用下载工具下载相同的文件时,下载软件会自动找上门并且从你的服务器下载。
既然被盗链的后果这么可怕,那有哪些方法可以防止盗链呢下面从简到繁总结一下常见的以及自己实践过的一些方法,并简单分析一下。不过很遗憾地,这些方法都没法完全杜绝被盗链,并且防盗链的目的应该是从一定的程度上减少被盗链所产生的影响,同时能让合法的用户能够以自然的方式、顺畅地从你的网站下载资源。
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加以下内容
<Directory /usr/local/apache2.4/docs/lht.com>
//表示网站的目录
SetEnvIfNoCase Referer "http://www.lht.com" local_ref
SetEnvIfNoCase Referer "http://lht.com" local_ref
SetEnvIfNoCase Referer "^$" local_ref
//设置一个访问的白名单,首先定义允许访问链接的referer,其中^$为空referer,当直接在浏览器里输入图片地址去访问它时,它的referer就为空
<filesmatch "\.(txt|doc|mp3|zip|rar|jpg|gif|png)">
Order Allow,Deny
Allow from env=local_ref //这句的意思是只有白名单的Referer才可以访问这些后缀名的文件
</filesmatch>
</Directory>
重新加载配置文件 -t graceful
测试使用curl访问lht.com/9006281.png
# curl -e "www.baidu.com" -xlocalhost:80 lht.com/9006281.png -I
-e
参数用来设置 HTTP 的标头Referer
,表示请求的来源。
我们把Referer的值设置为www.baidu.com(这个值是白名单之外的)
发现状态码为403,表示对请求资源的访问被服务器拒绝
这次我们使用白名单内的Referer来访问
# curl -e "http://www.lht.com" -xlocalhost:80 lht.com/9006281.png -I
Referer的值为http://www.lht.com 是白名单之内的值
这次状态码是200,表示访问成功
设置访问控制白名单
匹配目录:
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加以下内容
<Directory /usr/local/apache2.4/docs/lht.com>
Order deny,allow //order表示执行顺序
Deny from all
Allow from 127.0.0.1
</Directory>
//表示lht.com只有本机可以访问
重新加载配置文件 -t graceful
首先我们用192.168.100.10访问lht.com目录下的文件
# curl -x192.168.100.10:80 lht.com/9006281.png -I
状态码为403表示被拒接访问
然后使用本机访问
# curl -x127.0.0.1:80 lht.com/9006281.png -I
表示访问成功
匹配文件:
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加以下内容
<Directory /usr/local/apache2.4/docs/lht.com >
<FilesMatch lht.php(.*)>
//表示除了本机以外,其他ip不可以访问lht.com目录下的lht.php文件
Order deny,allow
Deny from all
Allow from 127.0.0.1
</FilesMatch>
</Directory>
重新加载配置文件 -t graceful
使用192.168.100.10访问lht.com目录下的9006281.png发现可以访问
# curl -x192.168.100.10:80 lht.com/9006281.png -I
但是192.168.100.10不可以访问lht.php
# curl -x192.168.100.10:80 lht.com/lht.php -I
状态码403,访问被拒
使用本机可以访问
# curl -x127.0.0.1:80 lht.com/lht.php -I
访问控制-禁止解析PHP
为什么要禁止解析php
所谓禁止PHP解析,是为了防止被黑客攻击和上传一些恶意文件盗取资料,所以有必要设置指定的目录禁止解析PHP, 对于使用PHP语言编写的网站,有一些目录是有需求上传文件的。如果网站代码有漏洞,让黑客上传了一个用PHP写的木马,由于网站可以执行PHP程序,最终会让黑客拿到服务器权限。为了避免这种情况发生,我们需要把能上传文件的目录直接禁止解析PHP代码。
修改虚拟主机配置文件
# vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf
添加以下内容
<Directory /usr/local/apache2.4/docs/lht.com >
php_admin_flag engine off //表示停用php模块
</Directory>
重新加载配置文件 -t graceful
访问lht.com目录下的lht.php文件
# curl -xlocalhost:80 www.lht.com/lht.php
直接显示源码,表示没有解析php代码
访问控制-user_agent
user_agent:浏览器标识
包括一些蜘蛛爬虫都可以通过user_agent来辨识,通过访问日志,可以发现一些搜索引擎的蜘蛛对网站访问特别频繁,它们并不友好。 为了减少服务器的压力,其实可以把除主流搜索引擎蜘蛛外的其他蜘蛛爬虫全部封掉。还可以防止CC攻击
修改虚拟主机配置文件
添加以下内容
<IfModule mod_rewrite.c> //使用rewrite模块(之前在域名跳转使用过)
RewriteEngine on //开启rewrite模块
RewriteCond %{HTTP_USER_AGENT} .*curl.* [NC,OR]
RewriteCond %{HTTP_USER_AGENT} .*baidu.com.*[NC]
RewriteRule .* - [F]
</IfModule>
.*curl.* //以curl命令形式访问
.*baidu.com.* //以浏览器的形式访问
[NC,OR] //[NC]:不区分大小写 [OR]:两条件都成立
RewriteRule .* -[F] // 对上面两个条件做出的限制 [F]表示Forbidden
重新加载配置文件 -t graceful
使用curl访问发现403被拒
把虚拟主机的配置文件改为 Mozilla.(代表浏览器的意思)
重新加载配置文件 -t graceful
浏览器访问
使用
Forbidden是刚才 [F] 参数的意思
这时候可以使用curl命令访问
我们这次把虚拟主机的配置文件改回去
重新加载配置文件 -t graceful
使用curl加-A 参数,重新定义一个user_agent,发现可以访问
# curl -A "123" -x127.0.0.1:80 lht.com/lht.php
// -A
参数指定客户端的用户代理标头,即User-Agent
。curl 的默认用户代理字符串是curl/[version]
。
没有403状态码