Aache 调优

隐藏 apache 版本信息

实验环境:
操作系统: CentOS 7.6
apache 版本:httpd-2.4.37
源码包编译安装位置: apache: /usr/local/apache2.4-xuegod
httpd-2.4.37 程序包下载地址:
https://mirrors.aliyun.com/apache/httpd/httpd-2.4.46.tar.gz
https://mirrors.aliyun.com/apache/httpd

模拟黑客根据查看出来版本号可以,查找漏洞:Apache/2.4.3 漏洞,所以我们必须隐藏版本号

源码编译安装 Apache

将 httpd-2.4.46.tar.gz 上传到 Linux 系统中

[root@centos60 ~]# wget https://mirrors.aliyun.com/apache/httpd/httpd-2.4.46.tar.gz

[root@centos60 ~]# tar zxvf httpd-2.4.46.tar.gz -C /usr/local/src/


要彻底将版本之类的信息进行改头换面,需要在编译之前修改源码包下 include/ap_release.h 文件
[root@centos60 ~]# vim /usr/local/src/httpd-2.4.46/include/ap_release.h

#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 #

改之前要做文档,以后可以查看

源码编译安装 Apache:

[root@centos60 ~]# yum install apr-util apr-util-devel apr apr-devel pcre pcre-devel zlib zlib-devel openssl openssl-devel gcc -y

[root@centos60 ~]# cd /usr/local/src/httpd-2.4.46/

[root@centos60 httpd-2.4.46]# ./configure --prefix=/usr/local/apache --enable-so --enable-rewrite --enable-ssl --enable-deflate --enable-expires --enable-mpms-shared=all

[root@centos60 httpd-2.4.46]# make -j 4 && make install

[root@centos60 httpd-2.4.46]#

配置 apache 可以开机启动并且可以使用 service 命令启动 apache 服务器

[root@centos60 apache]# ln -s /usr/local/apache/bin/apachectl /usr/sbin/apache        #创建软连接快捷方式

[root@centos60 httpd-2.4.46]# cd /usr/local/apache

[root@centos60 apache]# cp /usr/local/apache/bin/apachectl /etc/init.d/apachectl

[root@centos60 apache]# chmod +x !$

[root@centos60 apache]# service apachectl start

[root@centos60 apache]# /etc/init.d/apachectl start

[root@centos60 apache]# vim conf/httpd.conf

生产环境写真实域名

测试:隐藏 Apache 版本信息

[root@centos60 apache]# curl -I 192.168.0.60
HTTP/1.1 200 OK
Date: Thu, 12 Nov 2020 06:29:34 GMT
Server: xws/8.1.2-dev (Unix)
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

再次隐藏系统类型和模块的版本号

[root@centos60 apache]# vim conf/httpd.conf

[root@centos60 apache]# vim conf/extra/httpd-default.conf

55 ServerTokens Full
55 ServerTokens Prod         #不显示服务器操作系统类型

65 ServerSignature Off      #显示 web 服务器版本号和模块版本。现在默认值就是 Off 了,不用改了,在 apache2.4 之前的版本,默认值是 On,需要改成 Off 

保存退出

[root@centos60 apache]# /etc/init.d/apachectl graceful      #graceful 平滑重启,不中断apache未完成的业务和连接,重新加载配置文件 ,reload 是 nginx,这里不能使用
[root@centos60 apache]# /etc/init.d/apachectl restart       #会中断apache未完成的业务和连接,重启服务

[root@centos60 apache]# curl -I 192.168.0.60
HTTP/1.1 200 OK
Date: Thu, 12 Nov 2020 06:42:05 GMT
Server: xws
Last-Modified: Mon, 11 Jun 2007 18:53:14 GMT
ETag: "2d-432a5e4a73a80"
Accept-Ranges: bytes
Content-Length: 45
Content-Type: text/html

如果你的 4 核心的 cpu,你可以运行 400%

