Apache的网页优化

  • 掌握Apache网页压缩
  • 掌握Apache网页缓存
  • 掌握Apache隐藏版本信息
  • 掌握Apache网页防盗链

1.1 网页压缩

        在使用 Apache 作为 Web 服务器的过程中,只有对 Apache 服务器进行适当的优化配 置,才能让 Apache 发挥出更好的性能。反过来说,如果 Apache 的配置非常糟糕, Apache 可能无法正常为我们服务。因此,针对各种企业应用需求对 Apache 服务器的配置进行一定 的优化是必不可少的

1. gzip介绍

        网站的访问速度是由多个因素所共同决定的,这些因素包括应用程序的响应速度、网络带宽、服务器性能、与客户端之间的网络传输速度等等。其中最重要的一个因素是 Apache本身的响应速度。因此当为网站性能所苦恼时,第一个需要着手进行处理的便是尽可能的提升 Apache 的执行速度,可以使用网页压缩提升应用程序的速度。更重要的是,它完全不需要任何的成本,只不过是会让服务器 CPU 占用率稍微提升一两个百分点或者更少

2. HTTP压缩的过程

        Web 服务器接收到浏览器的 HTTP 请求后,检查浏览器是否支持 HTTP 压缩(Accept-Encoding 信息)。如果浏览器支持 HTTP 压缩, Web 服务器检查请求文件的后缀名。如果请求文件是 HTML 、 CSS 等静态文件, Web 服务器到压缩缓冲目录中检查是否已经存在请求文件的最新压缩文件。如果请求文件的压缩文件不存在,Web 服务器向浏览器返回未压缩的请求文件,并在压缩缓冲目录中存放请求文件的压缩文件。如果请求文件的最新压缩文件已经存在,则直接返回请求文件的压缩文件。如果请求文件是动态文件,Web服务器动态压缩内容并返回浏览器,压缩内容不存放到压缩缓存目录中

3. Apache的压缩模块

        Apache 1.x 系列没有内建网页压缩技术,使用的是额外的第三方 mod_gzip 模块来执第 2 页 共 17 页 行压缩。而 Apache 2.x 官方在开发的时候,就把网页压缩考虑进去,内建了 mod_deflate 这个模块,用以取代 mod_gzip 。两者都是使用的 gzip 压缩算法,它们的运作原理是类似的

        mod_deflate 压缩速度略快而 mod_gzip 的压缩比略高。一般默认情况下,mod_gzip 会比 mod_deflate 多出 4%~6%的压缩量

        一般来说,mod_gzip 对服务器 CPU 的占用要高一些。 mod_deflate 是专门为确保服务器的性能而使用的一个压缩模块,mod_deflate 需要较少的资源来压缩文件。这意味着在高流量的服务器,使用 mod_deflate 可能会比 mod_gzip 加载速度更快

         简而言之,如果网站访问量较小,想要加快网页的加载速度,就使用 mod_gzip 。虽然会额外耗费一些服务器资源,但也是值得的。如果网站访问量较大,并且使用的是共享的虚拟主机,所分配系统资源有限的话,使用 mod_deflate 将会是更好的选择

         Apache 2.4.25 版本中 mod_deflate 模块,可使用 DeflateCompressionLevel 指令设置压缩级别。该指令的值可为 1 (压缩速度最快,最低的压缩质量)至 9 (最慢的压缩速度,压缩率最高)之间的整数,其默认值为 6 (压缩速度和压缩质量较为平衡的值)。这个简单的变化更是使得 mod_deflate 可以轻松媲美 mod_gzip 的压缩

4. mod_deflate模块

        检查是否安装mod_deflate模块

