03087bf40ad162d9c048a43811dfa9ec8a13cd74.jpg

1、基本配置

1)KeepAlive On/Off  

KeepAlive指的是保持连接活跃,换一句话说,如果将KeepAlive设置为On,那么来自同一客户端的请求就不需要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担。一般情况下,图片较多的网站应该把KeepAlive设为 On。 

2)KeepAlive TimeOut number 

如果第二次请求和第一次请求之间超过KeepAlive TimeOut的时间的话,第一次连接就会中断,再新建第二个连接。它的设置一般考虑图片或者JS等文件两次请求间隔,一般设置为3-5秒。

3)MaxKeepAlive Requests 100 

一次连接可以进行的HTTP 请求的最大请求次数。将其值设为0,将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。

4)Hostname Lookups on|off|double 

如果是使用on,那么只有进行一次反查,如果用double,那么进行反查之后还要进行一次正向解析,只有两次的结果互相符合才行,而off就是不进行域名验证。 如果为了安全,建议使用double;为了加快访问速度,建议使用off。域名查找开启这个会增加 apache的负担,减慢访问速度建议关闭 

5)timeout 5 

推荐 5 这个是 apache 接受请求或者发出相应的时间超过这个时间断开 注:以上配置项可在/usr/local/http/conf/extra/httpd-default.conf 设置并在 httpd.conf 文件中通过 include 选项引用

2、mpm优化

mpm有三个模式Prefork、Worker和Event模式

Prefork模式:

工作原理

非线程的模式,默认会开启5个子进程,每个子进程开1个线程等待用户的连接,而没有一个用户连接到http serverPrefork会在开启一个子进程。保持一直有5个空闲的子进程等待连接。该模式优点是稳定性很高,因为1个连接出现问题,只会影响其所连接的子进程,这样就只会断开这一个连接,不会影响到其他用户的连接。但相对的,一个连接就要占用一个进程,损失了并发连接的性能。

配置

StartServers     启动时开启的子进程数量

MinSpareServers    最小空闲的子进程数

MaxSpareServers    最大空闲的子进程数

MaxRequestWorkers   最大连接的客户数量,影响并发

MaxRequestsPerChild   子进程处理多少个请求后自动销毁,默认为0,永不销毁

Woker模式:

工作原理

多进程多线程的模式,默认会开启3个子进程,每个子进程默认产生25个线程,所以默认Worker模式最小空闲子进程的值默认就是3*25也就是75个。这样Worker模式从最开始就确定了在并发上要优于Perfork模式。Worker模式是在启动时开启了3个子进程,在每个子进程中会开启多个线程(根据设定的值而定),每个线程都可以处理用户请求,每个线程公用所属子进程的内存空间。这样的模式,会节省内存空间,能够具有更高的并发处理能力。但是,有利也有弊,如果一个连接出现问题,会导致所属子进程出现问题,那么这个子进程下的所有线程都会出现问题。也就是说一个连接出现问题,会导致多个连接的崩溃。

配置

StartServers     启动时开启的子进程数量

ThreadsPerChild       每个子进程产生的线程数量

MaxRequestWorkers   最大连接的客户数量,影响并发

MinSpareThreads    最小空闲数量的工作线程

MaxSpareThreads    最大空闲数量的工作线程

MaxConnectionsPerChild  子进程处理多少个请求后自动销毁,默认为0,永不销毁

Event 模式: 

这是Apache最新的工作模式,是 worker 模式的变种,它把服务进程从连接中分离出来,与worker 模式不同的是在于它解决了keep-alive 长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些 keep-alive 类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。event模式的缺点是不能很好的支持 https的访问(HTTP 认证相关的问题),所以在生产环境,Worker模式使用的依然多于Event模式。

操作

通过下面的命令可以查看到目前使用的mpm

[root@centos7a httpd-2.4.23]# httpd -V | grep -i mpm
Server MPM:     event

如果想要修改mpm,可以修改httpd.conf,找到这里讲想要开启的mpm对应的一行的注释去了,把原来的关闭即可

image.png

mpm的配置文件是在extra/httpd-mpm.conf,我们以worker为例做一下mpm的优化配置

image.png

完成配置我们重启加载apache配置

apachectl graceful

有上面的命令可以在httpd完成所有用户连接后重新加载配置,建议使用这个命令代替restart

3、deflate压缩(用以压缩用户请求页面)

默认deflate是没有开启的,如果想要开启需要在httpd.conf中找到下面的两行,取消注释

LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so

下面是我配置