实战经验: 公司 mysql 数据库经常使用 CPU 达到 230%,正常吗? 服务器是 4 核的。
答:使用 cpu 达到 230%,还算正常。如果觉得不正常,可以使用以下思路进行排查
1、登陆 IDC 机房查看服务器流量图,流量正常,排除故障与流量无关。
2、为了快速解决问题,可以先直接重启 mysql 服务后,再查 sysql 进程 CPU 使用率依旧高居不下。
3.登陆 mysql 数据库,执行 show processlist;查看当前正在执行的 sql 语句,发现几个表出现
“sending data”状态,sql 执行时间过长。
4、通知开发人员检查这几个表有没有增加索引,让开发查看一下。
5、 在 mysql 配置文件 my.cnf 中增加以下参数:tmp_table_size = 300M 和
query_cache_size = 1024M 希望通过增加临时表及查询缓存大小来解决问题,增加这两个参数后,发
现 CPU 占用率有所下降,有一定效果,但还是超过 100%。网站打开依旧缓慢。
6、继续登陆 mysql,执行 show index from tablename,查询出现“sending data”的几个表,发
现果然没有增加索引。
7、执行增加索引的语句,把出现“sending data”的几个表全部加上索引。
ALTER TABLE table_name ADD INDEX index_name (column_list) #增加普通索引
ALTER TABLE table_name ADD UNIQUE (column_list) #增加唯一性索引
ALTER TABLE table_name ADD PRIMARY KEY (column_list) #增加主键索引
注:Primary key 和 UNIQUE KEY 区别
1,Primary key 的 1 个或多个列必须为 NOT NULL,如果列为 NULL,在增加 PRIMARY KEY 时,
列自动更改为 NOT NULL。而 UNIQUE KEY 对列没有此要求
2,一个表只能有一个 PRIMARY KEY,但可以有多个 UNIQUE KEY
总结:重启 mysql 服务后,mysql 进程的 CPU 占用率恢复正常,网站正常登陆,至此故障得到解决。
通知同事验证。后期工作中,可以和开发人员说一下,需要大量查询的表中一定要加索引。

设置 Apache 开机启动

[root@centos60 apache]# vim /etc/init.d/apachectl

#!/bin/sh
# chkconfig:2345 64 36
# description:apache

设置开机自动启动:

[root@centos60 apache]# chkconfig --add apachectl
[root@centos60 apache]# chkconfig --list apachectl

[root@centos60 ~]# reboot
[root@centos60 ~]# ps aux |  grep httpd
root       6330  0.0  0.2  76996  2340 ?        Ss   15:07   0:00 /usr/local/apache/bin/httpd -k start
apache     6331  0.0  0.4 365960  4248 ?        Sl   15:07   0:00 /usr/local/apache/bin/httpd -k start
apache     6332  0.0  0.4 365960  4244 ?        Sl   15:07   0:00 /usr/local/apache/bin/httpd -k start
apache     6333  0.0  0.4 431496  4248 ?        Sl   15:07   0:00 /usr/local/apache/bin/httpd -k start

修改运行 apache 的默认用户

我们通过更改 apache 的默认用户,可以提升 apache 的安全性。这样,即使 apache 服务被攻破,黑客拿到 apache 普通用户也不会对系统和其他应用造成破坏。这里创建的 apache 用户,将用于对子进程和线程的控制。

[root@centos60 apache]# cat /etc/passwd | grep apache

默认使用 daemon 用户是安全的,也可以修改成其他用户。
[root@centos60 apache]# ps aux | grep httpd
root      24776  0.0  0.2  76996  2928 ?        Ss   14:28   0:00 /usr/local/apache/bin/httpd -k start
daemon    24900  0.0  0.4 431496  4740 ?        Sl   14:41   0:00 /usr/local/apache/bin/httpd -k start
daemon    24901  0.0  0.4 431496  4228 ?        Sl   14:41   0:00 /usr/local/apache/bin/httpd -k start
daemon    24902  0.0  0.4 431496  4228 ?        Sl   14:41   0:00 /usr/local/apache/bin/httpd -k start

[root@centos60 apache]# useradd -M -s /sbin/nologin apache
[root@centos60 apache]# cat /etc/passwd | grep apache
apache:x:1000:1000::/home/apache:/sbin/nologin

编辑 Apache 配置文件,修改默认的用户:

[root@centos60 apache]# vim /usr/local/apache/conf/httpd.conf

 

Apache 目录及文件权限设置

在生产环境的网站架构中,我们应把资源文件的权限合理的配置好,但不能给 777 权限。
用户上传的图片及附件等和程序做好分离。这样才能更方便我们做好授权,保证 apache 服务和整个服务器安全。

[root@centos60 apache]# chown apache.apache /usr/local/apache/htdocs/ -R

保护 Apache 日志、设置好 Apache 日志文件权限

