Apache优化
Apache优化
1.隐藏Apache版本号 2.专户专用,分离权限,更改运行账户
3.禁止目录浏览 4.日志切割 5.优雅页面,404跳转
6.启用压缩模块7.设置网页缓存时间8.开启长连接功能 9.apache的三种运行模式
1,生产环境中:部署了apache之后,我们应该从安全还是性能角度,在apache服务上线之前,对其做诸多的优化调试才行。
2,开终端有缓存文件(正在打开这个文件),所以要把这个文件删了,就不会报错了。
删除缓存文件:rm -rf /usr/local/httpd/conf/.httpd.conf.swp
1、隐藏apache版本信息
上传解压软件包
[[email protected] ~]# ls
anaconda-ks.cfg httpd-2.4.38.tar.gz
一般安装软件都安装在/usr/local下,解压软件都放在/usr/local/src/下
[[email protected] ~]# tar -zxvf httpd-2.4.38.tar.gz -C /usr/local/src/
[[email protected] ~]# cd /usr/local/src/httpd-2.4.38/
[[email protected] httpd-2.4.38]# vim include/ap_release.h
修改以下行不用去掉#号
40 #define AP_SERVER_BASEVENDOR “qingniao” #更改apache
41 #define AP_SERVER_BASEPROJECT “WEB Server” #主版本
42 #define AP_SERVER_BASEPRODUCT “WEB” #修改server选项
43
44 #define AP_SERVER_MAJORVERSION_NUMBER 5 #版本号码
45 #define AP_SERVER_MINORVERSION_NUMBER 6
46 #define AP_SERVER_PATCHLEVEL_NUMBER 18
47 #define AP_SERVER_DEVBUILD_BOOLEAN 0
注释:
#define AP_SERVER_BASEVENDOR “Apache Software Foundation” #服务供应商名称
#define AP_SERVER_BASEPROJECT “Apache HTTP Server” #服务的项目名称
#define AP_SERVER_BASEPRODUCT “Apache” #服务的产品名
#define AP_SERVER_MAJORVERSION_NUMBER 2 #主要版本号
#define AP_SERVER_MINORVERSION_NUMBER 4 #小版本号
#define AP_SERVER_PATCHLEVEL_NUMBER 6 #补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #
注:上述列出的行,大家可以修改成自己想要的,然后编译安装之后,再对httpd-default.conf文件进行修改,对方就彻底不知道你的版本号了。在编译安装前修改版本信息
安装依赖环境,切记删除之前安装的httpd,预编译,编译,安装。
[[email protected] ~]# yum -y install gcc gcc-c++ apr apr-devel cyrus-sasl-devel expat-devel libdb-devel openldap-devel apr-util-devel apr-util pcre-devel pcre openssl*
[[email protected] ~]# yum -y remove httpd
[[email protected] httpd-2.4.38]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-ssl --enable-mpms-shared=all
配置参数用途:
–prefix=:指定安装目录
–enable-so:支持动态加载模块
–enable-rewrite :支持网站地址重写。baidu.com直接也能到百度,就是页面跳转
–enable-cgi:支持CGI程序脚本
–enable-ssl:支持SSL加密
–enable-charset-lite:支持多语言编码
–enable-mpms-shared=all:安装apache所有运行模式模块
[[email protected] httpd-2.4.38]# echo KaTeX parse error: Expected 'EOF', got '#' at position 7: ? #̲检测上条命令是否成功
[r… #查看脚本权限
ll /etc/init.d/httpd
-rwxr-xr-x 1 root root 3479 6月 25 14:47 /etc/init.d/httpd
设置开机自启并启动服务,设置path环境变量
[[email protected] ~]# chkconfig --add httpd #添加到系统服务当中
[[email protected] ~]# chkconfig --list httpd
[[email protected] ~]# systemctl start httpd #这个有一些bag,所以还是用绝对路径启动
[[email protected] ~]# ln -s /usr/local/httpd/bin/* /usr/local/bin/
测试:[[email protected] ~]# curl -I 192.168.100.1 #看不到apache版本相关内容
隐藏apache版本号,显示名字
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
497 Include conf/extra/httpd-default.conf #497行去掉注释
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
改:
55 ServerTokens Full
65 ServerSignature Off
为:
55 ServerTokens Prod
65 ServerSignature On
重启服务之后测试
[[email protected] ~]# /etc/init.d/httpd restart
[[email protected] ~]# curl -I 192.168.100.1 #不显示版本号
2、apache的默认账号
更改apache的默认用户,可以提升apache的安全性。这样,即使apache服务被攻破,黑客拿到apache普通用户也不会对系统和其他应用造成破坏。这里创建的apache用户,将用于对子进程和线程的控制。注:默认使用daemon用户是安全的。
在生产环境的网站架构中,我们应把资源文件的权限做好配置。
例:用户上传的图片及附件等和程序做好分离。这样才能更方便我们做好授权,保证apache服务和整个服务器安全。
查看运行账户
[[email protected] ~]# ps -axu | grep httpd
[[email protected] ~]# id daemon
uid=2(daemon) gid=2(daemon) 组=2(daemon)
[[email protected] ~]# grep daemon /etc/passwd
daemon: x:2:2:daemon:/sbin:/sbin/nologin
创建apache用户
[[email protected] ~]# useradd -M -s /sbin/nologin apache
-M:不要自动建立用户的登入目录,就是不创建用户家目录
编辑apache配置文件,修改默认用户
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #修改默认用户
User apache
Group apache
设置整个httpd目录权限为apache
[[email protected] ~]# chown -R apache:apache /usr/local/httpd #维护程序本身
设置httpd网站目录属主属组为daemon
[[email protected] ~]# chown -R daemon:daemon /usr/local/httpd/htdocs/
#上传下载是由daemon说了算的
设置目录文件权限快速恢复(分离主目录和网站目录,进一步提高服务安全性)
[[email protected] ~]# find /usr/local/httpd/htdocs -type f -exec chmod 644 {} ;
[[email protected] ~]# find /usr/local/httpd/htdocs -type d -exec chmod 755 {} ;
网页根目录下,所有的文件应该权限为644 ,所有的目录应该权限为755
如果某个目录用来上传文件的,属主属组应该为apache,提高网站安全性
设置httpd日志文件权限为root
日志很重要所以要将属主和属组都设置为root,只有root能更改日志文件
[[email protected] ~]# chown -R root:root /usr/local/httpd/logs/
注:由于apache日志的记录是由apache的主进程进行操作的,而apache的主进程又是root用户启动的,所以这样不影响日志的输出。这也是日志记录的最安全的方法。
3、Apache禁止目录遍历
由于开启目录浏览会让我们整个目录下的内容全部都暴露到外面,因此我们必须要禁止目录浏览功能。当然一些目录开放给客户做下载的,可以忽略此项优化。
我们通过修改apache主配置文件httpd.conf中的标签内的Options选项参数来实现禁用目录浏览。
将Options Indexes FollowSymLinks中的Indexes 去掉,就可以禁止 Apache 显示该目录结构。Indexes 的作用就是当该目录下没有 index.html文件时,就显示目录结构。
在网站目录下创建几个目录
[[email protected] ~]# mkdir /usr/local/httpd/htdocs/{aa,bb,aa.html}
移走index.html
[[email protected] ~]# mv /usr/local/httpd/htdocs/index.html /opt
[[email protected] ~]# /etc/init.d/httpd restart
测试:会看到目录
修改httpd.conf配置文件
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
242 Options Indexes FollowSymLinks #去掉Indexes
242 Options FollowSymLinks #这样就禁止目录便利了,提高安全性,保证网站隐私
[[email protected] ~]# systemctl restart httpd
测试:由于设置了不能访问目录,网页文件也被移走,所以访问不了
[[email protected] ~]# mv /opt/index.html /usr/local/httpd/htdocs/
[[email protected] ~]# systemctl restart httpd
测试:把index.html移回到web目录下了,所以能访问成功
http://192.168.100.1/
4、Apache日志切割
分割的目的
1、日志太大导致磁盘空间占用大,如果分割,则可以定期清除以前的日志
2、日志太大,不好查看,不太好快速定位日志,且日志太大查看时影响服务器IO/性能
使用rotatelogs进行切割,rotatelogs是apache自带的日志切割工具
主配置文件进行切换
方法一:不用
修改httpd.conf配置文件
[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
修改
ErrorLog “logs/error_log”
为:
ErrorLog “|/usr/local/httpd/bin/rotatelogs -l logs/error_%Y%m%d.log 86400”
修改:
CustomLog logs/access_log common
为:
CustomLog “|/usr/local/httpd/bin/rotatelogs -l logs/access_%Y%m%d.log 86400” combined
注:其中86400为轮转的时间单位为秒,下一天日志名字就会变, 其实不是基于秒的
测试
[[email protected] ~]# /etc/init.d/httpd restart
[[email protected] ~]# ls /usr/local/httpd/logs/
access“20200226. log access_log error_20200226.log error_log httpd.pid
用浏览器访问看有没有生成日志
[[email protected] ~]# cat access_20190629.log #这个自带的工具不能看
[[email protected] ~]# date -s “2020-02-27” #再查看日期就更改了
[[email protected] ~]# ls /usr/local/httpd/logs/
access_20200227.log access_log error_20200227.log error_log httpd.pid
方法二:
由于apache自带的日志轮询工具rotatelogs,据说在进行日志切割时容易丢日志
因此我们通常使用cronolog进行日志轮询。
上传cronolog
[[email protected] ~]# ls
anaconda-ks.cfg cronolog-1.6.2.tar.gz httpd-2.4.38.tar.gz
网上下载地址:
[[email protected] ~]# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
安装cronolog
[[email protected] ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/local/src/
[[email protected] ~]# cd /usr/local/src/cronolog-1.6.2/
[[email protected] cronolog-1.6.2]# ./configure && make && make install
生成命令位置
[[email protected] cronolog-1.6.2]# find / -name cronolog
/usr/local/sbin/cronolog
/usr/local/src/cronolog-1.6.2/src/cronolog
修改httpd.conf配置文件
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
ErrorLog “|/usr/local/sbin/cronolog logs/error_%Y%m%d.log”
CustomLog “|/usr/local/sbin/cronolog logs/access_%Y%m%d.log” combined
重启服务
[[email protected] ~]# /etc/init.d/httpd restart
查看logs目录下有没有分割日志
虚拟主机日志切割
错误日志只记录系统错误
客户端的访问正确还是错误都记录access日志当中
由于apache自带的日志轮询工具rotatelogs,据说在进行日志切割时容易丢日志
因此我们通常使用cronolog进行日志轮询。
上传cronolog
[[email protected] ~]# ls
anaconda-ks.cfg cronolog-1.6.2.tar.gz httpd-2.4.38.tar.gz
网上下载地址:
[[email protected] ~]# wget http://cronolog.org/download/cronolog-1.6.2.tar.gz
安装cronolog
[[email protected] ~]# tar zxf cronolog-1.6.2.tar.gz -C /usr/local/src/
[[email protected] ~]# cd /usr/local/src/cronolog-1.6.2/
[[email protected] cronolog-1.6.2]# ./configure && make && make install
生成命令位置
[[email protected] cronolog-1.6.2]# find / -name cronolog
/usr/local/sbin/cronolog
/usr/local/src/cronolog-1.6.2/src/cronolog
开启虚拟主机,修改修改虚拟主机文件
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #开启下面这行
Include conf/extra/httpd-vhosts.conf
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
<Directory /usr/local/apache/htdocs>
Require all granted #默认拒绝所有人访问我的网站/
#修改配置文件为以下配置
ErrorLog “|/usr/local/sbin/cronolog /www/logs/www.qingniao.com_error_%Y%m%d.log”
CustomLog “|/usr/local/sbin/cronolog /www/logs/www.qingniao.com-access_%Y%m%d.log” combined
配置hosts
[[email protected] ~]# vim /etc/hosts
192.168.100.1 www.qingniao.com
修改windows主机hosts解析
修改C:\Windows\System32\drivers\etc下hosts在最后添加一行
192.168.100.1 www.qingniao.com
创建虚拟主机的网页目录和文件
[[email protected] ~]# mkdir -p /www/{html,logs}
[[email protected] ~]# echo “nihao qingniao” >> /www/html/index.html
重启httpd
[[email protected] ~]# systemctl restart httpd
访问虚拟主机
http://www.qingniao.com/
[[email protected] ~]# ls /www/logs/
[[email protected] ~]# cat www.qingniao.com-access_20200227.log #看有日志不
[[email protected] ~]# date -s “2020-02-27” #再查看日志文件的日期就更改了
[[email protected] ~]# ls /www/logs/
access_20200227.log access_log error_20200227.log error_log httpd.pid
5、设置错误页面优雅显示
为了提升网站的用户体验,避免404,403之类的丑陋的默认错误提示出现。我们需要对错误页面进行优化,让他们变的漂亮一点。错误页面不仅在于告诉用户访问出现了问题,而且需要引导用户到正确的页面。
错误页面优雅化显示的实现方式主要有两种,下面我们主要以404错误为例:
SEO: 404的作用做好用户体验,搜索引擎优化, SEOer
SEM:seo(搜索引擎优化)、付费排名、精准广告和付费收录
sem和seo的核心差别就是是否付费。sem做的是付费排名,就像花钱买的广告位;seo做的是免费的自然排名
关闭虚拟主机
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #下面这行
#Include conf/extra/httpd-vhosts.conf
修改主配置文件
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #添加标红
228 <Directory “/usr/local/httpd/htdocs”>
………… #在这里边自己添加这句话(注意/usr/local/httpd/htdocs在这个里边)
254 ErrorDocument 404 http://192.168.100.1 或者 /404.html #这个文件名叫什么
#http://192.168.100.1 #帮你跳转到某个页面
#或者将404错误跳转到/usr/local/httpd/htdocs下的404.html页面上
255
创建404页面
[[email protected] ~]# cd / usr/local/httpd/htdocs/
[[email protected] ~]# vim 404.html #这就起什么名字
重启服务
[[email protected] ~]# systemctl restart httpd
测试
打开一个错误的页面,用谷歌浏览器测试
http://192.168.100.1/a.html
设置虚拟主机错误页面优雅显示
开启虚拟主机
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #开启下面这行
Include conf/extra/httpd-vhosts.conf
配置虚拟主机文件
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
#修改配置文件为以下配置
ErrorDocument 404 http://www.qingniao.com
#将404错误跳转到http:// www.qingniao.com页面上
创建虚拟主机页面
[[email protected] ~]# mkdir -p /www/html
[[email protected] ~]# echo “nihao qingniao” >> /www/html/404.html
[[email protected] ~]# chown -R apache:apache /www/html/
修改hosts解析
[[email protected] ~]# vim /etc/hosts
192.168.100.1 www.qingniao.com
修改window主机hosts解析
修改C:\Windows\System32\drivers\etc下hosts在最后添加一行
192.168.100.1 www.qingniao.com
测试
http://www.qingniao.com/a.html
发现自动跳转到http://www.qingniao.com/ 页面
总结:ErrorDocument的命令格式如下:
1、可以跟网站:ErrorDocument 404 http://www.qingniao.com
#将404错误跳转到http:// www.qingniao.com页面上
2、可以跟文件:ErrorDocument 错误代码 跳转到的页面或文件
3、另外这里需要注意,你若设置跳转到文件,必须要有这个文件才行。
为什么主配置文件会和虚拟主机产生冲突
Hosts文件里写了 192.168.100.1 www.qingniao.com你再就相当于访问www.qn.com
就会显示虚拟主机的内容,所以虚拟主机会和主配置文件产生冲突
6、启用压缩模块
Deflate [dɪˈfleɪt] 压缩,紧缩
网站随着用户访问量的增加和内容量的增加,网站的带宽会不断的增加,随之就是网站成本的增加。并且当内容量增大的时候,客户端如果带宽小,就会影响用户的体验。因此从这两方面考虑,网站的某些内容必须经过压缩之后再传给用户,然后在用户客户端进行解压,来实现双方共赢的效果。
apache的压缩要用到mod_deflate模块,该模块提供了DEFLATE输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所有的文本内容都应该能被gzip压缩,例如:html(php),js,css,xml,txt等。特殊情况就是像一些首页上有很多广告投放的js代码,由于需要每次加载进而进行来访信息统计,所以这些广告代码拥有者网站的js不会经过gzip压缩.
mod_deflate模块(压缩文件)
mod_deflate模块检查
[[email protected] ~]# apachectl -M | grep mod_deflate
[[email protected] ~]# apachectl -t -D DUMP_MODULES | grep mod_deflate
deflate_module (static) #弹出此种结果,则为编译安装时装的
deflate_module (shared) #弹出此种结果,则为DSO方式安装的,没有弹出就没有安装
安装mod_deflate模块检查
a)编译时安装方法
编译的时候跟上–enable-deflate即可实现安装
b)DSO方式安装。
扩展:DSO: Dynamic shared object动态共享对象 。DSO模块可以在编译服务器之后编译,也可以用Apache扩展工具(apxs)编译并增加
使用DSO方式安装,/usr/local/httpd/ bin/apxs后跟的参数详解
-c 此选项表明需要执行编译操作。
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的modules目录。
-a 此选项自动增加一个LoadModule行到httpd.conf文件中,以**此模块,或者,如果此行已经存在,则启用之。
[[email protected] ~]# apxs -c -i -a /usr/local/src/httpd-2.4.38/modules/filters/mod_deflate.c
#在解压路径下,如果你的路径不一样,不要写错
查看安装的模块
[[email protected] ~]# ls /usr/local/httpd/modules/mod_deflate.so
/usr/local/httpd/modules/mod_deflate.so
#在安装路径下,如果你的路径不一样,不要写错
配置压缩模块
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #修改或添加标红部分
106 LoadFile /usr/lib64/libz.so #添加这一行
107 LoadModule deflate_module modules/mod_deflate.so #打开这一行
155 DeflateCompressionLevel 9
156 SetOutputFilter DEFLATE
157 DeflateFilterNote Input instream
158 DeflateFilterNote Output outstream
159 DeflateFilterNote Ratio ratio
LogFormat ‘"%r" %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate
CustomLog logs/deflate_log.log deflate
160 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
注释:
DeflateCompressionLevel 9 #压缩等级,越大效率越高,消耗CPU也越高。
DeflateCompressionLevel 9是指压缩程度的等级,从1到9,9是最高等级。,这样做最高可以减少8成大小的传输量(看档案内容而定),最少也能够节省一半。DeflateCompressionLevel 预设可以采用 6 这个数值,以维持耗用处理器效能与网页压缩质量的平衡。注:一般压缩等级使用6或8
SetOutputFilter DEFLATE #启用压缩
DeflateFilterNote Input instream #声明输入流的byte数量
DeflateFilterNote Output outstream #声明输出流的byte数量
DeflateFilterNote Ratio ratio #声明压缩的百分比,告诉你压缩了%之多少
LogFormat ‘"%r" %{outstream}n/%{instream}n (%{ratio}n%%)’ deflate #开日志
#声明日志类型,如果将#号去掉,可以在logs/deflate_log.log日志文件中看到文件压缩前后的字节数、压缩比,例如:
“GET /index.html HTTP/1.1” 49373/276249 (17%)
压缩前的字节数为276249,压缩后的字节数为49373,压缩比为17%
CustomLog logs/deflate_log.log deflate #声明日志类型
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
#仅压缩,限制特定的MIME类型文件(设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。)
注意:
1、如果是虚主拟机,需要在<VirtualHost*:80>中添加配置即可实现压缩
2、图片和视频本身就是压缩格式,一般不需要压缩的。有些小图片和视频压缩后还会变大。
再次mod_deflate模块检查(查看有没有这个模块)
[[email protected] ~]# apachectl -t -D DUMP_MODULES | grep mod_deflate
创建测试文件
[[email protected] ~]# cp /etc/passwd /www/html/passwd.html #放到网页根目录!
重启服务
[[email protected] ~]# systemctl restart httpd
或者:
[[email protected] ~]# /etc/init.d/httpd graceful
#graceful 重新启动Apache服务器,但不会中断原有的连接。用于修改了配置文件后进行重新读取配置文件。 相当于nginx -s reload
查看数据在传输过程中是否启用了压缩
访问我们的网站,用360极速或者google游览器的YSLOW插件,查看压缩效果
安装YSLOW
打开passwd.html:输入地址http://192.168.100.1/passwd.html
打开插件
也可以看logs目录下的日志文件(有没有进行压缩)
[[email protected] ~]# cat /usr/local/httpd/logs/deflate_log.log
可以看到文件从0.9K压缩到0.4K
总结:我们在企业生产环境中时,在启用mod_deflate时,一定要注意,对于太小的文件和某些格式的图片不要对它们进行压缩,有可能越压越大。
扩展
AddOutputFilterByTypeDEFLATE后跟的所有的压缩文件类型,后期可以参照选择。
text/plain text/html text/php text/xml text/css text/javascript
application/xhtml+xml application/xml application/rss+xml application/atom_xml application/x-javascript application/x-httpd-php image/svg+xml image/gif image/png image/jpe image/swf image/jpeg image/bmp
7、设置网页缓存时间
expire [ɪkˈspaɪə®] 到期
虽然我们上面通过mod_deflate模块启用了压缩,从很大程度上节约了企业带宽,降低了企业成本。可是由于现在越来越多的图片、脚本、css和flash被嵌入到页面中,当客户访问站点势必会做很多次的http请求,因此我们还可以通过mod_expires缓存模块来设置ExpiresHeader来缓存这些文件。
Expires是通过header报文来指定特定类型的文件在游览器中的缓存时间的。平时,我们大多数的图片,flash在发布之后都是不需要经常修改的,因此做了缓存之后,浏览器第一次从服务器下载之后,就不需要再从服务器下载这些文件而是直接从浏览器缓存中读取了。这样客户访问页面的速度就会大大加快,企业的带宽压力也得到了缓解。
mod_expires模块
mod_expires模块检查
[[email protected] ~]# apachectl -t -D DUMP_MODULES | grep expires
expires_module (static) #此种结果为编译安装时装的
expires_module (shared) #此种结果为DSO方式安装的
mod_expires模块安装
a)编译方式安装
编译的时候跟上–enable-expires即可实现安装
b)DSO方式安装
[[email protected] ~]# apxs -c -i -a /usr/local/src/httpd-2.4.38/modules/metadata/mod_expires.c
检查安装模块
[[email protected] ~]# ll /usr/local/httpd/modules/mod_expires.so
-rwxr-xr-x 1 root root 18360 6月 26 14:19 /usr/local/httpd/modules/mod_expires.so
配置缓存参数
注意如果我们是编译安装时已经编译进去的,要先取消注释这行,再进行下面操作,不然会报错。
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #取消mod_expires.so注释
LoadModule expires_module modules/mod_expires.so
缓存的用法有3种,分别问对全局,对目录,对虚拟主机。3选1测试就可。
对全局
对全局的配置就是在apache主配置文件httpd.conf的末尾加入如下参数即可
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #在163添加以下内容
164 ExpiresActive on
165 ExpiresDefault “access plus 12 month”
166 ExpiresByType text/html “access plus 12 months”
167 ExpiresByType text/css “access plus 12 months”
168 ExpiresByType image/gif “access plus 12 months”
169 ExpiresByType image/jpeg “access plus 12 months”
170 ExpiresByType image/jpg “access plus 12 months”
171 ExpiresByType image/png “access plus 12 months”
172 EXpiresByType application/x-shockwave-flash “access plus 12 months”
173 EXpiresByType application/x-javascript “access plus 12 months”
174 ExpiresByType video/x-flv “access plus 12 months”
重启服务:
[[email protected] ~]# systemctl restart httpd
再次expires模块检查(查看有没有这个模块)
[[email protected] ~]# apachectl -t -D DUMP_MODULES | grep expires
对目录
对目录的配置就是在apache主配置文件中Directory /Directory标签内,最后加入如下参数即可
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf #添加标红的部分
279 ExpiresActive on
280 ExpiresDefault “access plus 12 month”
281 ExpiresByType text/html “access plus 12 months”
282 ExpiresByType text/css “access plus 12 months”
283 ExpiresByType image/gif “access plus 12 months”
284 ExpiresByType image/jpeg “access plus 12 months”
285 ExpiresByType image/jpg “access plus 12 months”
286 ExpiresByType image/png “access plus 12 months”
287 EXpiresByType application/x-shockwave-flash “access plus 12 months”
288 EXpiresByType application/x-javascript “access plus 12 months”
289 ExpiresByType video/x-flv “access plus 12 months”
重启服务:
[[email protected] ~]# systemctl restart httpd
对虚拟主机
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-vhosts.conf
ExpiresActive on
ExpiresDefault “access plus 12 month”
ExpiresByType text/html “access plus 12 months”
ExpiresByType text/css “access plus 12 months”
ExpiresByType image/gif “access plus 12 months”
ExpiresByType image/jpeg “access plus 12 months”
ExpiresByType image/jpg “access plus 12 months”
ExpiresByType image/png “access plus 12 months”
EXpiresByType application/x-shockwave-flash “access plus 12 months”
EXpiresByType application/x-javascript “access plus 12 months”
ExpiresByType video/x-flv “access plus 12 months”
上传一张图片
[[email protected] ~]# ls
anaconda-ks.cfg apache-zookeeper-3.5.5-bin.tar.gz httpd-2.4.38.tar.gz jdk-8u171-linux-x64.tar.gz test.jpg
把图片放到网站根目录
[[email protected] ~]# cp test.jpg /www/html/
重启服务:
[[email protected] ~]# systemctl restart httpd
测试
网页访问图片:http://192.168.100.1/test.jpg
使用yslow插件查看缓存效果
expires模块的语法
expires模块用到了ExpiresDefault和EXpiresByType两个指令,下面是这两个指令的语法。
ExpiresDefault “ [plus] {}*”
EXpiresByType type/encoding " [plus] {}"
其中的参数有3个:access,now(等价于‘access’),modification
modification [ˌmɒdɪfɪˈkeɪʃn] 改性,修正
plus关键字是可选的。
plus [plʌs] 加上
必须是整数,确保可以atoi()所接收。(atoi可以把字符串转换成长整型数)
参数类型:years,months,weeks,days,hours,minutes,seconds
例如:下面3个指令都表示文档默认的有效期是一个月
ExpiresDefault “access plus 1 month”
ExpiresDefault “access plus 4 weeks”
ExpiresDefault “access plus 30 days”
按照文件类型设置缓存
ExpiresByType text/html “access plus 1 month 15 days 2 hours”
ExpiresByType image/gif “modification plus 5 hours 3 minutes”
查看淘宝缓存时间
缓存优化对企业来说是至关重要的,不同的业务类型,对于缓存的类型和时间又各不相同,大家具体可以用YSlow对淘宝,京东,新浪,谷歌等站点进行测试,看看他们的缓存时间是多少,并思考下为什么那样设置。
注:淘宝解决被缓存文件及时更新的方法:对缓存的对象改名。
例如:过节的时候更改图片名称,用户再访问就是新的内容,就再重新缓存
被缓存文件及时更新
缓存的设置有如下优点:
1.缩短服务的响应时间
2.减轻服务器负担
3.减少网络带宽使用量,降低企业成本
缺点:由于使用了缓存设置,导致被缓存的内容更新了,但是客户看到的却还是旧的。
如何解决被缓存文件及时更新这个问题呢?
第一种:缩短缓存时间例如:1天,不牺牺牲性能
第二种:对缓存的对象改名。
参数:
#打开缓存
ExpiresActive on
#css文件缓存7200000/3600/24=83天
ExpiresByType text/css A7200000
#js文件缓存7200000/3600/24=83天
ExpiresByType application/x-javascript A7200000
ExpiresByType application/javascript A7200000
#html文件缓存7200000/3600/24=83天
ExpiresByType text/html A7200000
#图片文件缓存7200000/3600/24=83天
ExpiresByType image/jpeg A7200000
ExpiresByType image/gif A7200000
ExpiresByType image/png A7200000
ExpiresByType image/x-icon A7200000
8、开启长连接功能
KeepAlive Off/On 保持连接,会减少三次握手,但是会消耗内存,是否打开,取决于单位时间内是否进行多次连接(三次握手)。一个连接有多次请求的,建议打开,并适当调整KeepAliveTimeout时间
在apache的httpd.conf中,KeepAlive指的是保持连接活跃,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。
KeepAlive的连接活跃时间当然是受KeepAliveTimeOut限制的。如果第二次请求和第一次请求之间超过KeepAliveTimeOut的时间的话,第一次连接就会中断,再新建第二个连接。
所以,一般情况下,图片较多的网站应该把KeepAlive设为On。但是KeepAliveTimeOut应该设置为多少秒就是一个值得讨论的问题了。
如果KeepAliveTimeOut设置的时间过短,例如设置为1秒,那么apache就会频繁的建立新连接,当然会耗费不少的资源;反过来,如果KeepAliveTimeOut设置的时间过长,例如设置为300秒,那么APACHE中肯定有很多无用的连接会占用服务器的资源,也不是一件好事。
所以,到底要把KeepAliveTimeOut设置为多少,要看网站的流量、服务器的配置而定。
这是什么意思:比如你设置了长连接时间为2分钟。小明给我打电话,在30秒内小明可以给我说好几件事情,但是超过2分钟,就不能说了。但是如果你在说完了还没超过2分钟,你又给我打电话,你就不用建立新的连接,我这2分钟都为你保留,你可以再说。等超过2分钟再重新建立连接
开启长连接
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-default.conf #取消注释开启这个选项
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-default.conf
KeepAlive On #开启keepAlive
KeepAliveTimeout 30 #修改超时时间为30s
如果网站上有不少的图片,所以将KeepAlive设为On,一般的页面两次请求间隔不会超过30秒,所以这样设置,运行状况良好。如果是艺术品网站, 需要看的时间长,那么就设置长一些。
MaxKeepAliveRequests 100
默认:100
一个建立好的Keep-Alive连接,允许发送的请求的个数。一旦建立连接,要么就是个数达到了断开,要么就是等KeepAliveTimeout时间到了断开连接。
MaxKeepAliveRequests指令限制了当启用KeepAlive时,每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。这个数字的设置,必须考虑在一个时间段内,同一个用户访问你的服务会发多少请求。要结合KeepAliveTimeout参数来考虑。
举个例子,用户需要间隔时间不大于KeepAliveTimeout的时间内,连续请求10个文件,那么这个参数就应该设置成10,如果用户在连续时间里不断请求访问,则这个数值得设置得更多。否则就重新建立连接下载。一旦用户连续进行了10个请求后,并且这个用户肯定在完成这些请求后的5秒内不会再请求,甚至要在之后的很长时间后请求,那么这个KeepAliveTimeout时间就可以设置得很短,以便尽早断开这种用户,把资源让个其他用户。
TimeOut 60
默认:60 秒
"TimeOut指令用于设置Apache等待以下三种事件的时间长度:
- 接受一个GET请求耗费的总时间。
- POST或PUT请求时,接受两个TCP包之间的时间。
- 应答时TCP包传输中两个ACK包之间的时间。
比如:apache需要把jsp文件传给后端tomcat服务器,而tomcat服务器关了,这时这个链接需要等待的超时时间,由TimeOut控制。
注:计时器在1.2版本之前的默认值为1200,而现在已经设置为60了,但对于绝大多数情况来说仍是足够的。
案例分析
如果开启keepAlice假设 KeepAlive 的超时时间为 10 秒钟,服务器每秒处理 50 个独立用户访问,那么系统中Apache的总进程数就是 10 * 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗2G内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。
如果关闭 KeepAlive,还是每秒50个用户访问,如果用户每秒的并发请求数为3个,那么 Apache 的总进程数就是 50 * 3 = 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为600M,这种配置能节省大量内存,但是,系统处理了 150 次 TCP 的握手和关闭的操作,因此又会多消耗CPU 资源。
总结:
1、如果内存和CPU都足够,开启和关闭KeepAlive对性能影响不大。
2、如果考虑服务器压力,如果同一个客户端对服务器会经常访问,建议开启KeepAlive。
参考数值:
KeepAlive On
KeepAliveTimeout 30
MaxKeepAliveRequests 100 #这个值一般不需要配置。
9、apache3种运行模式
Prefork:进程模式
worker:线程模式
Event : 事件模式(2.4版本后开始稳定)
Prefork运行模式详解
Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。
最重要的是将MaxClients设置为一个足够大的数值以处理潜在的请求高峰,同时又不能太大,不然可能需要使用的内存会超出物理内存的大小。
注: Prefork 是基于多进程的模式。
优点:因为每个进程使用独立的内存空间,所以比较安全。一个进程坏了,不会影响其他进程。
缺点:占用的内存比较大,存在keep-alive长连接占用资源时间过长
Worker MPM运行模式详解
和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,(线程比进程小)因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的所以线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。
优点:可以处理海量请求,而系统资源的开销小。原因:一个进程中包括多个线程。多个线程之间可以共享内存,所以占用的内存资源比较少。如图:
缺点:不太安全。如果一个线程坏了。 整个进程都要坏了。另外存在keep-alive长连接占用资源时间过长
如何避免进程中某个线程坏了? 一个进程中所有线程完成一定数量的请求后,自动关闭,再重打开。就可以避免内存溢出等问题。就像一个电脑开机时间长了,会卡,需要重启一下。
进程包括线程的:一个进程可以有一个或多个线程。
总结:不管是Worker模式或是Prefork 模式,Apache总是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。这就是预先派生进程或线程。
Event MPM运行模式详解
event模式是在2.4版本中才稳定发布的模式。这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
当某个连接没有请求时,会主动关闭连接,在work模式下,必须等keep-alive超时,才可以释放。
在configure配置编译参数的时候,可以使用 --with-mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:–enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM
实战apache工作模式调优
案例场景
当用户访问网站时,在客户端浏览器输入网址后长时间无响应,而一旦连接上之后,页面很快就打开了(因为配置了持久连接)。
排查
登录上linux服务器后,使用netstat观察最大连接数稳定在257,查看apache配置文件中,prefork模式中,maxclients为 257, 这因为apache连接数明显不够用。
查看apache的运行模式
[[email protected] ~]# httpd -V
可以看到默认的运行模块是worker
实战:跟据硬件来配置连接数(prefork)
由于我在预编译的时候添加了–enable-mpms-shared=all参数,可以直接修改工作模式,如果没有添加,需要重新指定参数编译安装。
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #取消注释
#LoadModule mpm_worker_module modules/mod_mpm_worker.so #注释worker
[[email protected] ~]# systemctl restart httpd #重启httpd
查看apache工作模式
[[email protected] ~]# httpd -V
对prefork模式进行优化
开启httpd-mpm.conf
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-mpm.conf #取消前面的注释
修改httpd-mpm.conf
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf
改:
28 < mpm_prefork_module>
29 StartServers 5
30 MinSpareServers 5
31 MaxSpareServers 10
32 MaxRequestWorkers 250
33 MaxConnectionsPerChild 0
为:
28 < mpm_prefork_module>
29 StartServers 50
30 MinSpareServers 50
31 MaxSpareServers 100
32 MaxRequestWorkers 1000
33 MaxConnectionsPerChild 1000
重启 httpd
必须要先关闭httpd,再重启httpd,不然会报错
[[email protected] ~]# systemctl stop httpd
[[email protected] ~]# systemctl start httpd
参数详解
StartServers:要启动的服务器进程数
这个参数默认是5,因为apache会通过自动启动新进程来增加响应服务的进程数,这个值不做调整的也是可以的,会由默认的5增加到满足服务的进程数,但是会出现开始启动后,突然后有大并发访问时,因为进程数太小,出现卡住的现象.
[[email protected] ~]# ps -axu | grep httpd | wc -l
52
注:所以不要一次启动太多的apache进程,只启动足够用的进程即可。其他增加的流量,apache会自动调整进程数,直到参数maxrequestworkers限定的范围。
MinSpareServers 50 :保留备用的服务器进程的最小数目
Spare :[speə®] 备用
MinSpareServers指令设置空闲子进程的最小数量,所谓空闲子进程是指没有正在处理请求的子进程。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以第一秒一个,第二秒两个,第三秒四个,按指数递增个数的速度产生新的子进程。如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止;这就是预派生(prefork)的由来;这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销以增加性能;
MaxSpareServers 100:保留备用的服务器进程的最大数量
MaxSpareServers指令设置空闲子进程的最大数量。所谓空闲子进程是指没有正在处理请求的子进程。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。
可以调整MinSpareServers 和MaxSpareServers这两个参数,但是这两个参数的值不能设得太大,否则apache进程太多,会导致内存占用太多。
注:在一台压力大(并发访问2000)的服务器上,MaxSpareServers这个值设置的是200。保留最大并发数的10分之一。
设置了这个值的好处是不会有太多的空闲的进程在消耗资源,关闭空闲apache进程的同时,会释放内存,进而减少系统资源消耗。
maxrequestworkers 1000:允许启动的服务器进程的最大数量
apache2.3.13以前的版本MaxRequestWorkers被称为MaxClients
如果做5000并发的web,需要多少内存?
50002M/0.8/1024(转G)=12.2G,服务器大概需要14G -16G 内存。
maxrequestworkers取决于你系统的资源,每个apache进程默认大约占用2M内存,基本可以按照这个公式来计算:最大内存80%/2M= maxrequestworkers子进程
maxConnectionsPerChild:服务器进程服务的最大连接数
连接数理论上是越大越好,但是得根据硬件,服务器的CPU,内存,带宽等因素,
查看当前的apache连接数。
[[email protected] ~]# ps -aux | grep httpd | wc -l
52 注:总进程数为52-2,去除一个父进程,去除一个grep
查看httpd占用内存的平均数
使用ps查看RSS列,每个进程占用的内容。
[[email protected] ~]# ps -axu | grep http | awk ‘{print $6}’
#单位是K,现在一个使用1.5M左右
或者:
[[email protected] ~]# ps aux | grep http |awk ‘{sum += $6;n++};END{print sum/n}’
1505.69
设置最大连接数
计算后要减去服务器系统本身所需要的资源。比如内存2G,减去500M留给服务器,还有1.5G,那么可得到最大连接数:1500/1.5=1000左右。
根据情况修改后的http-mpm.conf的prefork的配置后为:
28
29 StartServers 50
30 MinSpareServers 50
31 MaxSpareServers 100
32 MaxRequestWorkers 1000
33 MaxConnectionsPerChild 1000 #没keepalive是1000,如果开启keepalive就配置成100
实战2:模拟性能优化(worker)
Apache2.0的性能方面的改进最明显的变化就在于worker;
优点:内存占用比prefork模式低,适合高并发高流量HTTP服务。
缺点:假如一个线程崩溃,整个进程就会连同其他任何线程一起“死掉”。由于线程共享内存空间,所以一个程序在运行时必须被系统识别为“每个线程都是安全的”。服务稳定性不如prefork模式。
修改apache运行模式
或者编译时使用–with-mpm=worker支持worker模式
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #注释prefork
LoadModule mpm_worker_module modules/mod_mpm_worker.so #取消注释
[[email protected] ~]# systemctl restart httpd
[[email protected] ~]# httpd -V
查看进程个数
[[email protected] ~]# ps -axu | grep httpd | wc -l
5
开启MPM配置文件
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
Include conf/extra/httpd-mpm.conf #开启这一行
开始优化worker
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf
改
44 < mpm_worker_module>
45 StartServers 3
46 MinSpareThreads 75
47 MaxSpareThreads 250
48 ThreadsPerChild 25
49 MaxRequestWorkers 400
50 MaxConnectionsPerChild 0
为:
44 <mpm_worker_module>
45 StartServers 5
46 MinSpareThreads 75
47 MaxSpareThreads 250
48 ThreadsPerChild 64
49 MaxRequestWorkers 1000 #把最大进程数改大
50 MaxConnectionsPerChild 0
参数详解:
ThreadsPerChild 25 #每个子进程包含固定的线程数,此参数在worker模式中,是影响最大的参数,ThreadsPerChild的最大缺省值是64,如果负载较大,64是不够的.
MaxRequestWorkers 0 #每个子进程可以支持的请求数,这要设置为0,因为一个进程关闭,所有的线程也都关了。
重启服务
[[email protected] ~]# systemctl restart httpd
查看每个进程占用内存占用大小
[[email protected] ~]# ps aux | grep http |awk ‘{sum += $6;n++};END{print sum/n}’
3535.2
计算最大连接数
假设4G内存,计算最大连接数和最大并发
4x0.8x1024/3.5=936 差不多936个进程,936x64=59904个并发
Event模式
event模式需要我们源码安装apr、apr-util、pcre,然后使用如下语句进行源码预编译,安装。源码安装apr、apr-util、pcre请参照web架构之apache文档
[[email protected] ~]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-ssl --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --with-pcre=/usr/local/pcre/ --enable-charset-lite --enable-cgi --enable-mpms-shared=all --enable-mpm-with=event
[[email protected] ~]# make && make install
[[email protected] ~]# vim /usr/local/httpd/conf/extra/httpd-mpm.conf
< mpm_event_module>
StartServers 3
ServerLimit 16
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 1000
Rewrite
Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的 (.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。
安装Rewirte模块两种方式:
方法一:是编译apache的时候就直接 安装rewrite模块。
方法二:编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。
基于服务器级的(httpd.conf)有两种方法:
方法1:在httpd.conf的全局下 直接利用RewriteEngine on来打开rewrite功能;
方法2:在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
重定向
实现client请求的主机前缀不是www.qingniao.com和192.168.100.1都跳转到主机前缀为http:// www.qingniao.com。例如当用户在地址栏写入http:// qingniao.com.cn和bbs. qingniao.com直接跳转到http:// www.qingniao.com登录网站。
配置防盗链
服务器1:安装,开启rewrite模块
[[email protected] ~]# apxs -c -i -a /usr/local/src/httpd-2.4.38/modules/mappers/mod_rewrite.c
[[email protected] ~]# apachectl -M | grep rewrite
rewrite_module (shared)
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so
配置文件
[[email protected] ~]# vim /usr/local/httpd/conf/httpd.conf
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !qingniao.com/.$ [NC]
RewriteCond %{HTTP_REFERER} !www.qingniao.com/.$ [NC]
RewriteRule ..(gif|jpg|swf)$ http://www.qingniao.com/about/test.jpg [R,NC,L]
防盗链配置的说明:
红色部分: 表示自己的信任站点。对我的站点来说,设置为 http://www.benet.com 和 http://benet.com
绿色部分: 要保护文件的扩展名(以|分开)。以这些为扩展名的文件,必须通过红色标注的网址引用,才可以访问。
蓝色部分: 定义被盗链时替代的图片,让所有盗链 jpg、gif、swf 等文件的网页,显示网页文档根目录下的about/ nolink.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:RewriteRule ..(gif|jpg|png)$ - [F]
注:[F] (强制URL为被禁止的 forbidden),强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
创建目录和文件
[[email protected] ~]# mkdir /usr/local/httpd/htdocs/about
[[email protected] ~]# cp test.jpg /usr/local/httpd/htdocs/about/ #别人想要访问的图片
[[email protected] ~]# cp abc.jpg /usr/local/httpd/htdocs/ #放一张照片,用这张照片做防盗,当有人通过别的网站访问你,就返回这张照片。 ----重启服务
修改C:\Windows\System32\drivers\etc下hosts在最后添加
192.168.100.1 www.qingniao.com
192.168.100.1 bbs.qingniao.com
192.168.100.1 qingniao.com.cn
192.168.100.1 qingniao.com
192.168.100.2 tongfang.com #服务器2的ip域名
服务器2:
[[email protected] ~]# vim /etc/hosts
192.168.100.1 www.qingniao.com
192.168.100.2 www.tongfang.com #服务器2的ip域名
打开网页目录:添加以下内容
lianjie ----重启服务
测试
http://www.tongfang.com/abc.jpg #返回的是test.jpg