<IfModule mod_deflate.c>
	DeflateCompressionLevel 9
	SetOutputFilter DEFLATE 
	AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript
	#application/x-httpd-php
	#AddOutputFilterByType DEFLATE image/*
	AddOutputFilterByType DEFLATE text/*
	AddOutputFilterByType DEFLATE application/ms* application/vnd*
	#application/postscript application/javascript application/x-javascript
	AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp
	SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary 
	SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
	SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary
	DeflateFilterNote Input input_info
	DeflateFilterNote Output output_info
	DeflateFilterNote Ratio ratio_info
	LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
	CustomLog logs/deflate_log.log deflate
</IfModule>

如果你在编译安装的时候没有加载deflate模块,在启动httpd时会报错,如下

[root@centos7a filters]# apachectl -t
httpd: Syntax error on line 104 of /usr/local/http/conf/httpd.conf: Cannot load modules/mod_deflate.so into server:/usr/local/http/modules/mod_deflate.so: undefined symbol: inflate

可以通过动态共享对象(DSO)加载。

首先你的服务器需要有zlib-devel

然后vim /usr/local/apr/bin/apr-1-config

将LDFLAGS=""更改为LDFLAGS="-lz"

在执行下面命令加载模块(注意我将httpd的源码包解压在/root目录下了)

cd /root/httpd-2.4.23/modules/filters/
/usr/local/http-2/bin/apxs -c -i -a mod_deflate.c

4、expires缓存(用户重复请求,可通过访问本地缓存以避免服务器反复处理这些请求)

同样需要找到httpd.conf,修改以开启

LoadModule expires_module modules/mod_expires.so

我的配置如下

<IfModule mod_expires.c>
	ExpiresActive On
	ExpiresByType text/css "now plus 1 month"
	ExpiresByType application/x-javascript "now plus 5 day"
	ExpiresByType image/jpeg "access plus 1 month"
	ExpiresByType image/gif "access plus 1 month"
	ExpiresByType image/bmp "access plus 1 month"
	ExpiresByType image/x-icon "access plus 1 month"
	ExpiresByType image/png "access plus 1 minute"
	ExpiresByType application/x-shockwave-flash "access plus 1 month"
	ExpiresDefault "now plus 0 minute"
</IfModule>

5、禁止遍历目录(当web上不存在索引页时,用户输入域名\IP直接访问,会显示网页根目录的目录树,通过下面的操作可避免此类情况的产生)

编辑主配置文件httpd.conf

将Options Indexes FollowSymLinks更改为Options FollowSymLinks

6、apache 隐藏版本信息(在回应报文中不显示服务器版本信息)

编辑主配置文件httpd.conf,取消下面一行注释即可。

Include conf/extra/httpd-default.conf

修改extra/httpd-default.conf

将ServerTokens Full改成ServerTokens Prod
将ServerSignature On改成ServerSignature off

这时候其实回应报文还是会显示出你的服务器是用Apache搭建的,如果想彻底解决这个烦恼的话,需要在编译安装的之前vim /root/httpd-2.4.23/include/ap_release.h(这里我是将httpd源码包解压在/root/下了)

#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 23 #补丁级别
#define AP_SERVER_DEVBUILD_BOOLEAN 0 #

注:可以随便改改,让别人不知道你的服务器版本信息

7、日志切割

方法1:apache自带的rotatelogs

编辑主配置文件httpd.conf

注释掉如下两行
#ErrorLog logs/error_log
#CustomLog logs/access_log common
然后添加如下两行
ErrorLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/error_%Y%m%d.log 86400"
CustomLog "|/usr/local/http-2.4.23/bin/rotatelogs -l logs/access_%Y%m%d.log 86400" combined

后面的86400的单位为秒,所以表示着日志切割的轮转日期为一天

方法2:第三方的cronolog

首先你需要cronolog的源码包cronolog-1.6.2.tar.gz,然后安装

tar zxf cronolog-1.6.2.tar.gz
cd cronolog-1.6.2/
./configure && make && make install

编辑主配置文件

同样注释掉如下两行
#ErrorLog logs/error_log
#CustomLog logs/access_log common
添加如下
ErrorLog "|/usr/local/sbin/cronolog logs/error-%Y%m%d.log"
CustomLog "|/usr/local/sbin/cronolog logs/access-%Y%m%d.log" combined

使用上面的配置,你的日志就是以后缀的最小单位/天为轮转,如果你想要以小时为轮转可以这么写

CustomLog "|/usr/local/sbin/cronolog logs /%Y%m%d/access_log.%H" combined

8、配置防盗链

方法1:使用rewrite模块做重定向

首先你开启你的rewrite模块,编辑httpd.conf,下面的行取消注释

LoadModule rewrite_module modules/mod_rewrite.so

配置

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://abcdef.com/.*$ [NC]#写你的域名
RewriteCond %{HTTP_REFERER} !^http://abcdef.com$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.abcdef.com/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.abcdef.com$ [NC]
RewriteRule .*\.(gif|jpg|swf)$http://www.abcdef.com/about/nolink.png[R,NC,L]#规则这里写了强制重定向到一个地方,给了一张图片。
##也可以将规则也成这样# RewriteRule RewriteRule .*\.(gif|jpg|png)$ - [F]#直接强制禁止,返回403状态

方法2:使用httpd的访问限制

编辑httpd.conf,找到你的资源的files配置位置,添加如下,注意版本问题,注意filesmatch是个闭合空间。

SetEnvIfNoCase Referer "^$" local_ref
SetEnvIfNoCase Referer "^http://www.abcdef.com/.*$" local_ref#填写自己的域名
SetEnvIfNoCase Referer "^http://abcdef.com/.*$"    local_ref
<filesmatch "\.(mp3|mp4|zip|rar|jpg|gif|png)">
如果是2.4以前的版本
Order Deny,Allow
Allow from env=local_ref
Deny from all
如果是2.4版本(就是我们现在使用的版本)
Require all denied
  Require env local_ref
</filesmatch>

这样的配置就只允许本地的链接了