对日志的授权,我们要将属主和属组都设置为 root:

 

[root@centos60 apache]# ll /usr/local/apache/logs/
总用量 12
-rw-r--r-- 1 root root 1148 11月 12 15:25 access_log
-rw-r--r-- 1 root root 2802 11月 12 15:07 error_log
-rw-r--r-- 1 root root    5 11月 12 15:07 httpd.pid

由于 Apache 日志的记录是由 Apache 的主进程进行操作的,而 Apache 的主进程又是 root 用户启动的,所以这样不影响日志的输出。这也是日志记录的最安全的方法。

其他用户有读权限,如果是组用阿里空间,不希望读取,可以取消其他用户读权限,或者删除agent监控插件

使用 Cronolog 分割 Apache 日志

apache 服务器,默认日志文件是不分割的,一个整文件既不易于管理,也不易于分析统计,且文件变大,硬盘占满,连ssh都无法登录。本文主要讲解 Web 服务器日志切割工具 cronolog。cronolog 是一个简单的过滤程序,读取日志文件条目从标准输入和输出的每个条目并写入指定的日志文件的文件名模板和当前的日期和时间。 当扩展文件名的变化,目前的文件是关闭,新开辟的。 cronolog 旨在和一个 Web 服务器一起使用,如 Apache,分割访问日志为每天或每月的日志,写脚本分割日志,按天打包,压缩,同步到另一个磁盘,写脚本定时删除30天的压缩包等。

[root@centos60 ~]# yum -y install epel-release
[root@centos60 ~]# yum -y install cronolog

[root@centos60 ~]# vim /usr/local/apache/conf/httpd.conf

305     CustomLog "|/usr/sbin/cronolog /usr/local/apache/logs/access_web1_%Y%m%d.log" combined                           #这里web1可以是oa,epr,等等用来区分多个web服务的,combined 记录的比common详细
276 ErrorLog "|/usr/sbin/cronolog /usr/local/apache/logs/error_web1_%Y%m%d.log"


按天轮询(生产环境常见用法,推荐使用):
CustomLog "|/usr/local/sbin/cronolog /app/logs/access_www_%Y%m%d.log" combined
按小时轮询(生产环境较常见用法):
CustomLog "|/usr/local/sbin/cronolog /app/logs /access_www_ %Y%m%d%H.log" combined