[root@node1 ~]# apachectl -t -D DUMP_MODULES
Loaded Modules:core_module (static)so_module (static)http_module (static)mpm_worker_module (static)authn_file_module (shared)authn_core_module (shared)authz_host_module (shared)authz_groupfile_module (shared)authz_user_module (shared)authz_core_module (shared)access_compat_module (shared)auth_basic_module (shared)reqtimeout_module (shared)filter_module (shared)mime_module (shared)log_config_module (shared)env_module (shared)headers_module (shared)setenvif_module (shared)version_module (shared)unixd_module (shared)status_module (shared)autoindex_module (shared)dir_module (shared)alias_module (shared)
[root@node1 ~]# apachectl -t -D DUMP_MODULES | grep "deflate"
[root@node1 ~]#

(1)重新编译Apache添加mod_deflate模块

[root@node1 httpd-2.4.25]# yum -y install zlib-devel
[root@node1 httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate
[root@node1 httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@node1 conf]# mv httpd.conf httpd.conf.bak
[root@node1 conf]# systemctl stop httpd.service 
[root@node1 conf]# cd /usr/src/httpd-2.4.25/
[root@node1 httpd-2.4.25]# make -j2 && make install

(2)配置mod_deflate模块启用

[root@node1 httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@node1 conf]# ls
extra  httpd.conf  httpd.conf.bak  magic  mime.types  original
[root@node1 conf]# vim httpd.conf
Listen 192.168.161.12:80    //修改端口号
LoadModule deflate_module modules/mod_deflate.so    //取消注释
ServerName www.aaa.com:80    //修改域名信息...下面是需要添加的内容...
<IfModule mod_deflate.c>AddOutputFilterByType DEFLATE text/hml text/plain text/css text/xml text/javascrpit text/jpg text/png    //设置对什么样的内容进行gzip压缩DeflateCompressionLevel 9    //设置压缩级别1——9SetOutputFilter DEFLATE    //启动deflate模块对本站点的输出进行gzip压缩
</IfModule>

(3)检查安装情况,启动服务

[root@node1 conf]# apachectl -t    //检查配置文件是否有问题
Syntax OK
[root@node1 conf]# apachectl -t -D DUMP_MODULES | grep "deflate"    //检查模块是否安装成功deflate_module (shared)
[root@node1 conf]# 

测试缓存是否生效

[root@node1 htdocs]# ls
aaa.jpg  index.html
[root@node1 htdocs]# cat index.html 
<html><body><h1>It works!</h1><img src="aaa.jpg"/></body>
</html>
[root@node1 htdocs]#

(4)浏览器中访问,使用F12查看信息

         在浏览器中选择“查看元素”可以看到有“AcceptEncoding:gzip”表示压缩已经生效

1.2 网页缓存

        网页缓存是将一部分经常不会改变和变动很少的页面缓存, 下次浏览器再次访问这些页 面时, 不需要再次去下载这些页面 , 从而提高了用户的访问速度

        Apache 的 mod_expires 模 块 会 自 动 生 成 页 面 头 部 信 息 中 的 Expires 标签和Cache-Control 标签,客户端浏览器根据标签决定下次访问是在本地机器的缓存中获取页面,不需要向服务器再次发出请求,从而降低客户端的访问频率和次数,达到减少不必要的流量和增加访问速度的目的

        配置 mod_expires 模块的步骤与 mod_deflate 模块相似

1. 配置mod_expires模块启用

        启用 mod_expires 模块之前,可以用浏览器先抓取数据包,然后修改 httpd.conf 文件再抓取 数据包进行对比 。在 httpd.conf 去掉 LoadModule expires_module modules/mod_expires.so 前面的 # 注释,末尾加入以下内容

(1)检查是否安装mod_expires模块启用

[root@node1 ~]# apachectl -t -D DUMP_MODULES | grep "expires"

如果没有安装mod_expires模块,重新编译安装Apache添加mod_expires模块

[root@node1 ~]# systemctl stop httpd.service 
[root@node1 ~]# cd /usr/local/httpd/conf/
[root@node1 conf]# ls
extra  httpd.conf  httpd.conf.bak  magic  mime.types  original
[root@node1 conf]# mv httpd.conf httpd.conf.bak1
[root@node1 conf]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@node1 httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@node1 httpd-2.4.25]# make -j2 && make install

