httpd2.4.23优化配置


一、基本配置javascript

1)KeepAlive On/Off  php

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

2)KeepAlive TimeOut number  html

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

3)MaxKeepAlive Requests 100  python

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

4)Hostname Lookups on|off|double apache

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

5)timeout 5 centos

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

二、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

三、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

四、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>

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

编辑主配置文件httpd.conf

将Options Indexes FollowSymLinks更改成Options FollowSymLinks

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

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

七、日志切割

方法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

八、配置防盗链

方法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>

这样的配置就只容许本地的连接了

相关文章
相关标签/搜索