[root@centos60 logs]# /etc/init.d/apachectl restart
[root@centos60 logs]# ls
access_log  access_web1_20201112.log  error_log  error_web1_20201112.log  httpd.pid
[root@centos60 logs]# tail -f access_web1_20201112.log 
192.168.0.9 - - [12/Nov/2020:15:53:36 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
192.168.0.9 - - [12/Nov/2020:15:54:04 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
192.168.0.9 - - [12/Nov/2020:15:54:05 +0800] "GET / HTTP/1.1" 304 - "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"
 

设置错误页面-开启压缩和缓存功能

[root@centos60 apache]# vim /usr/local/apache/conf/httpd.conf

DocumentRoot "/usr/local/apache/htdocs"
<Directory "/usr/local/apache/htdocs">

ErrorDocument 404 /404.html

将 404 错误跳转到/usr/local/apache/htdocs 下的 404.html 页面上
[root@centos60 apache]# echo "404 go to home" > /usr/local/apache/htdocs/404.html

[root@centos60 apache]# /etc/init.d/apachectl graceful

输入一个不存在的页面,会重定向到404.html

第二种方法:遇到 404 错误后,直接跳转到一个 http 链接上

[root@centos60 apache]# vim /usr/local/apache/conf/httpd.conf

DocumentRoot "/usr/local/apache/htdocs"
<Directory "/usr/local/apache/htdocs">
ErrorDocument 404 http://www.baidu.com

[root@centos60 apache]# /etc/init.d/apachectl graceful

ErrorDocument 错误代码 跳转到的页面或文件

另外这里需要注意,你若设置跳转到文件,必须要有这个文件才行。另外文件必须在站点目录内,不然会报错。
在跳转到文件的测试中,使用别名路径进行测试,当把 404 错误页面跳转文件放到其他目录的时候,不报错,但是页面跳转不过去。所以要使用全路径。

启用压缩模块 mod_deflate

网站随着用户访问量的增加和内容量的增加,网站的带宽会不断的增加,随之就是网站成本的增加。并且当内容量增大的时候,客户端如果带宽小,就会影响用户的体验。因此从这两方面考虑,网站的某些内容必须经过压缩之后再传给用户,然后在用户客户端进行解压,来实现双方共赢的效果。

Apache 的压缩要用到 mod_deflate 模块,该模块提供了 DEFLATE 输出过滤器,允许服务器在将输出内容发送到客户端以前进行压缩,以节约带宽。它的核心思想就是把文件先在服务器进行压缩,然后再进行传输,这样可以显著减少文件传输的大小。当传输完毕后,客户端游览器会重新对压缩过的内容进行解压缩。如果没特殊情况的话,所有的文本内容都应该能被 gzip 压缩,例如:html(php),js,css,xml,txt 等。特殊情况就是像一些首页上有很多广告投放的 js 代码,由于需要每次加载进而进行来访信息统计,所以这些广告代码拥有者网站的 js 不会经过 gzip 压缩,

1、mod_deflate 模块检查及安装

[root@centos60 bin]# /usr/local/apache/bin/apachectl -M | grep deflate
[root@centos60 bin]#

#如果没有弹出任何内容,说明没有安装。

如果安装了,将弹出以下内容:

deflate_module (static) #弹出此种结果,则为编译安装时装的。
deflate_module (shared) #弹出此种结果,则为 DSO 方式安装的。

如果没有安装,下面为安装方法

a)编译时安装方法
编译的时候跟上--enable-deflate 即可实现安装

b)DSO 方式安装。
扩展:DSO: Dynamic shared object 动态共享对象 。DSO 模块可以在编译服务器之后编译,也可以用 Apache 扩展工具(apxs)编译并增加
使用 DSO 方式安装,/usr/local/apache/bin/apxs 后跟的参数详解
apxs是一个为Apache HTTP服务器编译和安装扩展模块的工具,用于编译一个或多个源程序或目标代码文件为动态共享对象,使之可以用由mod_so提供的LoadModule指令在运行时加载到Apache服务器中。
因此,要使用这个扩展机制,你的平台必须支持DSO特性,而且Apache httpd必须内建了mod_so模块。apxs工具能自动探测是否具备这样的条件,你也可以自己用这个命令手动探测:
[root@centos60 bin]# /etc/init.d/apachectl -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c

该命令的输出列表中应该mod_so模块。如果所有这些条件均已具备,则可以很容易地借助apxs安装你自己的DSO模块以扩展Apache服务器的功能。

-c 此选项表明需要执行编译操作。
-i 此选项表示需要执行安装操作,以安装一个或多个动态共享对象到服务器的 modules 目录。
-a 此选项自动增加一个 LoadModule 行到 httpd.conf 文件中,以激活此模块,或者,如果此行已经存在,则启用之。
-n 给模块起个名字

[root@centos60 ~]# cd /usr/local/src/httpd-2.4.46/modules/filters/

[root@centos60 modules]# cd /usr/local/apache/modules/

[root@centos60 filters]# /usr/local/apache/bin/apxs -c -i -a  mod_deflate.so   #以 dso 的方式编译安装到apache 中.

[root@centos60 modules]# ls /usr/local/apache/modules/mod_deflate.so      #如果有这个模块文件,直接配置文件启用就可以了,如果没有,需要用dso方式安装。

[root@centos60 filters]# /usr/local/apache/bin/apachectl -M | grep deflate  #查看是否安装了模块

[root@centos70 metadata]# /usr/local/apache/bin/apxs -cia /usr/local/src/httpd-2.4.37/modules/filters/mod_deflate.c
[root@centos70 metadata]# /etc/init.d/apache -M | grep deflate
 deflate_module (shared)

压缩模块配置

[root@centos60 apache]# vim /usr/local/apache/conf/httpd.conf

<IfModule mod_deflate.c>
DeflateCompressionLevel 9
SetOutputFilter DEFLATE
DeflateFilterNote Input instream
DeflateFilterNote Output outstream
DeflateFilterNote Ratio ratio
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/javascript
</IfModule>

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 #声明日志类型
#CustomLog logs/deflate_log.log deflate #声明日志类型
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css
application/javascript #仅压缩,限制特定的 MIME 类型文件

1、如果是虚拟主机,需要在<VirtualHost*:80></VirtualHost>中添加配置即可实现压缩
2、图片和视频本身就是压缩格式,一般不需要压缩的。有些小图片和视频压缩后还会变大。