(2)配置mod_expires模块启用

[root@node1 httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@node1 conf]# ls
extra       httpd.conf.bak   magic       original
httpd.conf  httpd.conf.bak1  mime.types
[root@node1 conf]# vim httpd.conf
Listen 192.168.161.12:80    //52行
LoadModule expires_module modules/mod_expires.so    //113行
ServerName www.aaa.com:80    //201行
...添加的内容...
<IfModule mod_expires.c>ExpiresActive On    //打开网页缓存功能ExpiresDefault "access plus 60 seconds"    //设置缓存60秒
</IfModule>

(3)检查安装情况,启动服务

[root@node1 conf]# apachectl -t    //检查配置文件是都出现错误
Syntax OK
[root@node1 conf]# apachectl -t -D DUMP_MODULES | grep "expires"    //检查模块是否安装成功expires_module (shared)
[root@node1 conf]# systemctl restart httpd.service     //重启服务

(4)测试缓存是否生效

 

1.3 隐藏版本信息

        一般情况下,软件的漏洞信息和特定版本是相关的。因此,软件的版本号对攻击者来说是很有价值的,在浏览器中选择“查看元素 ” 可以看到 Apache 的版本 2.4.25

1. 配置Apache隐藏版本信息

[root@node1 ~]# cd /usr/local/httpd/conf/
[root@node1 conf]# vim httpd.conf
Include conf/extra/httpd-default.conf    //493行取消注释
...修改extra/httpd-default.conf配置文件...
[root@node1 conf]# vim extra/httpd-default.conf
ServerTokens Prod    //55行将原本的Full改为Prod,只显示名称,没有版本
[root@node1 conf]# systemctl restart httpd.service    //重启服务

ServerTokens表示 Server回送给客户端的响应头域是否包含关于服务器OS类型和编译过的模块描述信息

浏览器访问http://192.168.161.12查看Server选项

1.4 Apache防盗链

        Apache 的默认配置除了性能可以优化外,还需要对安全性进行相应的配置。默认配置能保证服务器正常提供服务,但 Apache 作为一个软件,必然也会存在一些漏洞,尽可能的降低潜在的风险,是管理员必须掌握的内容

        一般来说,用户浏览一个完整的页面并不是一次性全部传送到客户端的。如果所请求的页面带有图片或其他信息,那么第一个 HTTP 请求传送的是这个页面的文本,然后通过客户端的浏览器对这段文本进行解释执行。如果发现其中还有图片,那么客户端的浏览器会再第 10 页 共 17 页次发送一条 HTTP 请求,当这个请求被处理后这个图片文件才会被传送到客户端,最后浏览器会将图片安放到页面的正确位置,就这样一个完整的页面要经过多次发送 HTTP 请求才能够被完整的显示

        基于这样的机制,就会产生盗链问题:如果一个网站中没有其页面中所说图片信息,那么它完全可以链接到其他网站的图片信息上。这样,没有任何资源的网站利用了其他网站的资源来展示给浏览者,提高了自己的访问量,而大部分浏览者又不会很容易地发现。一些不良网站为了不增加成本而扩充自己站点内容,经常盗用其他网站的链接。一方面损害了原网站的合法利益,另一方面又加重了服务器的负担

         HTTP 标准协议中有专门的 Referer 字段记录,它的作用如下

  • 可以追溯上一个入站地址是什么
  • 对于资源文件,可以跟踪到包含显示它的网页地址是什么,因此所有防盗链方法都是基于这个 Referer 字段

1. 配置防盗链

        准备两台服务器、一台客户端,且两台服务器上已分别部署完 Apache 服务

(1)在 Windows 系统中访问 http://192.168.161.12和 http://192.168.161.13,确保 Apache 工作正常

2. 检查是否安装mod_rewriter模块

检查是否安装mod_rewrite模块

[root@node1 ~]# apachectl -t -D DUMP_MODULES | grep "rewrite"

如果没有安装mod_rewrite模块,重新编译安装 Apache 添加mod_rewrite模块

