一、基本配置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 server,Prefork会在开启一个子进程。保持一直有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对应的一行的注释去了,把原来的关闭便可
mpm的配置文件是在extra/httpd-mpm.conf,咱们以worker为例作一下mpm的优化配置
完成配置咱们重启加载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>
这样的配置就只容许本地的连接了