[root@centos70 apache]# /usr/local/apache/bin/apachectl graceful

创建测试文件

[root@centos70 apache]# cp /etc/passwd /usr/local/apache/htdocs/passwd.html

打开该页面,打开浏览器yslow插件,查看

总结:我们在企业生产环境中时,在启用 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

mod_expires: 设置网页缓存时间

Expires 是通过 header 报文来指定特定类型的文件在游览器中的缓存时间的。平时,我们大多数的图片,flash 在发布之后都是不需要经常修改的,因此做了缓存之后,游览器第一次从服务器下载之后,就不需要再从服务器下载这些文件而是直接从游览器缓存中读取了。这样客户访问页面的速度就会大大加快,企业的带宽压力也得到了缓解。

mod_expires 模块检查及安装

[root@centos70 apache]# /etc/init.d/apache -M | grep expires
[root@centos70 apache]# 
expires_module (static) #此种结果为编译安装时装的
expires_module (shared) #此种结果为 DSO 方式安装的

a)编译方式安装
编译的时候跟上--enable-expires 即可实现安装

b)DSO 方式安装
[root@centos70 apache]# cd /usr/local/src/httpd-2.4.37/modules/metadata/ #切到 apache 源码包 mod_expires 所在的目录下
[root@centos70 metadata]# ls mod_expires.c
mod_expires.c

#以 dso 的方式编译安装到 apache 中
[root@centos70 metadata]# /usr/local/apache/bin/apxs -cia /usr/local/src/httpd-2.4.37/modules/metadata/mod_expires.c

[root@centos70 metadata]# /etc/init.d/apache -M | grep expires
 expires_module (shared)

配置缓存参数

[root@centos70 conf]# vim httpd.conf

缓存的用法有 3 种,分别问对全局,对目录,对虚拟主机。
1、对全局生效

<IfModule mod_expires.c>
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"
</IfModule>

重启服务:

[root@centos70 conf]# apache restart

2、对目录生效

对目录的配置就是在 apache 主配置文件中<Directory></Directory>标签内,最后加入如下参数即可

3、对虚拟主机生效

对虚拟主机的配置就是在 Apache 的虚拟主机配置文件 httpd-vhost.conf 中添加如下参数即可

[root@centos70 conf]# cd /usr/local/apache/conf/extra/
[root@centos70 conf]# vim httpd-vhosts.conf

<VirtualHost *:80>
ServerAdmin centos70
DocumentRoot "/usr/local/apache/htdocs"
ServerName centos70
ServerAlias centos70
CustomLog "|/usr/sbin/cronolog /usr/local/apache/logs/access_web2_%Y%m%d.log" combined
ErrorLog "|usr/sbin/cronolog /usr/local/apache/logs/error_web2_%Y%m%d.log"
<IfModule mod_expires.c>
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"
</IfModule>
</VirtualHost>

[root@centos70 conf]# vim httpd.conf

 

vim httd-vhosts.conf
    这里注意/usr/local/apache/htdocs/ 千万不能带/ 结束

vim httpd.conf

主配置和虚拟机同端口下,目录冲突,把主配置这段注释掉,或者改虚拟机端口,就不用注释主配置DocumentRoot目录了。
如果改虚拟机目录与DocumentRoot不相同,也不用注释掉主配置DocumentRoot目录,改虚拟机目录后,虚拟机配置目录优先级比主配置DocumentRoot优先级高。

浏览器按F12查看

 

或使用浏览器插件yslow查看

例如:下面 3 个指令都表示文档默认的有效期是一个月
ExpiresDefault "access plus 1 month"
ExpiresDefault "access plus 4 weeks"
ExpiresDefault "access plus 30 days"

有效期可以通过增加“<num><type>”子句进一步调整
ExpiresByType text/html "access plus 1 month 15 days 2 hours"
ExpiresByType image/gif "modification plus 5 hours 3 minutes"

注意:如果你使用基于最后修改日期的设置,“Expires”头将不会被添加到那些并非来自于硬盘文件的内容,这是因为这些内容并不存在“最后修改时间”的属性。基准时刻可以是源文件的最后修改时刻或者客户端对源文件的访问时刻,至于使用那一个则由<code>
指定。“M”表示源文件的最后修改时刻,“A”表示客户端对源文件的访问时刻,需要注意的是<code>和 seconds 之间没有空格。
这两个基准的差别是很微妙的。如果使用“M”,所有当前缓存中的文档副本都将在同一时刻过期,这个可能对定期更新的 URL(比如位于同一位置的每周通告)很有好处。如果使用“A”,则每个客户端所得到的有效期是不一样的,这个可能对那些几乎不更新的图片很有好处,特别是对于一组都引用相同图片的相关文档。