[root@node1 ~]# systemctl stop httpd.service 
[root@node1 ~]# cd /usr/local/httpd/conf/
[root@node1 conf]# mv httpd.conf httpd.conf.bak2
[root@node1 conf]# yum -y install gcc gcc-c++ pcre pcre-devel zlib-devel
[root@node1 conf]# cd /usr/src/httpd-2.4.25/
[root@node1 httpd-2.4.25]# ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi --enable-deflate --enable-expires
[root@node1 httpd-2.4.25]# make -j2 && make install

配置mod_rewrite模块启用

[root@node1 httpd-2.4.25]# cd /usr/local/httpd/conf/
[root@node1 conf]# vim httpd.conf
LoadModule rewrite_module modules/mod_rewrite.so    //159行取消注释
226 <Directory "/usr/local/httpd/htdocs">
227     #
228     # Possible values for the Options directive are "None", "All",
229     # or any combination of:
231     #
232     # Note that "MultiViews" must be named *explicitly* --- "Options All"
233     # doesn't give it to you.
234     #
236     # http://httpd.apache.org/docs/2.4/mod/core.html#options
240 
241     #
242     # AllowOverride controls what directives may be placed in .htaccess f    iles.
243     # It can be "All", "None", or any combination of the keywords:
244     #   AllowOverride FileInfo AuthConfig Limit
245     #
246     AllowOverride None
247 
248     #
249     # Controls who can get stuff from this server.
250     #
251     Require all granted
252     RewriteEngine On
253     RewriteCond %{HTTP_REFERER} !^http://aaa.com/.*$ [NC]
254     RewriteCond %{HTTP_REFERER} !^http://aaa.com$ [NC]
255     RewriteCond %{HTTP_REFERER} !^http://www.aaa.com/.*$ [NC]
256     RewriteCond %{HTTP_REFERER} !^http://www.aaa.com/$ [NC]
257     RewriteRule .*\.(gif|jpg|swf)$ http://www.aaa.com/error.jpg
258 </Directory>

RewriteCond %{HTTP_REFERER} !^http://www.abc.com/.*$ [NC] 的字段含义:

        %{HTTP_REFERER} :存放一个链接的 URL,表示从哪个链接中转访问目录下的静态资源。

  !^”:表示不以后面的字符串开头

  http://www.abc.com”:是本网站的路径,按整个字符串匹配

  .*$”:表示以任意字符结尾

  [NC] :表示不区分大小写字母

RewriteRule .*\.(gif|jpg|swf)$ http://www.abc.com/error.png 的字段含义:

         :表示匹配一个字符。

  *”:表示匹配 0 到多个字符,与.合起来的意思是匹配 0 到多次前面的任意字符,如果是 1 到多次匹配可以用+表示。

  “\.”:在这里的\是转义符,\.就代表符号.的意思。因为.在指令中是属于规则字符,有相应的含义, 如果需要匹配,需要在前面加个转义符\,其它规则字符如果需要匹配,也做同样处理。

  (gif|jpg|swf)$ :表示匹配gif、jpg、swf任意一个,$表示结束。最后的规则是以.gif、.jpg、.swf结尾, 前面是1到多个字符的字符串,也就是匹配图片类型的文件。

  http://www.abc.com/error.png :表示转发到这个路径

整个配置的含义是 使用本网站以外的网站域名 访问本站的图片文件时,显示error.png 这个图片

3. 网页准备

web源主机配置

[root@node1 htdocs]# cat index.html 
<html><body><h1>www.aaa.com</h1><img src="aaa.jpg"/></body>
</html>
[root@node1 htdocs]#

盗链网站主机配置

[root@node2 htdocs]# cat index.html 
<html><body><h1>www.bbb.com</h1><img src="http://192.168.161.12/aaa.jpg"/></body>
</html>
[root@node2 htdocs]#

在盗图网站主机上进行浏览器验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/597432.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

项目初始化脚手架搭建

项目初始化脚手架搭建 仓库地址 easy-web: 一个快速初始化SpringBoot项目的脚手架 (gitee.com) 目前这个项目还是个单体项目&#xff0c;后续笔者有时间可能会改造成父子工程项目&#xff0c;将通用模块抽象出来&#xff0c;有兴趣的小伙伴也可以自行 CV 改造。 1、项目初始化…

【重点】【BFS】542.01矩阵

题目 法1&#xff1a;经典BFS 下图中就展示了我们方法&#xff1a; class Solution {public int[][] updateMatrix(int[][] mat) {int m mat.length, n mat[0].length;int[][] dist new int[m][n];boolean[][] used new boolean[m][n];Queue<int[]> queue new Li…

Spring Boot 3 集成 Thymeleaf

在现代的Web开发中&#xff0c;构建灵活、动态的用户界面是至关重要的。Spring Boot和Thymeleaf的结合为开发者提供了一种简单而强大的方式来创建动态的Web应用。本文将介绍如何在Spring Boot项目中集成Thymeleaf&#xff0c;并展示一些基本的使用方法。 什么是Thymeleaf&#…

未来已来,Ai原生应用与人高度结合!学习就在现在?

原生应用&#xff1a;OpenAI™ChatGPT、Baidu.Inc™文心一言 也可以体验CSDN的INSCODE AI&#xff0c;集成多个国内GPT内容。 文章目录 前言----编程语言的未来&#xff1f;一、编程语言的教育1.1 学校所见所闻1.2 开启我们的Ai行程~io&#xff01;1.3 Ai结果评论 二、Ai编程教…

Linux环境vscode clang-format格式化:vscode clang format command is not available

问题现象 vscode安装了clang-format插件&#xff0c;但是使用就报错 问题原因 设置中配置的clang-format插件工具路径不正确。 解决方案 确认本地安装了clang-format工具&#xff1a;终端输入clang-format&#xff08;也可能是clang-format-13等版本&#xff0c;建议tab自…

[NISACTF 2022]popchains

[NISACTF 2022]popchains wp 题目代码&#xff1a; Happy New Year~ MAKE A WISH <?phpecho Happy New Year~ MAKE A WISH<br>;if(isset($_GET[wish])){unserialize($_GET[wish]); } else{$anew Road_is_Long;highlight_file(__FILE__); } /**********************…

AI实景无人直播创业项目:开启自动直播新时代,一部手机即可实现增长

在当今社会&#xff0c;直播已经成为了人们日常生活中不可或缺的一部分。无论是商家推广产品、明星互动粉丝还是普通人分享生活&#xff0c;直播已经渗透到了各行各业。然而&#xff0c;传统直播方式存在着一些不足之处&#xff0c;如需现场主持人操作、高昂的费用等。近年来&a…

Android Studio 报错Failed to find Build Tools revision 28.0.3

目录 前言 一、报错信息 二、报错原因 三、解决方案 四、更多资源 前言 当Android Studio报错提示"Failed to find Build Tools revision 28.0.3"时&#xff0c;通常意味着您的项目需要使用28.0.3版本的构建工具&#xff0c;但系统中并没有找到对应的版本。这可…

西电期末1020.寻找同数

一.题目 二.分析与思路 其实就是寻找字串的个数&#xff0c;以前好像是有类似的题&#xff0c;先找到子串的首字符&#xff0c;再判断 三.代码实现 #include<bits/stdc.h>//万能头 bool f(char* s,char* sub,int i,int l){for(int j0;j<l;j){if(s[ji]!sub[j])retu…

计算机组成原理复习

一、计算机系统概论 计算机由硬件和软件两大部分组成 软件分系统软件和应用软件翻译程序有两种&#xff1a;编译程序和解释程序冯诺依曼计算机的特点&#xff1a; 计算机由运算器、存储器、控制器、输入设备和输出设备五大部分组成。指令和数据以同等地位存放于存储器内&#…

如何成为ChatGPT 优质Prompt创作者