如何解决被缓存文件及时更新这个问题呢?
第一种:缩短缓存时间例如:1 天,不彻底牺牲性能
第二种:对缓存的对象改名

开启长连接功能

Apache 的 keepalive 和 keepalivetimeout

打开长链接:
KeepAlive Off/On 保持连接,会减少三次握手,但是会消耗内存,是否打开,取决于单位时间内是否进行多次连接(三次握手),一个连接有多次请求的,建议打开长连接,并适当调整 KeepAliveTimeout 超时时间,

在 APACHE 的 httpd.conf 中,KeepAlive 指的是保持连接活跃,如果将 KeepAlive 设置为 On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。

KeepAlive 的连接活跃时间当然是受 KeepAliveTimeOut 超时限制的。如果第二次请求和第一次请求之间超过 KeepAliveTimeOut 的超时时间的话,第一次连接就会中断,再新建第二个连接。

所以,一般情况下,图片较多的网站应该把 KeepAlive 设为 On。但是 KeepAliveTimeOut 应该设置为多少秒就是一个值得讨论的问题了。这里就需要测试工程师的测试得出结论。

如果 KeepAliveTimeOut 设置的时间过短,例如设置为 1 秒,那么 APACHE 就会频繁的建立新连接,当然会耗费不少的资源;反过来,如果 KeepAliveTimeOut 设置的时间过长,例如设置为 300 秒,那么 APACHE 中肯定有很多无用的连接会占用服务器的资源,也不是一件好事。

所以,到底要把 KeepAliveTimeOut 设置为多少,要看网站的流量、服务器的配置而定。

[root@centos70 extra]# vim /usr/local/apache/conf/httpd.conf

[root@centos70 extra]# vim /usr/local/apache/conf/extra/httpd-default.conf

KeepAlive On

KeepAliveTimeout 30  (对页面发送的2次请求之间的间隔超过30秒,那么会新建立链接,如果两次请求间隔不超过30秒,则不会新建链接。)

考虑到我的网站上有不少的图片,所以将 KeepAlive 设为 On,一般的页面两次请求间隔不会超过 30 秒,所以这样设置,至尽运行状况良好。如果是艺术品网站, 需要看的时间长,那么就设置长一些。

MaxKeepAliveRequests 100

一个建立好的 Keep-Alive 连接,允许发送的请求的个数。一旦建立连接,要么就是个数达到了断开,要么就是等 KeepAliveTimeout 时间到了断开连接。

MaxKeepAliveRequests 指令限制了当启用 KeepAlive 时每个连接允许的请求数量。如果将此值设为"0",将不限制请求的数目。我们建议最好将此值设为一个比较大的值,以确保最优的服务器性能。"

这个数字的设置,必须考虑在一个时间段内,同一个用户访问你的服务会发多少请求。要结合KeepAliveTimeout 参数来考虑。

举个例子,用户需要间隔时间不大于 KeepAliveTimeout 的时间内,连续请求 10 个文件,那么这个参数就应该设置成 10,如果用户在连续时间里不断请求访问,则这个数值得设置得更多。否则就重新建立连接下载。一旦用户连续进行了 10 个请求后,并且这个用户肯定在完成这些请求后的 5 秒内不会再请求,甚至要在之后的很长时间后请求,那么这个 KeepAliveTimeout 时间就可以设置得很短,以便尽早断开这种用户,把资源让给其他用户。

10 Timeout 60
"TimeOut 指令用于设置 Apache 等待以下三种事件的时间长度:
1. 接受一个 GET 请求耗费的总时间。
2. POST 或 PUT 请求时,接受两个 TCP 包之间的时间。
3. 应答时 TCP 包传输中两个 ACK 包之间的时间。

比如:apache 需要把 jsp 文件传给后端 tomcat 服务器,而 tomcat 服务器关了,这时这个链接需要等待的超时时间,由 TimeOut 控制。但对于绝大多数情况来说仍是足够的

案例分析
假设 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。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值