如何提问&#xff1f; 我想让你成为我的Prompt创作者。你的目标是帮助我创作最佳的Prompt&#xff0c;这个Prompt将由你ChatGPT使用。你将遵循 以下过程&#xff1a;1.首先&#xff0c;你会问我Prompt是关于什么&#xff1f;我会告诉你&#xff0c;但我们需要 通过不断的重复来…

brew 安装使用 mysql、redis、mongodb

在 Mac 生态中 brew 真是个万能神器&#xff0c;今天就来介绍一下怎么使用 brew 安装 mysql、redis、mongodb&#xff0c;以及如何使用 brew 启动、关闭、重启这些服务。 前言 brew 常用命令 # 查看brew的版本 brew -v# 更新homebrew自己&#xff0c;把所有的Formula目录更新…

索引类型-哈希索引

一. 前言 前面我们简单介绍了数据库的B-Tree索引&#xff0c;下面我们介绍另一种索引类型-哈希索引。 二. 哈希索引的简介 哈希索引(hash index) 基于哈希表实现&#xff0c;只有精确匹配索引所有列的查询才有效。对于每一行数据&#xff0c;存储引擎都会对所有索引列计算一个…

华为 1+X《网络系统建设与运维(初级)》 认证实验上机模拟试题

华为 1X《网络系统建设与运维&#xff08;初级&#xff09;》认证实验上机模拟试题 一、考试背景二、考试说明2.1考试分数说明2.2考试要求2.3考试环境介绍2.4启动考试环境2.5保存答案 三、考试正文3.1考试内容3.1.1任务 1&#xff1a;设备连接3.1.2任务 2&#xff1a;设备命名3…

Centos7静态网络配置

在vmware中打开&#xff0c; 点击虚拟网络编辑器&#xff0c;修改以下配置 网关IP最后一位固定为2&#xff0c;这个160根据下图中vmnet8的ip地址来的 打开网络控制面板>打开vmnet8查看 接着打开linux&#xff0c;有桌面版的使用桌面版更加方便 箭头这么乱&#xff0c;但是你…

【数据结构】二叉树(二)——顺序结构

前言 本篇博客讲解数组实现二叉树的顺序结构 文章目录 一、二叉树的顺序结构及实现1.1 二叉树的顺序结构1.2 堆的概念1.3 堆的实现1.3.1 初始化堆1.3.2 向堆中插入元素1.3.3 从堆顶删除1.3.4 其他操作1.3.5 完整代码Heap.hHeap.c 1.4 堆的应用1.4.1 堆排序1.4.2 TOP-K问题 一、…

web服务器nginx和Apache有什么区别?

随着互联网的快速发展&#xff0c;Web服务器在互联网应用中扮演着越来越重要的角色。其中&#xff0c;Nginx和Apache是两种广泛使用的Web服务器软件。尽管它们都可以实现Web服务器的功能&#xff0c;但Nginx和Apache在许多方面存在一些重要的区别。本文将探讨Nginx和Apache之间…

大数据技术在民生资金专项审计中的应用

一、应用背景 目前&#xff0c;针对审计行业&#xff0c;关于大数据技术的相关研究与应用一般包括大数据智能采集数据技术、大数据智能分析技术、大数据可视化分析技术以及大数据多数据源综合分析技术。其中&#xff0c;大数据智能采集数据技术是通过网络爬虫或者WebService接…

Docker无法启动Postgresql容器

目录 问题描述解决问题 问题描述 拉取了一个Postgresql14.2的镜像&#xff0c;在docker run创建并运行容器之后使用docker ps发现容器没有跑起来&#xff0c;再次使用docker start也没跑起来。 docker run -d --name mypg -v psql-data:/var/lib/postgresql/data -e POSTGRES…

Python random模块(获取随机数)常用方法和使用例子

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 random.random random.random()用于生成一个0到1的随机符点数: 0 < n < 1.0 random.uniform random.uniform(a, b)&#xff0c;用于生成一个指定范围内的随机符点数&#xff0c;两个参数其中一个是上限&#xff0c;一…